2015/09/09重新整理
之前的项目中使用ksoap过程中偶尔会出现首次调用webservices接口无法返回数据,根据实际的测试发现,服务端的webservices接口根本没收到任何数据请求。
soapResult直接发回null
具体的报错信息:
1、
E/SaveMedia-response(4393): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
2、
ndroid]java.net.SocketException: sendto 失败: EPIPE (断管) 同时发送 byte]
解决方案来自物联网,不拉不拉与本站无关(你懂得)
方案一说:
有序列MediaAvidance
在 android 通过实施KvmSerializable
但为了让它工作您服务器端MediaAvidance
还必须序列化。 有这样做方案解决的代码下面我Cannot Serialize
我得到了的异常:
[Serializable] public class MediaAvidance您还需要注册您
SoapSerializationEnvelope
到MarshalBase64
:envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); new MarshalBase64().register(envelope);方案2说:jar包有bug,无论你使用的哪个版本的jar包替换成ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar(亲测好使!!)下载地址点击打开链接http://download.csdn.net/detail/sfq19881224/9093341
其中的参数及方法介绍请看这两篇文章,本文章所要说的是除了其他文章中说的意外,需要注意的地方,还有一写文章中虽然介绍了,但是博主自己无法测试通过情况的解决方案
简单粗暴直接上例子:
public String getRemoteInfo(String phoneSec) {
String nameSpace = "http://webservices.news.test.com/";//这个是本人内网测试的
//没参数的方法没意思,直接注掉
//String methodName = "test";
//假设这是有参数的方法
String methodName = "getNewsInfoListBy";
// EndPoint,后缀直接加上?wsdl就可以在浏览器中查看接口及方法和参数(方法参数请务必严格按照顺序和类型传)
String endPoint = "http://10.1.40.32:8080/DhccEHR/cxf/NewsWebservices";//url去掉?wsdlAddBookWebservices
// SOAP Action不要问为什么,反正这个地用不到,参考的博客中有用到soapAction,wsdl中无法看到他的直接存在,但是可以通过
//namespace+methodName组合起来</span>
String soapAction = "http://webservices.addressbook.hrm.dhcc.com/getCompanyAddressBookList";//namespace+methodName
String methodName = "getMobileCodeInfo";
SoapObject rpc = new SoapObject(nameSpace, methodName);
//注意 参数就是这样传的!!!
rpc.addProperty("user_name", "老刘");
rpc.addProperty("dept_name", "产品部");
//SoapEnvelope.VER10这个版本号一定要跟你自己的时机版本对应起来</span>
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.bodyOut = rpc;
//是不是.net相信你自己比较清楚哈
envelope.dotNet = false;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
//搞了很久,为什么第一个参数要为空!!!说好的命名空间+方法名呢?????????
//这里是与参考的博客不一样的地方
//不为空就报类型转换错误
transport.call("", envelope);
} catch (Exception e) {
e.printStackTrace();
}
String result= null;
if (envelope.bodyIn instanceof SoapFault)
{
SoapFault sf = (SoapFault) envelope.bodyIn;
result = String.valueOf(sf);
Log.v("TTTT","sfq--->>>>>"+result);
}else{
SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
//这个地方很重要,不要以为拿到resultrequestSOP就完成任务了,你可以打印字符串观察下,返回的数据开头往往会带哟偶”return =“是不标准 //的json,为实现获取标准的Json数据,需要添加下边这一句
Object ob = (SoapObject)resultsRequestSOAP.getProperty(0);
Log.v("TTTT","sfq--->>>>>:"+String.valueOf(resultsRequestSOAP));
result = String.valueOf(resultsRequestSOAP);
}
return result;
}
好了以上只是一个测试方法吗,需要引入android ksoap的jar包,如何下载和加载jar包可以直接参考两篇博客
参考文献列一
1、 http://blog.csdn.net/lyq8479/article/details/6428288
2 、 http://blog.csdn.net/lyq8479/article/details/6420398
稍后上传测试demo,只是一个测试demo,仅仅拿到数据就是我的主要目的!!
下载 地址 http://download.csdn.net/detail/sfq19881224/8804783