首頁 > 軟體

HttpClient實現遠端呼叫

2022-08-14 14:02:08

本文範例為大家分享了HttpClient實現遠端呼叫的具體程式碼,供大家參考,具體內容如下

依賴:

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.5</version>
</dependency>

服務提供者:

/**
    * get請求
*/
    @GetMapping("/gte3")
    public AjaxResult getGuke3(Integer id) throws Exception {
        System.err.println("id:" + id);
        Uesr uesr = new Uesr();
        uesr.setId(11);
        uesr.setName("chen");
        return AjaxResult.success(uesr);
    }

/**
*post請求
*/
@PostMapping("/test001")
    public AjaxResult post1(@RequestBody Uesr uesr) {

        System.err.println(uesr.getId() + uesr.getName());
        return AjaxResult.success(1);
    }   

/**
     * 檔案上傳
     */
    @PostMapping("/test14")
    public AjaxResult test14(MultipartFile multipartFile, String id, String fileMd5) throws IOException {
        System.err.println(id);
        System.err.println(fileMd5);        final InputStream inputStream = multipartFile.getInputStream();
        int i = 0;
        while ((i = inputStream.read()) != -1) {
            char c = (char) i;
            System.err.println(c);
        }
        return AjaxResult.success(1);
    }

封裝的工具類:

package cn.sotos;

import cn.sotos.util.AjaxResult;
import cn.sotos.util.Uesr;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;

import org.apache.http.ParseException;

import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;


import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @program: exportool
 * @description:
 * @author: hu.chen
 **/
public class HttpClientHelper {

    private static CloseableHttpClient httpClient = HttpClientBuilder.create().build();

    public static void main(String[] args) throws Exception {
        HttpClientHelper httpClientHelper = new HttpClientHelper();
        //get請求
        Map<String, Object> mapget = new ConcurrentHashMap<>();
        mapget.put("id", 1);
        AjaxResult<Uesr> resultGet = httpClientHelper.doGet("http://127.0.0.1:8081/gte3", mapget, null, Uesr.class);

        System.err.println(resultGet.getCode());
        System.err.println(resultGet.getMsg());

        final Uesr uesr = resultGet.getData();
        System.err.println(uesr.getName());


        //post請求
        Map<String, Object> mappost = new ConcurrentHashMap<>();
        mappost.put("id", 2);
        mappost.put("name", "陳虎001post");
        Uesr uesr1 = new Uesr();
        uesr1.setName("chenpost");
        uesr1.setId(001);
        AjaxResult<Integer> resultPost = httpClientHelper.doPost("http://127.0.0.1:8081/test001", uesr1, null, Integer.class);

        System.err.println(resultPost.getCode());
        System.err.println(resultPost.getMsg());

        final Integer nteger = resultPost.getData();
        System.err.println(nteger);

        //檔案請求
        List<File> files = new ArrayList<>();
        File file = new File("D:/t.txt");
        files.add(file);

        Map<String, String> mapfile = new ConcurrentHashMap<>();
        mappost.put("id", " 2");
        mappost.put("fileMd5", "陳虎001file");

        AjaxResult<Integer> resultFile = httpClientHelper.updataFile("http://127.0.0.1:8081/test14", "multipartFile", files, mapfile, Integer.class);
        final Integer ntegerfile = resultFile.getData();
        System.err.println(ntegerfile);
    }


    /**
     * 帶引數的get請求
     *
     * @param url          請求地址
     * @param parameValues 引數
     * @param headerValues    請求頭引數
     * @param clazz          返回引數型別
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doGet(String url, Map<String, Object> parameValues, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 宣告URIBuilder
        URIBuilder uriBuilder = new URIBuilder(url);
        // 判斷引數map是否為非空
        if (parameValues != null) {
            // 遍歷引數
            for (Map.Entry<String, Object> entry : parameValues.entrySet()) {
                // 設定引數
                uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());
            }
        }
        // 2 建立httpGet物件,相當於設定url請求地址
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        /*
         * 新增請求頭資訊
         */
        //判斷請求頭是否不為空
        if (headerValues != null) {
            for (Map.Entry<String, String> entry : headerValues.entrySet()) {
                httpGet.addHeader(entry.getKey(), entry.getValue());
            }
        }
        // 傳輸的型別
        httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
        // 3 使用HttpClient執行httpGet,相當於按回車,發起請求
        CloseableHttpResponse response = httpClient.execute(httpGet);

        // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果
        return pasResponse(response, clazz);
    }

    /**
     * 帶引數的post請求
     *
     * @param url       請求地址
     * @param parameter 引數
     * @param headerValues 請求頭引數
     * @param clazz       返回引數型別
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doPost(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 宣告httpPost請求
        HttpPost httpPost = new HttpPost(url);

        setParam(httpPost, parameter, headerValues);
        // 傳輸的型別
        httpPost.addHeader("Content-Type", "application/json; charset=UTF-8");

        // 使用HttpClient發起請求,返回response
        CloseableHttpResponse response = httpClient.execute(httpPost);

        // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果
        return pasResponse(response, clazz);
    }

    /**
     * 帶引數的Put請求
     *
     * @param url       請求地址
     * @param parameter 引數
     * @param headerValues 請求頭引數
     * @param clazz       返回引數型別
     * @return
     * @throws Exception
     */
    public <T> AjaxResult doPut(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception {
        // 宣告httpPost請求
        HttpPut httpPut = new HttpPut(url);

        setParam(httpPut, parameter, headerValues);
        // 傳輸的型別
        httpPut.addHeader("Content-Type", "application/json; charset=UTF-8");

        // 使用HttpClient發起請求,返回response
        CloseableHttpResponse response = httpClient.execute(httpPut);
        // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果
        return pasResponse(response, clazz);
    }


    /**
     * 遠端呼叫傳輸檔案
     *
     * @param url          請求地址
     * @param fileKey      後端接收的檔案引數的名稱
     * @param files        檔案集合
     * @param parameValues 其他引數
     * @param clazz 返回引數型別
     */
    public <T> AjaxResult updataFile(String url, String fileKey, List<File> files, Map<String, String> parameValues, Class<T> clazz) throws IOException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        HttpPost httpPost = new HttpPost(url);
        CloseableHttpResponse response = null;

        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();

        //設定檔案引數
        for (File file : files) {
            multipartEntityBuilder.addBinaryBody(fileKey, file, ContentType.DEFAULT_BINARY, URLEncoder.encode(file.getName(), "utf-8"));
        }

        //設定其他引數
        if (parameValues != null) {
            // 其它引數(注:自定義contentType,設定UTF-8是為了防止伺服器端拿到的引數出現亂碼)
            ContentType contentType = ContentType.create("application/json", Charset.forName("UTF-8"));
            for (Map.Entry<String, String> entry : parameValues.entrySet()) {
                multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), contentType);
            }
        }
        HttpEntity httpEntity = multipartEntityBuilder.build();
        httpPost.setEntity(httpEntity);
        response = httpClient.execute(httpPost);

        // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果
        return pasResponse(response, clazz);
    }


    /**
     * 設定引數
     *
     * @param parameter 請求引數
     * @param headerValues 請求頭引數
     */
    private void setParam(HttpEntityEnclosingRequestBase requestBase, Object
            parameter, Map<String, String> headerValues) {
        // 判斷引數是否不為空
        if (parameter != null) {
            // 在傳送複雜巢狀物件時,一定要把物件轉成json字串,我這裡實用的是alibaba.fastjson,當然你也可以使用其他的json工具
            StringEntity requestEntity = new StringEntity(JSON.toJSONString(parameter), "utf-8");
            requestEntity.setContentEncoding("UTF-8");
            requestBase.setEntity(requestEntity);
        }
        //判斷請求頭是否不為空
        if (headerValues != null) {
            for (Map.Entry<String, String> entry : headerValues.entrySet()) {
                requestBase.addHeader(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * 封裝返回結果
     *
     * @param response 資料集
     * @param clazz      引數型別
     * @param <T>
     * @return
     * @throws IOException
     */
    private <T> AjaxResult pasResponse(CloseableHttpResponse response, Class<T> clazz) throws IOException {
        AjaxResult<T> ajaxResult = null;
        try {
            // 解析資料封裝HttpResult
            if (response.getEntity() != null) {
                ajaxResult = JSONObject.parseObject(EntityUtils.toString(response.getEntity(), "utf-8"), AjaxResult.class);
                ajaxResult.setData(JSONObject.parseObject(JSONObject.toJSONString(ajaxResult.getData()), clazz));
            } else {
                ajaxResult = new AjaxResult();
            }
        } catch (ParseException | IOException e) {
            System.err.println("返回結果轉換失敗" + e);
        } finally {
            try {
                // 釋放資源
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                System.err.println("資源釋放失敗" + e);
            }
        }
        return ajaxResult;
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com