HTTP

srpc支持HTTP协议,只要把idl的内容作填到HTTPbody中,并且在header里填上idl的类型(json/protobuf),就可以与其他框架通过HTTP协议互通,由此可以实现跨语言。

  • 启动SRPCHttpServer/TRPCHttpServer,可以接收由任何语言实现的HTTP client发过来的请求;

  • 启动SRPCHttpClient/TRPCHttpClient,也可以向任何语言实现的Http Server发送请求;

  • HTTP headerContent-Type设置为application/json表示json,application/x-protobuf表示protobuf;

  • HTTP body: 如果body中涉及bytes类型,json中需要使用base64进行encode;

在项目的README.md中,我们演示了如何使用curlSRPCHttpServer发送请求,下面我们给出例子演示如何使用python作为客户端,向TRPCHttpServer发送请求。

示例

proto文件:

  1. syntax="proto3"; // proto2 or proto3 are both supported
  2. package trpc.test.helloworld;
  3. message AddRequest {
  4. string message = 1;
  5. string name = 2;
  6. bytes info = 3;
  7. };
  8. message AddResponse {
  9. string message = 1;
  10. };
  11. service Batch {
  12. rpc Add(AddRequest) returns (AddResponse);
  13. };

python客户端:

  1. import json
  2. import requests
  3. from base64 import b64encode
  4. class Base64Encoder(json.JSONEncoder):
  5. def default(self, o):
  6. if isinstance(o, bytes):
  7. return b64encode(o).decode()
  8. return json.JSONEncoder.default(self, o)
  9. headers = {'Content-Type': 'application/json'}
  10. req = {
  11. 'message': 'hello',
  12. 'name': 'k',
  13. 'info': b'i am binary'
  14. }
  15. print(json.dumps(req, cls=Base64Encoder))
  16. ret = requests.post(url = "http://localhost:8800/trpc.test.helloworld.Batch/Add",
  17. headers = headers, data = json.dumps(req, cls=Base64Encoder))
  18. print(ret.json())

请求路径拼接

README.md中,我们可以看到,路径是由service名和rpc名拼接而成的。而对于以上带package名 package trpc.test.helloworld;的例子, package名也需要拼接到路径中,SRPCHttpTRPCHttpClient 的拼接路径方式并不一样。我们以curl为例子:

SRPCHttpServer互通:

  1. curl 127.0.0.1:8811/trpc/test/helloworld/Batch/Add -H 'Content-Type: application/json' -d '{...}'

TRPCHttpServer互通:

  1. curl 127.0.0.1:8811/trpc.test.helloworld.Batch/Add -H 'Content-Type: application/json' -d '{...}'