apache / apisix

The Cloud-Native API Gateway
https://apisix.apache.org/blog/
Apache License 2.0
13.96k stars 2.45k forks source link

help request: how to proxy http+pb #11260

Open snowleopard331 opened 1 month ago

snowleopard331 commented 1 month ago

Description

我想使用http+pb的方式进行请求,但是打开grpc-transcode插件后,无论json/pb都可以请求到,但是返回的始终是json,我的需求是返回pb。请求头中的accept也设置过,但是都没用,以下是我的路由配置:

{ "uri": "/HelloWorld", "name": "HelloWorld", "desc": "HelloWorld接口,测试连通性", "methods": [ "POST" ], "plugins": { "elasticsearch-logger": { "batch_max_size": 1000, "buffer_duration": 60, "endpoint_addr": "http://xxxxxxxxxx", "field": { "index": "apisixlog" }, "inactive_timeout": 5, "max_retry_count": 0, "name": "elasticsearch-logger", "retry_delay": 1, "ssl_verify": true, "timeout": 10 }, "grpc-transcode": { "_meta": { "disable": false }, "deadline": 0, "method": "HelloWorld", "pb_option": [ "enum_as_name", "int64_as_number", "no_default_values", "disable_hooks" ], "proto_id": "xxxxxxxxxxxx", "service": "xxxxxxxxxx", "show_status_in_body": false }, "jwt-auth": { "_meta": { "disable": true }, "cookie": "jwt", "header": "authorization", "hide_credentials": false, "query": "jwt" } }, "upstream": { "retries": 3, "timeout": { "connect": 6, "send": 6, "read": 6 }, "type": "chash", "hash_on": "header", "key": "USERID", "scheme": "grpc", "discovery_type": "nacos", "discovery_args": { "group_name": "xxxxxxxxx", "namespace_id": "xxxxxxxxxxxxx" }, "pass_host": "pass", "service_name": "providers:kiwi.domainServer.example::", "keepalive_pool": { "idle_timeout": 60, "requests": 1000, "size": 320 }, "retry_timeout": 1 }, "status": 1 }

Environment

kayx23 commented 1 month ago

grpc-transcode is for transcoding between regular HTTP requests and gRPC, so it is expected that the upstream response is returned in JSON.

It sounds like you are not looking for any transcoding but to have APISIX proxy for your request to gRPC upstream service, is that correct?

snowleopard331 commented 1 month ago

grpc-transcode is for transcoding between regular HTTP requests and gRPC, so it is expected that the upstream response is returned in JSON.

It sounds like you are not looking for any transcoding but to have APISIX proxy for your request to gRPC upstream service, is that correct?

At present, I am using APISIX to proxy my upstreams, and the client uses JSON as the HTTP body. Currently, grpc-transcode is enabled, so the client's input and output are both in JSON format. Now the client wants to use protobuf as the input and output, but I don't know how to configure it. I have tried some solutions, but none have been successful; using HTTP+PB requests, the upstream can receive and process them, but APISIX always returns JSON to the client. What I want is a route configuration that can return protobuf. Thanks

kayx23 commented 1 month ago

APISIX always returns JSON to the client. What I want is a route configuration that can return protobuf.

I'm not aware if APISIX can do this. @shreemaan-abhishek thoughts?

shreemaan-abhishek commented 1 month ago

no there is no such feature. do you mean to say that upstream returns PB but APISIX modifies it to JSON?

snowleopard331 commented 1 month ago

no there is no such feature. do you mean to say that upstream returns PB but APISIX modifies it to JSON?

No. All PB. No JSON. Do you know how to config APISIX route? Send PB and receive PB. Thank you.

shreemaan-abhishek commented 1 month ago

No. All PB. No JSON.

I meant to ask, does the upstream return JSON even when not using APISIX?

snowleopard331 commented 1 month ago

No. All PB. No JSON.

I meant to ask, does the upstream return JSON even when not using APISIX?

upstream return pb, protocol is grpc

shreemaan-abhishek commented 4 weeks ago

@snowleopard331, can you prepare a github gist/repo with a self contained example to reproduce this issue? I will take a look at this when I am free.