在HttpClient模塊中用到了兩個重要的類:HttpGet和HttpPost。這兩個類分別用來提交HTTP GET和HTTP POST請求。爲了測試本節的例子,須要先編寫一個Servlet程序,用來接收HTTP GET和HTTP POST請求。讀者也可使用其餘服務端的資源來測試本節的例子。 java
假設192.168.17.81是本機的IP,客戶端能夠經過以下的URL來訪問服務端的資源: web
http://192.168.17.81:8080/querybooks/QueryServlet?bookname=開發 學習
在這裏bookname是QueryServlet的請求參數,表示圖書名,經過該參數來查詢圖書信息。 測試
如今咱們要經過HttpGet和HttpPost類向QueryServlet提交請求信息,並將返回結果顯示在TextView組件中。 url
不管是使用HttpGet,仍是使用HttpPost,都必須經過以下3步來訪問HTTP資源。 spa
1.建立HttpGet或HttpPost對象,將要請求的URL經過構造方法傳入HttpGet或HttpPost對象。 debug
2.使用DefaultHttpClient類的execute方法發送HTTP GET或HTTP POST請求,並返回HttpResponse對象。 code
3.經過HttpResponse接口的getEntity方法返回響應信息,並進行相應的處理。 orm
若是使用HttpPost方法提交HTTP POST請求,還須要使用HttpPost類的setEntity方法設置請求參數。 對象
本例使用了兩個按鈕來分別提交HTTP GET和HTTP 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; }工做中總結的一點知識,僅供參考學習。