标签:
回头想想,上班之后就很少来写博客了,刚开始是忙,忙得睡觉都想着bug,到后来是堕落了,人一堕落很容易就会麻痹掉。过了个年,又长大了一岁,2015也得有个规划,好好收获点东西。
这几天上班接触了一些之前没怎么接触过的东西,在android客户端调用webservice接口进行数据的上传和下载。其实半年前自己就有着手过去学一下网络编程,但都是粗略地看了一下电子书,并没有真正折腾过这块,搞得现在真正用起来很吃力。。。现在总结下这几天痛的领悟:
问题一:刚开始接触到这份文档,下意识用传统的传参方法向服务器发起请求,结果请求是发上去了,验证没通过。还好后台的同事比较好说话,帮我断点逐步看才知道我没有将用户名和密码通过头部上传。。。xx多么低级的错误,结果找到了解决办法:
//soapheader在这里 Element[] header = new Element[1]; header[0] = new Element().createElement(NAMESPACE, "PfSoapHeader"); Element username = new Element().createElement(NAMESPACE, "UserName"); username.addChild(Node.TEXT,PublicMethod.LOGINNAME); header[0].addChild(Node.ELEMENT, username); Element pass = new Element().createElement(NAMESPACE, "PassWord"); pass.addChild(Node.TEXT,PublicMethod.LOGINPASSWORD); header[0].addChild(Node.ELEMENT, pass); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.headerOut = header; envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = true; envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(PublicMethod.URL); ht.call(SOAP_ACTION, envelope); // 获取返回的数据 SoapObject resultSoapObject = (SoapObject ) envelope.bodyIn;
其实也就是在请求信息中加入了header而已罢了...
问题二:测试接口是这么搞定了,到上传接口调试的时候也出了一个奇葩问题:通过httpTransportSE.call上传数据时,都出现http request failed http status:500 更诡异的是 有时候当天下午调通了 第二天上班就又不行了 周五调通了 下周一过来上班又不行了 XX 这是折磨人的节奏啊 接口的参数也很简单 看着都是string类型和int型:
后面那张异常图对我印象太深刻了,调一个接口 估计出现的次数都有上百次。更关键的是:返回了500,搞得我下意识地认为数据并没有上传到服务器,其实事实根本就不是这样的,数据都已经上传了的,只是在服务器的处理过程出现了问题,才导致返回500 丫的 这只是中间的现象 还有一个更底层的根源就是我在body传参数时候,有两个参数的格式有误,虽然接口给出的是string类型,但实际上服务器接受数据进行处理得时候使用的并不是string类型,瞬间就蹦了...稍微改一下参数类型,一切OK:
出错的地方是图片的base64参数和Time这两个参数,一个得以byte[]类型上传,另一个得以dateTime类型上传。丫的,搞得我一直以来都以string来搞。经验:当接口调试不通的时候,将所有参数都赋值为万能的null,如果请求成功,再将参数逐个加进来,逐个排除。与此同时,需要时刻和后台人员保持联系,最好每次上传都请他们开断点帮忙监测,这样效率会高很多。
问题三:上传接口搞好了,下载下来的呢?要进行一个解析,在这块上也是个空白。
通过copy别人的代码,效果是出来了,可代码看不懂啊,这也是一蛋疼的事... 好了,不扯了 来看看解析过程吧:虽然接口返回的是xml文本,但我们并没有通过解析xml来获取我们的内容,这就是ksoap功能强大之处,它可以将返回的xml转换成soapObject对象,然后我们就可以通过操作soapObject对象来获取我们想要的数据。我们可以直接通过属性来获取相应的值:resultSoapObject.getPropertySafely("ComparePhotoResult").toString() 有时候我们可能并不知道属性的名称,我们就可以直接通过索引下标来获取属性值: object.getProperty(0).toString(); 本例子中只返回一个值,但 有些接口会返回多个值,这又该如何获取呢?其实方法都一样,object.getProperty(0)得到的仍然是一个soapObject对象,不断地调用getProperty()方法;总能得到你想要的全部结果。
好了,关于webService调用的感悟就写到这里吧,这感悟真是深入到心里面去了,今年一定得好好补补基础了,要不就没朋友了...
标签:
原文地址:http://www.cnblogs.com/dream550/p/4316157.html