mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-21 00:50:24 +01:00
Created Request Matching ProtoBuf (markdown)
83
Request-Matching-ProtoBuf.md
Normal file
83
Request-Matching-ProtoBuf.md
Normal file
@@ -0,0 +1,83 @@
|
||||
## ProtoBufMatcher (ProtoBufMatcher)
|
||||
Can be used to match a gRPC ProtoBuf message.
|
||||
|
||||
See also [mstack.nl blog: gRPC / ProtoBuf Support](https://mstack.nl/blogs/wiremock-net-grpc/).
|
||||
|
||||
### Proto Definition
|
||||
Define a Proto Definition file (greet.proto)
|
||||
|
||||
syntax = "proto3";
|
||||
``` proto
|
||||
syntax = "proto3";
|
||||
|
||||
package greet;
|
||||
|
||||
// The greeting service definition.
|
||||
service Greeter {
|
||||
// Sends a greeting
|
||||
rpc SayHello (HelloRequest) returns (HelloReply);
|
||||
}
|
||||
|
||||
// The request message containing the user's name.
|
||||
message HelloRequest {
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
// The response message containing the greetings
|
||||
message HelloReply {
|
||||
string message = 1;
|
||||
}
|
||||
```
|
||||
|
||||
#### C# option
|
||||
Start the WireMock.Net server and define the mapping for the Grpc call:
|
||||
```csharp
|
||||
// Read the 'greet.proto' ProtoDefinition file as text and store it in a variable
|
||||
var protoDefinitionText = File.ReadAllText(@"c:\grpc\greet.proto");
|
||||
|
||||
// Define an unique identifier for that ProtoDefinition to make it possible to refer
|
||||
// to that ProtoDefinition in the different mappings
|
||||
var protoDefinitionId = "GrpcGreet";
|
||||
|
||||
// Start the WireMockServer and enable HTTP/2 support
|
||||
var server = WireMockServer.Start(useHttp2: true);
|
||||
|
||||
server
|
||||
// Now call the new AddProtoDefinition method to register this identifier
|
||||
// and ProtoDefinition in WireMock.Net
|
||||
.AddProtoDefinition(protoDefinitionId, protoDefinitionText)
|
||||
|
||||
// Define the Request matching logic which means in this case:
|
||||
// - Match on HTTP POST
|
||||
// - Match when the client calls the SayHello method on the Greeter-service
|
||||
// - Use a JsonMatcher so that this request is only mapped when the name
|
||||
// equals "stef".
|
||||
.Given(Request.Create()
|
||||
.UsingPost()
|
||||
.WithPath("/grpc/greet.Greeter/SayHello")
|
||||
.WithBodyAsProtoBuf("greet.HelloRequest", new JsonMatcher(new { name = "stef" }))
|
||||
)
|
||||
|
||||
// Define that this mapping should use the specified protoDefinitionId for both
|
||||
// the Request and the Response
|
||||
.WithProtoDefinition(protoDefinitionId)
|
||||
|
||||
// Build a response which will:
|
||||
// - Return the correct Content-Type header and Grpc Trailing header
|
||||
// - Define the response as an anonymous object and use the Handlebars
|
||||
// Transformer to return a personalized message
|
||||
// - Return a ProtoBuf byte-array response using the HelloReply method
|
||||
.RespondWith(Response.Create()
|
||||
.WithHeader("Content-Type", "application/grpc")
|
||||
.WithTrailingHeader("grpc-status", "0")
|
||||
.WithBodyAsProtoBuf("greet.HelloReply",
|
||||
new
|
||||
{
|
||||
message = "hello {{request.BodyAsJson.name}} {{request.method}}"
|
||||
})
|
||||
.WithTransformer()
|
||||
);
|
||||
```
|
||||
|
||||
#### JSON Mapping option
|
||||
todo
|
||||
Reference in New Issue
Block a user