【HttpClient學習與實戰】1.使用httpClient實現get與post資訊傳輸
阿新 • • 發佈:2019-02-19
一般網路會給我們提供許多資料介面,我們的一些資訊並不是我們本系統提供而是第三方給我們提供的,他們通常會給我們一個提供資料來源的介面,訪問這個介面可以獲取相應的資料用於我們自己的應用中(WebService和現如今的json/xml通過http資訊的傳輸模式都是如此)。
httpClient是一款優秀的基於https協議的網路傳送http請求並獲取相應的api,下面就來探討一下如何使用httpClient進行get和post兩種方式的http通訊。
我們接下來要做的,就是提供一個數據介面,此資料介面提供整數計算服務,傳入兩個引數(要求是整數)和一個運算子引數,就可以得到最終的運算結果。如,傳遞param1=1,param2=2,operator='+',那麼介面就會返回result:3。
開發環境:MyEclipse8.5,JDK1.7,Tomcat6.0
首先在MyEclipse中建立一個Web Project工程:
然後在工程的lib資料夾中加入httpClient所需的所有jar包(別忘記BuildPath):
首先我們建立一個Servlet,用來提供資料服務:
看一下Web.xml有沒有給我們建立起這個Servlet服務:
下面我們開始編寫這個Servlet,具體實現就是獲取請求中的三個引數(兩個運算值一個運算子號),然後進行計算然後返回結果:
我們將該WebProject部署到tomcat中並執行起來:
在控制檯可以看到tomcat執行的日誌,當看到“Server startup in xxxx ms”的時候,伺服器啟動成功:
此時,在瀏覽器訪問我們的服務,引數分別輸入6、2和*,得到最終結果是6乘以2為12:
再測試一下加(+)、減(-)、除(/):
如果其中一個引數為空,得到的結果為:
好,我們的服務介面已經提供完畢了,接下來我們使用httpClient的get和post對這個http介面進行呼叫。
我們使用httpClinet分別編寫了使用get與post方式進行http資料傳輸的方法,在main主方法中,對其進行了測試,分別使用get和post請求獲取資料介面服務計算的結果:
執行結果:
證明我們成功使用httpClient訪問了第三方資料介面,並獲取了相應的資料。
httpClient是一款優秀的基於https協議的網路傳送http請求並獲取相應的api,下面就來探討一下如何使用httpClient進行get和post兩種方式的http通訊。
我們接下來要做的,就是提供一個數據介面,此資料介面提供整數計算服務,傳入兩個引數(要求是整數)和一個運算子引數,就可以得到最終的運算結果。如,傳遞param1=1,param2=2,operator='+',那麼介面就會返回result:3。
開發環境:MyEclipse8.5,JDK1.7,Tomcat6.0
首先在MyEclipse中建立一個Web Project工程:
然後在工程的lib資料夾中加入httpClient所需的所有jar包(別忘記BuildPath):
首先我們建立一個Servlet,用來提供資料服務:
看一下Web.xml有沒有給我們建立起這個Servlet服務:
下面我們開始編寫這個Servlet,具體實現就是獲取請求中的三個引數(兩個運算值一個運算子號),然後進行計算然後返回結果:
注意:“+”號通過URL傳遞到後臺會被預設轉義為空格“ ”,所以這裡驗證“+”號是用的是空格。package httpcall; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestHTTPServer extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gbk"); PrintWriter out=response.getWriter(); String param1=request.getParameter("param1"); out.println("param1="+param1); String param2=request.getParameter("param2"); out.println("param2="+param2); String operator=request.getParameter("operator"); out.println(operator.equals(" ")?"operator=+":"operator="+operator); if(param1 == null || param1.equals("") || param1.length()<=0){ out.println("http call failed,引數param1不能為空,程式退出"); }else if(param2 == null || param2.equals("") || param2.length()<=0){ out.println("http call failed,引數param2不能為空,程式退出"); }else if(operator == null || operator.equals("") || operator.length()<=0){ out.println("http call failed,引數operator不能為空,程式退出"); }else{ out.println("---http call success---"); } int n=Integer.parseInt(param1); int m=Integer.parseInt(param2); if(operator.equals(" ")){ out.println("result:"+(n+m)); }else if(operator.equals("-")){ out.println("result:"+(n-m)); }else if(operator.equals("*")){ out.println("result:"+(n*m)); }else if(operator.equals("/")){ out.println("result:"+(n/m)); }else{ out.println("---unknow error---"); } out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
我們將該WebProject部署到tomcat中並執行起來:
在控制檯可以看到tomcat執行的日誌,當看到“Server startup in xxxx ms”的時候,伺服器啟動成功:
此時,在瀏覽器訪問我們的服務,引數分別輸入6、2和*,得到最終結果是6乘以2為12:
再測試一下加(+)、減(-)、除(/):
如果其中一個引數為空,得到的結果為:
好,我們的服務介面已經提供完畢了,接下來我們使用httpClient的get和post對這個http介面進行呼叫。
我們使用httpClinet分別編寫了使用get與post方式進行http資料傳輸的方法,在main主方法中,對其進行了測試,分別使用get和post請求獲取資料介面服務計算的結果:
package httpcall; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class HttpClientUtil { private static final Log log=LogFactory.getLog(HttpClientUtil.class); /** * get 方式 * @param param1 * @param param2 * @param opt * @return String * */ public static String getHttp(String param1,String param2,String opt){ String responseMsg=""; //1.構造HttpClient的例項 HttpClient httpClient=new HttpClient(); //用於測試的http介面的url String url="http://localhost:8081/HttpTest/httpServer?param1=" +param1+"¶m2="+param2+"&operator="+opt; //2.建立GetMethod的例項 GetMethod getMethod=new GetMethod(url); //使用系統的預設的恢復策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { //3.執行getMethod,呼叫http介面 httpClient.executeMethod(getMethod); //4.讀取內容 byte[] responseBody=getMethod.getResponseBody(); //5.處理返回的內容 responseMsg=new String(responseBody); log.info(responseMsg); } catch (Exception e) { e.printStackTrace(); }finally{ //6.釋放連線 getMethod.releaseConnection(); } return responseMsg; } /** * post 方式 * @param param1 * @param param2 * @param opt * @return String * */ public static String postHttp(String param1,String param2,String opt){ String responseMsg=""; //1.構造HttpClient的例項 HttpClient httpClient=new HttpClient(); httpClient.getParams().setContentCharset("GBK"); String url="http://localhost:8081/HttpTest/httpServer"; //2.構造PostMethodd的例項 PostMethod postMethod=new PostMethod(url); //3.把引數值放入到PostMethod物件中 postMethod.addParameter("param1",param1); postMethod.addParameter("param2",param2); postMethod.addParameter("operator",opt); try { //4.執行postMethod,呼叫http介面 httpClient.executeMethod(postMethod);//200 //5.讀取內容 responseMsg=postMethod.getResponseBodyAsString().trim(); //6.處理返回的內容 log.info(responseMsg); } catch (Exception e) { e.printStackTrace(); }finally{ //7.釋放連線 postMethod.releaseConnection(); } return responseMsg; } /** * 測試的main方法 * @param args * */ public static void main(String[] args) { String param1="6"; String param2="2"; String opt="*"; System.out.println("get方式呼叫http介面\n"+getHttp(param1,param2,opt)); System.out.println("post方式呼叫http介面\n"+postHttp(param1,param2,opt)); } }
執行結果:
證明我們成功使用httpClient訪問了第三方資料介面,並獲取了相應的資料。
下一次我們將httpClient應用到實戰中,寫一個完整的基於httpClient的服務應用。