图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注解
@Root(name = "AssetMaterialInfo", strict = false) @Namespace(reference = "http://tempuri.org/") public class RequestModel { @Element(name = "date", required = false) public String date; @Element(name = "page", required = false) public int page; }
RequestModel类中,Root注解用来指定节点名称,因为当前节点只有一个命名空间,因此使用Namespace注解而不是NamespaceList.Element注解指定子节点名称,因为当前节点有两个子节点,因此这个类有两个参数,且都被Element注解修饰.
到这里,关于请求体的实体类,就创建好了.下面我们准备响应体的实体类.
响应体实例
跟请求体类似,我们也是需要根据服务器响应的xml文件格式来创建实体类.
通过分析xml格式,我们也需要创建三个实体类来分别对应三个节点.它们的对应关系如下(类名 <—> 节点名):
-
AssetResponseEnvelope <—> soap:Envelope
-
AssetResponseBody <—> Body
-
AssetResponseModel <—> AssetMaterialInfoResponse
为了与系统类名区分开,我为这三个类名添加了Asset前缀.
@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 AssetResponseEnvelope { @Element(name = "Body", required = false) public AssetResponseBody responseBody; }
@Root(name = "Body", strict = false) public class AssetResponseBody { @Element(name = "AssetMaterialInfoResponse", required = false) public AssetResponseModel responseModel; }
JavaScript
-
js的基本类型有哪些?引用类型有哪些?null和undefined的区别。
-
如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)
-
Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?
-
JS常见的dom操作api
-
解释一下事件冒泡和事件捕获
-
事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?
-
对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?
-
this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?
-
call,apply,bind
-
显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链
-
创建对象的多种方式
-
实现继承的多种方式和优缺点
-
new 一个对象具体做了什么
-
手写Ajax,XMLHttpRequest
-
变量提升
-
举例说明一个匿名函数的典型用例
-
指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?
-
attribute和property的区别
-
document load和document DOMContentLoaded两个事件的区别
-
JS代码调试
-
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
S内置对象不是好的做法?有哪些内置对象和内置函数?
-
attribute和property的区别
-
document load和document DOMContentLoaded两个事件的区别
-
JS代码调试
-
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】