这篇文章给大家介绍Android中如何调用WebService,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
首先在Android中通讯,我们必不可少的那便是Handler,Thread。
由于Android的机制,我们需要考虑
UI线程不能处理耗时操作,显然通讯属于耗时操作。所以我们用到Thread
子线程不能更新UI线程,所以我们需要用Handler机制来通知UI线程做出反应
由于服务器语种我们需要考虑
目前主要用2种语言开发的WebService Java和.net
结合上述的考虑,那么大致的思路是不有点眉目了!
试着写写吧!
首先创建一个类WebService
基本上请求有开始,正在请求,发生错误,成功,结束请求5种状态
我们便添加Handler处理消息的类别甄别,当然这里可以直接定义,而我这里是定一个内部类作为甄别类。
class MsgCode {
public final static int STATR = 0x01; //开始
public final static int ERROR = 0x02; //错误
public final static int SUSSCE = 0x03;//成功
public final static int FINALY = 0x04;//结束
public final static int PROGRESS = 0x05;//正在请求中
}
接下来我们想想我们WebService请求一般来说需要哪些参数,罗列一下我们需要下面6类。
服务器URL
命名空间URL
请求的函数名称
请求的参数列表
请求的服务器类别
Handler处理消息对象
罗列完毕,那我们的思路便更加明确了。这时候我们建立一个start函数,这里请求参数列表用Map便让key value的形式完全和webservice的参数形式对应了。
public static void start(final String sv_url, final String ns_url,
final String mthd, final HashMap<String, Object> params,
final boolean isdotnet, final Handler callback) {
new Thread(new Runnable() {
@Override
public void run() {
//webservice调用处理方法
}
}).start();
}
现在来让我们具体用代码回顾一下上一篇文章讲的
Android如何进行WebService调用,我们定义一个调用的具体函数start_函数,参数与start相同。
static void start_(String serviceUrl, String namespaceUrl,
String serviceMethod, HashMap<String, Object> params,
boolean isDotNet, Handler handler) {
}
接下来我们一步一步的回顾一下上一篇讲的如何调用
//构建SoapSerializationEnvelope
SoapSerializationEnvelope evlp = new SoapSerializationEnvelope(
SoapEnvelope.VER11);//对应于Ksoap 1.1规范
//构建SoapObject
SoapObject soapobject = new SoapObject(namespaceUrl, serviceMethod);
//构建传输的参数列表
//设置SoapObject
evlp.bodyOut = soapobject;
//你也可以如此
evlp.setOutputSoapObject(soapobject);
//设置是否为.net
evlp.dotNet = isDotNet;
//这里有个timeout超时我们可以定义一个在类里面定义静态常量50s作为超时时间可根据需要修改
private static int timeout = 1000 * 50;
HttpTransportSE hts = new HttpTransportSE(serviceUrl, timeout);
//调用 注意,这里有个actionUrl是namespaceUrl+serviceMethod的结果,
//一般是服务器?wsdl 里面的targetNamespace+ 函数name
hts.call(actionUrl, evlp);
//接收结果
Object result = evlp.getResponse();
//或者
Object result = evlp.bodyIn;
当然上面的代码直接copy过去是不能直接用的我们仔细想想,我们缺了哪些!
首先我们缺了构建参数列表好!下面我创建一个addParam函数通过遍历HashMap来添加参数列表
private static void addParam(SoapObject soapobject,
HashMap<String, Object> params) {
// TODO Auto-generated method stub
if (params != null && !params.isEmpty()) {
Iterator iter = params.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
PropertyInfo pi = new PropertyInfo();
pi.setName(key.toString());
pi.setValue(val);
pi.setType(val.getClass());
soapobject.addProperty(pi);
//当然你如果只传字符串直接上面PropertyInfo pi = new PropertyInfo();
//以后的注释掉直接用下面的也行
// soapobject.addProperty(key.toString(), val.toString());
}
}
}
//构建传输的参数列表处加上下面的语句
addParam(soapobject, params);
让我们再看看少了些什么?
对我们少了handler机制处理,来让我们加上!start_函数就变成下面这个样子
/**
* 调用的具体函数
*
* @param serviceUrl
* @param namespaceUrl
* @param serviceMethod
* @param params
* @param isDotNet
* @param handler
*/
static void start_(String serviceUrl, String namespaceUrl,
String serviceMethod, HashMap<String, Object> params,
boolean isDotNet, Handler handler) {
// TODO Auto-generated method stub
String actionUrl = namespaceUrl + serviceMethod;
handler.obtainMessage(MsgCode.STATR).sendToTarget();
SoapObject soapobject = new SoapObject(namespaceUrl, serviceMethod);
addParam(soapobject, params);
SoapSerializationEnvelope evlp = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
evlp.bodyOut = soapobject;
evlp.dotNet = isDotNet;
evlp.setOutputSoapObject(soapobject);
HttpTransportSE hts = new HttpTransportSE(serviceUrl, timeout);
try {
hts.call(actionUrl, evlp);
Object result = evlp.getResponse();
if (result.getClass().isAssignableFrom(SoapFault.class)) {
handler.obtainMessage(MsgCode.ERROR, result).sendToTarget();
} else {
handler.obtainMessage(MsgCode.SUSSCE, result).sendToTarget();
}
} catch (HttpResponseException e) {
// TODO Auto-generated catch block
handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget();
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget();
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget();
e.printStackTrace();
}
handler.obtainMessage(MsgCode.FINALY).sendToTarget();
}
关于Android中如何调用WebService就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。