您的位置:首页 > 移动开发 > Android开发

android调用webservice

2016-01-12 10:27 483 查看
Android SDK本身并不提供调用Webservice的API,要想调用Webservice,需要使用第三方的API,如KSOAP2。

使用KSOAP2调用Webservice,步骤如下:

1 指定Webservice的命名空间和调用的方法名

SoapObject request = new SoapObject("http://service","getName");


SoapObject类的第1个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第2个参数表示调用WebService的方法名。

2 设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略该步。

request.addProperty("param1","value1");
request.addProperty("param2","value2");


要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。

3 生成调用WebService方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelop.VER11);
envelope.bodyOut = request;


创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第1步创建的SoapObject对象。

4 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL。

HttpTransportSE ht = new HttpTransportSE("http://127.0.0.1/services/webservice?wsdl");


5 使用call方法调用WebService方法。

ht.call(null,envelope);


call方法的第1个参数一般为null,第2个参数就是在第3步创建的SoapSerializationEnvelope对象。

6 使用getResponse方法获得WebService方法的返回结果。

SoapObject soapObject = (SoapObject) envelope.getResponse();


7 如果WebService方法返回了对象,可以使用SoapObject.getProperty方法获取属性值。

String name = soapObject.getProperty("name");


完成代码

private void getDataFromWebService(String caseId){
// 命名空间
String nameSpace = "http://ws.prc.jda.com/";
// 调用的方法名称
String methodName = "getBottlingDateByCase";
// EndPoint
String endPoint = webServiceUrl;//"https://192.168.37.43:8777/TraceabitityWS/services/PDAPrintService"

// SOAP Action
String soapAction = "http://ws.prc.jda.com/getBottlingDateByCase";
// 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(nameSpace, methodName);

// 设置需调用WebService接口需要传入的参数
rpc.addProperty("caseId", caseId);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10)  ;

envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
//   envelope.dotNet = true;
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);

try {
HttpTransportSE transport = new HttpTransportSE(endPoint,(timeOut*1000)/2);
// https 认证
SSLConection.allowAllSSL();
// 调用WebService
transport.call(soapAction, envelope);
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;

// 获取返回的结果
System.out.println("返回的结果"+object);
if(object.getPropertyCount() > 0 ){
for(int i = 0; i < object.getPropertyCount(); i++){
SoapObject details = (SoapObject) object.getProperty(i);
String date = "";
String count = "";
for(int j = 0; j < details.getPropertyCount()-1; j++){
date = details.getPropertyAsString(j);
count = details.getPropertyAsString(j+1);
}
mDatas.add(new PrintData(date, count+"瓶"));
}
handler.sendEmptyMessage(SUCCESS);
}else{
handler.sendEmptyMessage(NULL);
}
} catch(SocketTimeoutException e){
e.printStackTrace();
handler.sendEmptyMessage(TIMEOUT);
} catch (IOException e) {
doException(e);
} catch (XmlPullParserException e) {
doException(e);
}catch (ClassCastException e) {
doException(e);
}
}


import android.util.Log;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class SSLConection {

private static TrustManager[] trustManagers;

public static class _FakeX509TrustManager implements javax.net.ssl.X509TrustManager {
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return (_AcceptedIssuers);
}
}

public static void allowAllSSL() {

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});

javax.net.ssl.SSLContext context;

if (trustManagers == null) {
trustManagers = new TrustManager[]{new _FakeX509TrustManager()};
}

try {
context = javax.net.ssl.SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
} catch (NoSuchAlgorithmException e) {
Log.e("allowAllSSL", e.toString());
} catch (KeyManagementException e) {
Log.e("allowAllSSL", e.toString());
}
}
}


KSOAP2下载地址:http://download.csdn.net/detail/u011115385/9400358
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: