1. 程式人生 > 其它 >HttpClient實現遠端呼叫

HttpClient實現遠端呼叫

技術標籤:系統架構HttpClient遠端呼叫

客戶端網路框架-HttpClient實現遠端呼叫

apache common封裝好的HttpClient
org.apache.commons.httpclient
HttpClient:程式碼複雜,還得操心資源回收等。程式碼很複雜,冗餘程式碼多。

目錄

客戶端網路框架-HttpClient實現遠端呼叫

一、HttpClient介紹


一、HttpClient介紹

HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程式需要直接通過 HTTP 協議來訪問網路資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程式來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子專案,用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。

Commons的HttpClient專案現在是生命的盡頭,不再被開發, 已被ApacheHttpComponents專案HttpClient和HttpCore 模組取代,提供更好的效能和更大的靈活性。

二、工具類

package com.cnzz.demo.remote.rpc;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.IOException;

/**
 * ************************************************************
 * Copyright © 2020 cnzz Inc.All rights reserved.  *    **
 * ************************************************************
 *
 * @program: demo
 * @description:
 * @author: cnzz
 * @create: 2020-12-23 17:41
 **/

public class HttpClientUtil {

    /**
     * httpClient的get請求方式
     * 使用GetMethod來訪問一個URL對應的網頁實現步驟:
     * 1.生成一個HttpClient物件並設定相應的引數;
     * 2.生成一個GetMethod物件並設定響應的引數;
     * 3.用HttpClient生成的物件來執行GetMethod生成的Get方法;
     * 4.處理響應狀態碼;
     * 5.若響應正常,處理HTTP響應內容;
     * 6.釋放連線。
     * @param url
     * @param charset
     * @return
     */
    public static String doGet(String url, String charset) {
        //1.生成HttpClient物件並設定引數
        HttpClient httpClient = new HttpClient();
        //設定Http連線超時為5秒
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
        //2.生成GetMethod物件並設定引數
        GetMethod getMethod = new GetMethod(url);
        //設定get請求超時為5秒
        getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
        //設定請求重試處理,用的是預設的重試處理:請求三次
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
        String response = "";
        //3.執行HTTP GET 請求
        try {
            int statusCode = httpClient.executeMethod(getMethod);
            //4.判斷訪問的狀態碼
            if (statusCode != HttpStatus.SC_OK) {
                System.err.println("請求出錯:" + getMethod.getStatusLine());
            }
            //5.處理HTTP響應內容
            //HTTP響應頭部資訊,這裡簡單列印
            Header[] headers = getMethod.getResponseHeaders();
            for(Header h : headers) {
                System.out.println(h.getName() + "---------------" + h.getValue());
            }
            //讀取HTTP響應內容,這裡簡單列印網頁內容
            //讀取為位元組陣列
            byte[] responseBody = getMethod.getResponseBody();
            response = new String(responseBody, charset);
            System.out.println("-----------response:" + response);
            //讀取為InputStream,在網頁內容資料量大時候推薦使用
            //InputStream response = getMethod.getResponseBodyAsStream();
        } catch (HttpException e) {
            //發生致命的異常,可能是協議不對或者返回的內容有問題
            System.out.println("請檢查輸入的URL!");
            e.printStackTrace();
        } catch (IOException e) {
            //發生網路異常
            System.out.println("發生網路異常!");
        } finally {
            //6.釋放連線
            getMethod.releaseConnection();
        }
        return response;
    }

    /**
     * post請求
     * @param url
     * @param json
     * @return
     */
    public static String doPost(String url, JSONObject json){
        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod(url);

        postMethod.addRequestHeader("accept", "*/*");
        postMethod.addRequestHeader("connection", "Keep-Alive");
        //設定json格式傳送
        postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK");
        //必須設定下面這個Header
        postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
        //新增請求引數
        postMethod.addParameter("commentId", json.getString("commentId"));

        String res = "";
        try {
            int code = httpClient.executeMethod(postMethod);
            if (code == 200){
                res = postMethod.getResponseBodyAsString();
                System.out.println(res);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=telPhone", "GBK"));
        System.out.println("-----------分割線------------");
        System.out.println("-----------分割線------------");
        System.out.println("-----------分割線------------");

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("commentId", "telPhone");
        System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject));
    }
}

參考

java實現呼叫http請求的幾種常見方式
https://blog.csdn.net/riemann_/article/details/90539829