Android基於SOAP協議向WebService交互數據,修改請求超時時間

SOAP:簡單對象訪問協議,簡單對象訪問協議(SOAP)是一種輕量的、簡單的、基於 XML 的協議。 php

經過第三方提供的架包ksoap2-Android-assembly-2.4-jar-with-dependencies.jar,咱們能夠向服務器進行請求調用本身須要的服務。下面以http://www.webxml.com.cn/提供的天氣預報web服務爲例。 java

下面是向遠處服務器進行請求的詳細操做類WebServiceUtil android

 
 
   
  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協議的訪問操做。 web

在訪問遠程服務器提供的服務時,有時會由於網絡問題或者是服務器端問題,而致使客戶端側一直處於請求鏈接狀態,此時咱們但願能夠控制請求得不到響應的超時時間TimeOut. 服務器

想要控制請求的超時時間,咱們須要根據ksoap2-android-assembly-2.4-jar-with-dependencies.jar包,修改一些訪問的控制類。 網絡

1.首先重寫架包中的ServiceConnectionSE.Java,添加設置超時時間的方法,能夠在你的工程裏重寫這個類 this

  
複製到剪貼板  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 url

  
複製到剪貼板  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;  
相關文章
相關標籤/搜索