让 thrift 兼容原生 json 数据调用的解决方案 - 文章教程

让 thrift 兼容原生 json 数据调用的解决方案

发布于 2021-02-26 字数 1922 浏览 1147 评论 0

让 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 数据。

思路

  1. {“name”:”wxd”,”age”:19} 转为对应的 UserInfo 请求对象。
  2. 利用thrift 提供的 TServiceClient 调用 blntest 方法,这里只需将原来的远程调用修改一下,也就是修改不做远程调用,直接把流对接到服务端的输入输出流。
  3. 返回数据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 的内容,请您使用右上方搜索功能获取相关信息。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

2583 文章
29 评论
84935 人气
更多

推荐作者

佚名

文章 0 评论 0

cs163v

文章 0 评论 0

Mr Rock

文章 0 评论 0