mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-23 09:18:55 +02: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