让 thrift 兼容原生 json 数据调用的解决方案
让 thrift 兼容原生 json 数据调用的部分解决方案 通常使用 thrift 时,服务端与客户端都依赖 thrift 提供的方法,有一些场景没办法直接引入thrift提供的文件,只能使用如 json 之类格式传输,可能导致之前的 thrift 接口需要修改来支持。
这里使用服务端采用 java 编写,与客户端也是采用了 thrift 协议调用,同时我做了一些封装来支持原生 json 调用。
先看看使用场景
struct UserInfo { 1: optional string name; 2: optional i32 age; } service Services{ UserInfo blntest(1:UserInfo ui) }
客户端调用 blntest 方法时需要能发送对应的 json 数据如: {"name":"wxd","age":19} ,服务端不修改原来的thrift实现,并能正常解析json数据调用blntest并返回 json 数据。
思路
- {"name":"wxd","age":19} 转为对应的 UserInfo 请求对象。
- 利用thrift 提供的 TServiceClient 调用 blntest 方法,这里只需将原来的远程调用修改一下,也就是修改不做远程调用,直接把流对接到服务端的输入输出流。
- 返回数据UserInfo转为json数据。
讲解
1 与 3 这一步相对简单,很多第三方 json 工具都能做到。 主要修改点在是第二点:在service生成的client类中,有send_*** 方法,如blntest方法,客户需要调用 send_blntest方法发送请求数据,所以获取send_***方法输出的数据, 作为服务端process的输入流数据。 service中有 ***__result类 用在process返回数据后读取返回的数据。
使用 curl 模拟客户端 json 请求
curl -l -H "method:blntest" -H "Content-Type: application/json" -X POST -d '{"hb":{"page":{"rowNumber":10,"lastFlagInt":0,"lastFlagInt2":0,"pageNumber":0}, "device":"ios20","platform":1,"version":"1.0","chl":"myapp"},"i":0} 'http://127.0.0.1:8081/apij2j.do
具体实现 demo 参考https://github.com/donnie4w/thriftjson
thriftjson 项目算是一个demo,为了方便测试,服务端采用 springboot。启动之后便可以 curl 模拟测试。
以上是让 thrift 兼容原生json数据调用的解决方案的内容,更多 原生 调用 兼容 解决方案 数据 thrift json 的内容,请您使用右上方搜索功能获取相关信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论