1. 程式人生 > >【HttpClient學習與實戰】1.使用httpClient實現get與post資訊傳輸

【HttpClient學習與實戰】1.使用httpClient實現get與post資訊傳輸

一般網路會給我們提供許多資料介面,我們的一些資訊並不是我們本系統提供而是第三方給我們提供的,他們通常會給我們一個提供資料來源的介面,訪問這個介面可以獲取相應的資料用於我們自己的應用中(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,具體實現就是獲取請求中的三個引數(兩個運算值一個運算子號),然後進行計算然後返回結果:
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);
    }

}
注意:“+”號通過URL傳遞到後臺會被預設轉義為空格“ ”,所以這裡驗證“+”號是用的是空格。

我們將該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的服務應用。