iOS端thrift协议对接(踩坑一)

简介

       Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。(百度百科😁)

结构 (下面的协议,我们对接过程中会逐渐眼熟)

Thrift支持众多通讯协议:

TBinaryProtocol –一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试

TCompactProtocol –更紧凑的二进制格式,处理起来通常同样高效。

TDebugProtocol –一种人类可读的文本格式,用来协助调试。

TDenseProtocol –与TCompactProtocol类似,将传输数据的元信息剥离。

TJSONProtocol –使用JSON对数据编码。

TSimpleJSONProtocol –一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。

支持的传输协议有:

TFileTransport –该传输协议会写文件。

TFramedTransport –当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。

TMemoryTransport –使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)

TSocket –使用阻塞的套接字I/O来传输。

TZlibTransport –用zlib执行压缩。用于连接另一个传输协议。

Thrift还提供众多的服务器,包括:

TNonblockingServer –一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。

TSimpleServer –一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。

TThreadPoolServer –一个多线程服务器,它使用标准的阻塞I/O。

正文

一、参考资料:

https://wiki.apache.org/thrift/ThriftUsageObjectiveC#Sample_Download

https://blog.csdn.net/xiaofei125145/article/details/52241803

二、环境配置:(推荐使用brew安装)

1、版本搜索 


1

2、版本安装 


2

3、卸载thrift 


3

注意事项:

 1、客户端配置的thrift版本要求和服务端版本统一

 2、目前thrift版本为0.12.0支持swift语言,但是不太稳定(不清楚是不是使用问题)

 3、推荐使用thrift@0.9版本,swift项目需要桥接,OC可直接使用

三、对接流程

1、准备工作:

 (1)请先获取thrift协议文件,如下 


4

 (2)第二步打开终端, 进入存放thrift文件的文件夹中 


5

 (3)第三步我们需要把当前路径下的thrift文件转化成OC文件 


6

 (4)转化完成后会自动在当前路径下生成一个gen-cocoa文件夹,点开文件夹发现已经生成好的OC文件,我们只需要将文件拖入工程内,command + B编译,有错误进行修改。(迈向成功的第一步) 


7

注意事项:

1、转译后的OC文件可能存在头文件导入、引用等相关错误

2、导入多份协议后可能会出现重命名等问题,出现此类问题可以全局搜索,需要手动修改类名(如果项目存在大量协议,为避免这样的问题可以规范好协议的命名)


8

3、进入对应冲突类中比对,并修改。

9


2、项目接入 (这里以0.9.3版本为例)

(1)Github搜索thrift, 在branches中找到相应版本,并下载该版本资源包


10

找到资源包lib/cocoa路径下的src文件夹,将该文件夹拖入项目中。


11

(2)项目中找到我们之前通过thrift生成的OC文件(以user文件为例)


12

可以找到类似@protocol nyUserServ 以及nyUserServClient类


13

(3)初始化方法,我们需要和服务端使用的协议保持一致,初始化方法也有区别,图例:case1、case2分别为不同协议的初始化方法


14


15

声明一个server/myService的对象,并初始化

(4)示例中,我们通过一个按钮的点击事件触发登录的响应,在nyUserServ协议中有提供了2个和服务器通讯的方法,我们根据不同的场景选择不同的方法


16

我们以action方法为例,首先初始化一个request对象,可以在ny_user.h中找到


17

这里的参数,我们可以需要跟服务端沟通好,其中可能会涉及到各种数据的加密解密(aes/sha/md5等)
图例中的r_type一个接口类型枚举,r_data是登录序列化后的字符串


18


19

上图serialize方法中传入一个泛型,约束其遵守TBase协议,TBase协议提供序列化以及反序列化所需要的write/read方法


20

(5)和服务器响应成功后会,返回一个response对象,我们所需要的数据包含在response对象中,接下来我们需要对response对象中的数据进行反序列化,反序列化之后才是我们能直观显示的数据


21

deSerialize返回返回一个T的泛型对象,反序列化的时候需要传入一个初始化的模型对象。数据填充完成后,然后返回改对象。loginRespPkt也是通过thrift转化生成的业务类,并不需要我们重新去定义


22

以上就代表这我们完整的完成一次数据请求到数据返回以及解析的全过程。当然这个结果是一路踩坑才实现的结果,接下来我会逐一描述其中的大坑。


四、疑难杂症

(1)多重协议文件内容业务类重命的问题

        关于这个问题其实都是比较笨的方式,一协议命名规则约束,由于是跨平台的语言往往命名规则和个人习惯有很大区别,所以只能尽力去统一,二这是我们手动去修改了。

(2)数据加密解密问题(aes128/aes256等)

        关于这一块有2个问题:

        1、aes加密 iv偏移量需要前后端统一

        2、aes128和aes256加密key的长度问题,前后端的加密解密key值要保持一致

(3)数据编码问题

        1、编码问题,服务端返回的数据用utf8解码失败,用ASCII解码才成功,为了避免这样的问题,这里推荐数据的收发都通过data二进制数据交互序列化、反序列化直接通过data数据转化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354