android调用webservice
2016-01-12 10:27
483 查看
Android SDK本身并不提供调用Webservice的API,要想调用Webservice,需要使用第三方的API,如KSOAP2。
使用KSOAP2调用Webservice,步骤如下:
1 指定Webservice的命名空间和调用的方法名
SoapObject类的第1个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第2个参数表示调用WebService的方法名。
2 设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略该步。
要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。
3 生成调用WebService方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述。
创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第1步创建的SoapObject对象。
4 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL。
5 使用call方法调用WebService方法。
call方法的第1个参数一般为null,第2个参数就是在第3步创建的SoapSerializationEnvelope对象。
6 使用getResponse方法获得WebService方法的返回结果。
7 如果WebService方法返回了对象,可以使用SoapObject.getProperty方法获取属性值。
完成代码
KSOAP2下载地址:http://download.csdn.net/detail/u011115385/9400358
使用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
相关文章推荐
- Android Service完全解析,关于服务你所需知道的一切
- 修改android项目名
- android应用程序中获取view 的位置
- android切换屏幕时的生命周期
- Android不能在oncreate里面播放音乐问题
- android APK更新主要代码
- 详解Android文件存储
- Android-Service生命周期
- android开发 防止输入键盘挡住界面
- Android的Window类
- Android 全屏沉浸模式(支持API 19及以上系统)
- android 三级缓存
- android 开发文档(sdk)中docs不能搜索
- android代码混淆和打包签名
- Android dimen
- android用户界面之一
- 实例详解Android文件存储数据方式
- 如何使用Android最新的RecyclerView取代ListView?
- Android内存泄漏终极解决篇(下)
- Android开发组件