遠程訪問webservice的兩種方法

1,HttpGet類和HttpPost

HttpClient模塊中用到了兩個重要的類:HttpGetHttpPost。這兩個類分別用來提交HTTP GETHTTP POST請求。爲了測試本節的例子,須要先編寫一個Servlet程序,用來接收HTTP GETHTTP POST請求。讀者也可使用其餘服務端的資源來測試本節的例子。 java

假設192.168.17.81是本機的IP,客戶端能夠經過以下的URL來訪問服務端的資源: web

http://192.168.17.81:8080/querybooks/QueryServlet?bookname=開發 學習

在這裏booknameQueryServlet的請求參數,表示圖書名,經過該參數來查詢圖書信息。 測試

如今咱們要經過HttpGetHttpPost類向QueryServlet提交請求信息,並將返回結果顯示在TextView組件中。 url

不管是使用HttpGet,仍是使用HttpPost,都必須經過以下3步來訪問HTTP資源。 spa

1.建立HttpGetHttpPost對象,將要請求的URL經過構造方法傳入HttpGetHttpPost對象。 debug

2.使用DefaultHttpClient類的execute方法發送HTTP GETHTTP POST請求,並返回HttpResponse對象。 code

3.經過HttpResponse接口的getEntity方法返回響應信息,並進行相應的處理。 orm

若是使用HttpPost方法提交HTTP POST請求,還須要使用HttpPost類的setEntity方法設置請求參數。 對象

本例使用了兩個按鈕來分別提交HTTP GETHTTP POST請求,並從EditText組件中得到請求參數(bookname)值,最後將返回結果顯示在TextView組件中。兩個按鈕共用一個onClick事件方法,代碼以下:

public void onClick(View view){  

    //  讀者須要將本例中的IP換成本身機器的IP  
    String url = "http://192.168.17.81:8080/querybooks/QueryServlet";  
    TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);  
    EditText etBookName = (EditText) findViewById(R.id.etBookName);  
    HttpResponse httpResponse = null;  
    try{  
        switch (view.getId()){  
            //  提交HTTP GET請求  
            case R.id.btnGetQuery:  
                //  向url添加請求參數  
                url += "?bookname=" + etBookName.getText().toString();  
                //  第1步:建立HttpGet對象  
                HttpGet httpGet = new HttpGet(url);  
                //  第2步:使用execute方法發送HTTP 
GET請求,並返回HttpResponse對象  
                httpResponse = new DefaultHttpClient().execute(httpGet);  
                //  判斷請求響應狀態碼,狀態碼爲200表
示服務端成功響應了客戶端的請求  
                if (httpResponse.getStatusLine().
getStatusCode() == 200){  
                    //  第3步:使用getEntity方法得到返回結果  
                    String result = EntityUtils.
toString(httpResponse.getEntity());  
                    //  去掉返回結果中的"\r"字符,
不然會在結果字符串後面顯示一個小方格  
                    tvQueryResult.setText(result.replaceAll("\r", ""));  
                }  
                break;  
            //  提交HTTP POST請求  
            case R.id.btnPostQuery:  
                //  第1步:建立HttpPost對象  
                HttpPost httpPost = new HttpPost(url);  
                //  設置HTTP POST請求參數必須用NameValuePair對象  
                List params = new 
ArrayList();  
                params.add(new BasicNameValuePair
("bookname", etBookName.getText(). toString()));  
                //  設置HTTP POST請求參數  
                httpPost.setEntity(new 
UrlEncodedFormEntity(params, HTTP.UTF_8));  
                //  第2步:使用execute方法發送HTTP 
POST請求,並返回HttpResponse對象  
                httpResponse = new DefaultHttpClient().
execute(httpPost);  
                if (httpResponse.getStatusLine().
getStatusCode() == 200){  
                    //  第3步:使用getEntity方法得到返回結果  
                    String result = EntityUtils.toString
(httpResponse.getEntity());  
                    //  去掉返回結果中的"\r"字符,
不然會在結果字符串後面顯示一個小方格  
                    tvQueryResult.setText(result.replaceAll("\r", ""));  
                }  
                break;  
        }  
    }  
    catch (Exception e){  
        tvQueryResult.setText(e.getMessage());  
    }
2,運用SoapObject對象

private static final String NAMESPACE = SessionApp.NAMESPACE;
	// WSDL文檔的URL 注意這裏要用ip,即便是本機也不能用localhost或者127.0.0.1代替
	private static final String URL = SessionApp.clipServer;

	public static boolean bulkDelete(String hashCodes,int boxType,String userName,String token) {
		boolean flag = false;
		String METHODNAME = "bulkDelete";
		// 指定WebService的命名空間和調用的方法名利用SoapObject類
		// 第1個參數表示WebService的命名空間,能夠從WSDL文檔中找到WebService的命名空間。
		// 第2個參數表示要調用的WebService方法名
		SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
		// 設置調用方法的參數值,這一步是可選的,若是方法沒有參數,能夠省略這一步。設置方法的參數值的代碼以下
		// 要注意的是,addProperty方法的第1個參數雖然表示調用方法的參數名,但該參數值並不必定與服務端的WebService類中的方法參數名一致,只要設置參數的順序一致便可。
		request.addProperty("hashCodes", hashCodes);
		request.addProperty("boxType", boxType);
		request.addProperty("userName", userName);
		request.addProperty("token", token);
		// 生成調用WebService方法的SOAP請求信息。該信息由SoapSerializationEnvelope對象描述
		// 構造方法設置SOAP協議的版本號:該版本號須要根據服務端WebService的版本號設置
		// SoapSerializationEnvelope對象後,不要忘了設置SoapSerializationEnvelope類的bodyOut屬性,該屬性的值就是在第1步建立的SoapObject對象。
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		envelope.dotNet = false;
		envelope.setOutputSoapObject(request);
		// 建立HttpTransportSE對象。經過HttpTransportSE類的構造方法能夠指定WebService的WSDL文檔的URL
		HttpTransportSE transport = new HttpTransportSE(URL);
		// transport.debug = true;
		// web service請求
		try {
			// 使用call方法調用WebService方法
			transport.call(NAMESPACE + METHODNAME, envelope);
			// 使用getResponse方法得到WebService方法的返回結果
			Object obj = envelope.bodyIn;
			if(obj instanceof SoapObject){
				SoapObject result = (SoapObject) obj;
				Object object = result.getProperty(0);
				if(object != null){
					String result_str = object.toString();
					flag = Boolean.valueOf(result_str);
				}
			//當出現異常時,拋出此異常
			}else if(obj instanceof SoapFault){
				throw (SoapFault)obj;
			}
		} catch (SoapFault e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		}
		return flag;
	}
工做中總結的一點知識,僅供參考學習。
相關文章
相關標籤/搜索