使用KSoap2-anroid连接WebService并保持Session
大家好!我是小渣渣。最近在做一些应用需要访问webservice,所以在网上搜了很多资源。 发现大家都是在用Ksoap2-android 这么一个工具来访问ebservice的,因为是对于这块并不是很熟悉,遇到了很多问题。故此写了这一边篇技术blog!
不想写太多代码,我把关键步骤贴出来就好了==。因为我很懒,请骂醒我!
* 1,导入jar包
jar包连接ksoap-android3.6.0.jar资源下载。
下载后像一般的导入到 libs 文件夹下就好了。但是有一点需要注意的地方就是,需要将 libs 文件夹加入 class Folder。这一点很重要。否则在运行时他是引用不到ksoap的一些类。就会抛出没有什么什么类的异常。具体原因我自己也不是很了解。如果有知道的小伙伴请告知一下!谢谢
* 2,完成了导入jar的工作后,就开始正式的连接webservice。
通过wsdl我们需要知道的四个参数
#
1,NameSpace(命名空间)
#
2,MethodName(需要调用的方法名)
#
3,url/endPoint(就是去掉了后缀 ?wsdl后的地址)
#
4,SoapAction(其实就是命名空间+方法名,但是在我的应用中是为null。我也不知道其中原理,有知道的小伙伴之评论下方告诉我!阿里嘎多)
什么?看到这里你跟我说”我不懂什么是webservice”。啥也别说了!提供一个连接给你自己去学习学习。WebService之介绍
我大部分也是看人家的blog学习的。末尾我会把相关连接都发出来
public static String WebServiceGetConn(String nameSpace,String methodName,String url,String soapPoint,HashMap<String,Object> map)
{
//指定webservice的命名空间和调用的方法名
SoapObject object = new SoapObject(nameSpace,methodName);
for(Entry<String,Object> entry:map.entrySet())
{
object.addProperty(entry.getKey(),entry.getValue());
}
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
//报错有时也是版本号没有写对的原因。
//至于版本号应该选择什么样的,我也是没有搞清楚
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.bodyOut = object;
envelope.doNet = false; //这个问你的服务端是不是.net写的!不是就false;
envelope.setOutputSoapObject(rpc);// 等价于envelope.bodyOut = rpc;
HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 这才是真正的去访问网络调用WebService了,记得加权限
transport.call(soapAction, envelope);
} catch (Exception e) {
e.printStackTrace();
}
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
//如果返回的是字符串类型的,那么上面这句话就会报错,这时你可以用这种方法
Object obj = (Object)envelope.getResponse();
//然后直接return obj.toString()就好了,下面的步骤就不要了
// 获取返回的结果
String result = object.getProperty(0).toString();
// 将WebService返回的结果显示在TextView中
resultView.setText(result);
}
当然这些都只是非常简单的东西,有时你的webservice还要求你传一些对象之类的参数。那么这些东西我也是要慢慢的学习。下次就再写一篇关如何传递对象。
啊啊啊?什么?你问我”你不是说还要保持session吗?”
*3,对对对!我TM差点忘了。咳咳!其实很简单。
//当你调用transport.call()传入三个参数时,就可以看到他会返回一个List
List<HeaderProperty> headerList = androidHttpTransport.call(SOAP_ACTION, envelope, null);
for (Object header :headerList) {
HeaderProperty headerProperty = (HeaderProperty) header;
String headerKey = headerProperty.getKey();
String headerValue = headerProperty.getValue(); System.out.println(headerKey +" : " + headerValue); sharedPreferenceEditor.putString(headerKey, headerValue);
//那么这个key 就是 Set-Cookie
//value 就是session啦
}
什么?你说为什么服务端返回给你的是Cookie?不要问我这么高难度的问题好吗?自己去寻找一下答案!
那么问题来了!wajuejijishunajiaqiang?不是不是。我们获得了服务器传给我们的session,应该怎么再回传给服务端?都写到这里了,应该有很多朋友已经想到了。
//前面不是说了call的三个参数吗?第三个参数就是可以传一个List<HeaderProperty>
//第一次获取session时,是传的null
HeaderProperty headerPropertyObj = new HeaderProperty("cookie", "这里传你获取到的value");
headerList.add(headerPropertyObj);
androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
链接发不了了!因为我都忘记在哪里看的了!