Leave a Comment
Golang. Adding a json body to POST request in protofile
It could be a bit tricky, and I failed to find a good example for it.
my-api.proto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
service MyAPI { rpc UpdateItem (Update_Request) returns (Update_Response) { option (google.api.http) = { post: "/api/v5/item/{code}" body: "request_body" }; } } ... message Update_Request { string code = 1 [json_name = "code"]; int32 language_id = 2 [json_name = "language_id"]; Update_RequestBody request_body = 3 [json_name = "request_body"]; } message Update_RequestBody { optional Address address = 1 [json_name = "address"]; optional string update_time = 2 [json_name = "update_time", (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"2019-02-02T14:00:00+0100\""}]; } message Address { optional double latitude = 1 [json_name = "latitude"]; optional double longitude = 2 [json_name = "longitude"]; optional string formatted_customer_address = 3 [json_name = "formatted_customer_address", (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"Berlin Stallschreiberstrasse 10\""}]; optional string title = 4 [json_name = "title", (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"Home\""}]; } |
Optionally, you can add the following middleware to allow an empty request body from the client as any JSON is required by grpc-ecosystem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// POSTRequestBodyFixer is a middleware that fixes empty POST request body // as it is always expected to be a valid JSON by grpc-ecosystem. func POSTRequestBodyFixer(defaultBody string) httpmw.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodPost && r.Body != nil { body, err := ioutil.ReadAll(r.Body) if err != nil { errorhandler.HandleErrorResponse(err, w) return } // close the body since we override it with ioutil.NopCloser _ = r.Body.Close() responseBody := string(body) if responseBody == "" { responseBody = defaultBody } r.Body = io.NopCloser(strings.NewReader(responseBody)) } next.ServeHTTP(w, r) }) } } |
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.