使用retrofit网络框架请求webservice接口(1)

图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内置对象不是好的做法?有哪些内置对象和内置函数?

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值