当前位置: 代码迷 >> Web前端 >> Android基于SOAP协议向WebService交互数据,批改请求超时时间
  详细解决方案

Android基于SOAP协议向WebService交互数据,批改请求超时时间

热度:447   发布时间:2012-11-19 10:18:51.0
Android基于SOAP协议向WebService交互数据,修改请求超时时间

SOAP:简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议。

通过第三方提供的架包ksoap2-Android-assembly-2.4-jar-with-dependencies.jar,我们可以向服务器进行请求调用自己需要的服务。下面以http://www.webxml.com.cn/提供的天气预报web服务为例。

下面是向远处服务器进行请求的详细操作类WebServiceUtil

 
复制到剪贴板  Java代码
  1. public class WebServiceUtil {  
  2.    
  3.     //命名空间  
  4.     private static final String NAMESPACE = "http://WebXml.com.cn/";  
  5.     //WebService地址  
  6.     private static final String URL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";  
  7.     //需要调用的方法名  
  8.     private static final String getSupportProvince = "getSupportProvince";  
  9.       
  10.     /** 
  11.      * @desc 获得洲、国内外省份和城市信息 
  12.      * @return 省份列表 
  13.      */  
  14.     public List getAllProvince() {  
  15.         List allProvince = new ArrayList();  
  16.           
  17.         try {  
  18.             //1.实例化SoapObject对象  
  19.             SoapObject request = new SoapObject(NAMESPACE, getSupportProvince);  
  20.               
  21.             //2.如果方法需要参数,设置参数  
  22. //        request.setProperty("参数名称", "参数值");  
  23.               
  24.             //3.设置Soap的请求信息,参数部分为Soap协议的版本号  
  25.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  26.             envelope.bodyOut = request;  
  27.               
  28.             //4.构建传输对象  
  29.             AndroidHttpTransport transport = new AndroidHttpTransport(URL);  
  30.             transport.debug = true;  
  31.               
  32.             //5.访问WebService,第一个参数为命名空间 + 方法名,第二个参数为Envelope对象  
  33.             transport.call(NAMESPACE + getSupportProvince, envelope);  
  34.               
  35.             //6.解析返回的数据  
  36.             SoapObject result = (SoapObject) envelope.getResponse();  
  37.             int count = result.getPropertyCount();  
  38.             for (int i = 0; i < count; i++) {  
  39.                 allProvince.add(result.getProperty(i).toString());  
  40.             }  
  41.    
  42.         } catch (IOException e) {  
  43.             e.printStackTrace();  
  44.         } catch (XmlPullParserException e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.         return allProvince;  
  48.     }  
  49. }  

使用还是比较简单的,在这我只以天气预报服务中提供的获取省份信息的方法getSupportProvince为例,详细的解释了基于soap协议的访问操作。

在访问远程服务器提供的服务时,有时会因为网络问题或者是服务器端问题,而导致客户端侧一直处于请求连接状态,此时我们希望可以控制请求得不到响应的超时时间TimeOut.

想要控制请求的超时时间,我们需要根据ksoap2-android-assembly-2.4-jar-with-dependencies.jar包,修改一些访问的控制类。

1.首先重写架包中的ServiceConnectionSE.Java,添加设置超时时间的方法,可以在你的工程里重写这个类

  
复制到剪贴板  Java代码
  1. package com.ahutzh.weather;  
  2.    
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8.    
  9. import org.ksoap2.transport.ServiceConnection;  
  10.    
  11. public class ServiceConnectionSE  
  12.   implements ServiceConnection  
  13. {  
  14.   private HttpURLConnection connection;  
  15.    
  16.   public ServiceConnectionSE(String url)  
  17.     throws IOException  
  18.   {  
  19.     this.connection = ((HttpURLConnection)new URL(url).openConnection());  
  20.     this.connection.setUseCaches(false);  
  21.     this.connection.setDoOutput(true);  
  22.     this.connection.setDoInput(true);  
  23.   }  
  24.    
  25.   public void connect() throws IOException {  
  26.     this.connection.connect();  
  27.   }  
  28.    
  29.   public void disconnect() {  
  30.     this.connection.disconnect();  
  31.   }  
  32.    
  33.   public void setRequestProperty(String string, String soapAction) {  
  34.     this.connection.setRequestProperty(string, soapAction);  
  35.   }  
  36.    
  37.   public void setRequestMethod(String requestMethod) throws IOException {  
  38.     this.connection.setRequestMethod(requestMethod);  
  39.   }  
  40.    
  41.   public OutputStream openOutputStream() throws IOException {  
  42.     return this.connection.getOutputStream();  
  43.   }  
  44.    
  45.   public InputStream openInputStream() throws IOException {  
  46.     return this.connection.getInputStream();  
  47.   }  
  48.    
  49.   public InputStream getErrorStream() {  
  50.     return this.connection.getErrorStream();  
  51.   }  
  52.     
  53.   //设置连接服务器的超时时间,毫秒级,此为自己添加的方法  
  54.   public void setConnectionTimeOut(int timeout){  
  55.       this.connection.setConnectTimeout(timeout);  
  56.   }  
  57. }  

再自己写一个传输对象类,类似于架包中的AndroidHttpTransport类,命名为MyAndroidHttpTransport.java

  
复制到剪贴板  Java代码
  1. package com.ahutzh.weather;  
  2.    
  3. import java.io.IOException;  
  4.    
  5. import org.ksoap2.transport.HttpTransportSE;  
  6. import org.ksoap2.transport.ServiceConnection;  
  7.    
  8. public class MyAndroidHttpTransport extends HttpTransportSE {  
  9.    
  10.     private int timeout = 30000//默认超时时间为30s  
  11.       
  12.     public MyAndroidHttpTransport(String url) {  
  13.         super(url);  
  14.     }  
  15.       
  16.     public MyAndroidHttpTransport(String url, int timeout) {  
  17.         super(url);  
  18.         this.timeout = timeout;  
  19.     }  
  20.    
  21.     protected ServiceConnection getServiceConnection(String url) throws IOException {  
  22.         ServiceConnectionSE serviceConnection = new ServiceConnectionSE(url);  
  23.         serviceConnection.setConnectionTimeOut(timeout);  
  24.         return new ServiceConnectionSE(url);  
  25.     }  
  26. }  
 
 
完成这之后,在前面的第四步构建传输对象中,就不要使用架包中的AndroidHttpTransport,而使用我们自己的写的这个类。
 
复制到剪贴板  Java代码
  1.    
  2. //4.构建传输对象  
  3. //            AndroidHttpTransport transport = new AndroidHttpTransport(URL);  
  4. //            transport.debug = true;  
  5.             int timeout = 15000;  //set timeout 15s  
  6.             MyAndroidHttpTransport transport = new MyAndroidHttpTransport(URL, timeout);  
  7.             transport.debug = true;  
  相关解决方案