对象篇
模块化编程-自研模块加载器
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
这里,我使用的是火狐浏览器+RESTClient去调试http请求.
因为每个公司定义的格式可能会不一样.我们在封装以及分析数据的时候需要与之对应.所以我们去调试分析http请求.弄清每次请求及响应的格式.
关于soap,WebService以及http,各位前辈已经分析的很透彻了,这里我就不多说了,如果想了解的话,可以去看下前辈总结的文章.下面,咱们正式开始.
开工
==
RESTClient界面
在火狐浏览器中安装好RESTClient插件后,将其打开,界面应该会和图1类似,是空的,没有任何数据.为了方便分析,我又截取了图2,明显是一次成功请求后的界面,我先用图2分析下整个界面,然后再告诉你,这些数据都是怎么填上去的.
图1
在图2中,我把一次请求分为了两个部分,分别用绿线和蓝线框了起来.其中,绿线内是本次http请求发送的数据,也就是我们作为Android端需要封装的数据,蓝线内,就是本次请求服务端返回给我们的数据,也就是我们需要解析的数据.
我们先来分析下我们需要发送的数据,如图所示,我用红线标出了4个位置,它们分别表示什么意思呢?
-
Method: 表示这次请求的请求方式,一般常用的有get和post,这里当然选post(因为WebService就是post请求的一种)
-
URL: 表示这次请求的地址
-
Headers: 请求头
-
Body: 请求体
图2
调试http请求
介绍完了RESTClient的界面,下面就正式开始http调试.
所谓调试,无非就是模拟一次http请求,我们把需要发送给服务端的数据填到Request(图2绿线内)中,点击send按钮,然后Response(图2蓝线内)中显示服务端返回给我们的数据.我们就是分析这堆数据而已.那么问题来了,Request中的这些数据,是从哪来的?
我另外打开了一个浏览器页面,在地址栏中输入想要调试的地址,如图3所示,为了方便,我让服务端同事把服务器部署到我的电脑上了,所以看到的地址ip是192.168.191.1,
刚刚在地址栏输入的就是这次要调试的地址,因此,我把他填入到了RESTClient的URL中.
既然url确定了,那请求头(Headers)和请求体(Body)又该填什么呢?别急,接着往下看.
图3
这次我要调试的就是图3中红线内的接口.名为AssetMaterialInfo,点击这个接口,打开的界面如图4所示.图中有SOAP1.2请求和响应示例,红线标注的是占位符,在模拟数据的时候需要将其替换为真实数据.
而我们所需要的请求头(Headers)和请求体(Body)就藏在请求示例中.为了方便分析,我单独将请求示例截取了图片,放在下边,也就是图5.
图4
图5中,红线内这两行内容,就是请求头,蓝线内的就是请求体.请求体很简单,我们只需要将蓝线中内容复制到RESTClient界面的Body中,然后把占位符替换掉就可以了(如图2所示),请求头怎么弄呢?
图5
关于在RESTClient中添加请求头,我举一个例子(图6),大家就都明白了.
在RESTClient界面中,点击顶部Headers,再点击CustomHeader,会打开图7这个界面.
图6
在图7所示界面,Name栏中填入Content-Type,Value栏中填入text/xml; charset=utf-8,然后点击Okay,我们就将一个请求头添加到本次请求中了.
同理,将第二个请求头也添加进来.我就不再演示了.
图7
这样,我们就将本次请求需要携带的数据都添加进来了.点击SEND按钮,就完成了本次请求.
开始写Demo
拿到了http请求的数据,我们就可以根据数据去写我们的例子程序了,在我们Android端通过Retrofit使用post请求去访问刚刚我们调试的WebService接口.
首先,在看下边代码之前,你要保证自己已经基本了解了Retrofit框架.关于Retrofit不会介绍太多,因为它不是本篇文章的重点.
导包
compile'com.squareup.retrofit2:retrofit:2.0.1' compile('com.squareup.retrofit2:converter-simplexml:2.1.0') { exclude group:'xpp3',module:'xpp3' exclude group:'stax',module:'stax-api' exclude group:'stax',module:'stax' }
请求体实例
对应图2中Request的Body部分,需要写三个类来作为请求体.分别对应请求体中的三个节点
根据由外到内的层级关系,它们分别是(类名 <—> 节点名):
-
RequestEnvelope <—> soap:Envelope
-
RequestBody <—> soap:Body
-
RequestModel <—> AssetMaterialInfo
下面,我详细介绍下这三个类.
@Root(name = "soap:Envelope") @NamespaceList({ @Namespace(reference = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi"), @Namespace(reference = "http://www.w3.org/2001/XMLSchema", prefix = "xsd"), @Namespace(reference = "http://schemas.xmlsoap.org/soap/envelope/", prefix = "soap") }) public class RequestEnvelope { @Element(name = "soap:Body", required = false) public RequestBody body; }
RequestEnvelope类中,Root注解用来指定节点名称,NamespaceList用来指定多个命名空间,Element用来指定子节点名称.
@Root(name = "soap:Body", strict = false) public class RequestBody { @Element(name = "AssetMaterialInfo", required = false) public RequestModel AssetMaterialInfo; }
同理,RequestBody类中,Root注解用来指定节点名称,Element注解用来指定子节点名称,因为当前节点没有命名空间,因此不需要NamespaceList注解
最后
小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:
凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。
入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。
整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。
ce7d1f69b2002194d.png)
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。