目次
1. 依存関係をインポートする
2. ツール クラスを使用する
3.
ホームページ Java &#&チュートリアル Java HttpClientを使用してHTTPリクエストを送信する方法

Java HttpClientを使用してHTTPリクエストを送信する方法

Apr 20, 2023 pm 11:49 PM
java httpclient

1. 依存関係をインポートする

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</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.3</version>
 </dependency>

 <dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpcore</artifactId>
     <version>4.4.13</version>
 </dependency>
 
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
ログイン後にコピー

2. ツール クラスを使用する

このツール クラスは、アドレス バー送信パラメーターの取得、パラメーターの取得など、get リクエストと post リクエストのためのいくつかのパラメーター受け渡しメソッドを記述しています。パラメータ、post の params パラメータ、post の json パラメータ。

import com.alibaba.fastjson.JSONObject;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class HttpClientUtil {

    private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);

    private static final int DEFULT_TIMEOUT = 30 * 1000;//默认超时时间20秒

    /**
     * 可以访问  http://localhost:9005/yzhwsj/addPersonal/1/2 这样的接口
     * @param url
     * @param headers
     * @param urlParam
     * @param timeout
     * @return
     */
    private static String doUrlGet(String url, Map<String, String> headers, List<String> urlParam, Integer timeout) {
        //创建httpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String resultString = null;
        CloseableHttpResponse response = null;
        try {
            //创建uri
            if (urlParam != null){
                for (String param : urlParam) {
                    url = url + "/" + param;
                }
            }
            //创建hTTP get请求
            HttpGet httpGet = new HttpGet(url);
            //设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpGet.setConfig(requestConfig);
            //设置头信息
            if (null != headers) {
                for (String key : headers.keySet()) {
                    httpGet.setHeader(key, headers.get(key));
                }
            }
            //执行请求
            response = httpClient.execute(httpGet);
            if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (IOException e) {
            logger.error("http调用异常" + e.toString(), e);
        } finally {
            try {
                if (null != response) {
                    response.close();
                }
            } catch (IOException e) {
                logger.error("response关闭异常" + e.toString(), e);
            }
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("httpClient关闭异常" + e.toString(), e);
            }
        }
        return resultString;
    }

    /**
     * @param url
     * @param headers
     * @param params
     * @param timeout
     * @return
     */
    private static String doGet(String url, Map<String, String> headers, Map<String, Object> params, Integer timeout) {
        //创建httpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String resultString = null;
        CloseableHttpResponse response = null;
        try {
            // 1.创建uri
            URIBuilder builder = new URIBuilder(url);
            if (params != null) {
                //uri添加参数
                for (String key : params.keySet()) {
                    builder.addParameter(key, String.valueOf(params.get(key)));
                }
            }
            URI uri = builder.build();
            // 2.创建hTTP get请求
            HttpGet httpGet = new HttpGet(uri);
            // 3.设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpGet.setConfig(requestConfig);
            // 4.设置头信息
            if (null != headers) {
                for (String key : headers.keySet()) {
                    httpGet.setHeader(key, headers.get(key));
                }
            }
            // 5.执行请求
            response = httpClient.execute(httpGet);
            if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (URISyntaxException e) {
            logger.error("http调用异常" + e.toString(), e);
        } catch (IOException e) {
            logger.error("http调用异常" + e.toString(), e);

        } finally {
            try {
                if (null != response) {
                    response.close();
                }
            } catch (IOException e) {
                logger.error("response关闭异常" + e.toString(), e);
            }
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("httpClient关闭异常" + e.toString(), e);
            }
        }
        return resultString;
    }

    /**
     * 调用http post请求(json数据)
     *
     * @param url
     * @param headers
     * @param json
     * @return
     */
    public static String doJsonPost(String url, Map<String, String> headers, JSONObject json, Integer timeout) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 1.创建http post请求
            HttpPost httpPost = new HttpPost(url);
            // 2.设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpPost.setConfig(requestConfig);
            // 3.设置参数信息
            StringEntity s = new StringEntity(json.toString(), Consts.UTF_8);
            // 发送json数据需要设置的contentType
            s.setContentType("application/json");
            httpPost.setEntity(s);
            // 4.设置头信息
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpPost.setHeader(key, headers.get(key));
                }
            }
            // 5.执行http请求
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (UnsupportedEncodingException e) {
            logger.error("调用http异常" + e.toString(), e);
        } catch (ClientProtocolException e) {
            logger.error("调用http异常" + e.toString(), e);
        } catch (IOException e) {
            logger.error("调用http异常" + e.toString(), e);
        } finally {
            try {
                if (null != response) {
                    response.close();
                }
            } catch (IOException e) {
                logger.error("关闭response异常" + e.toString(), e);
            }
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("关闭httpClient异常" + e.toString(), e);
            }
        }
        return resultString;
    }

    /**
     * 调用http post请求 基础方法
     *
     * @param url     请求的url
     * @param headers 请求头
     * @param params  参数
     * @param timeout 超时时间
     * @return
     */
    public static String doPost(String url, Map<String, String> headers, Map<String, Object> params, Integer timeout) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 1.创建http post请求
            HttpPost httpPost = new HttpPost(url);
            // 2.设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpPost.setConfig(requestConfig);
            // 3.设置参数信息
            if (params != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (String key : params.keySet()) {
                    paramList.add(new BasicNameValuePair(key, String.valueOf(params.get(key))));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, Consts.UTF_8);
                httpPost.setEntity(entity);
            }
            // 4.设置头信息
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpPost.setHeader(key, headers.get(key));
                }
            }
            // 5.执行http请求
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (UnsupportedEncodingException e) {
            logger.error("调用http异常" + e.toString(), e);
        } catch (ClientProtocolException e) {
            logger.error("调用http异常" + e.toString(), e);
        } catch (IOException e) {
            logger.error("调用http异常" + e.toString(), e);
        } finally {
            try {
                if (null != response) {
                    response.close();
                }
            } catch (IOException e) {
                logger.error("关闭response异常" + e.toString(), e);
            }
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("关闭httpClient异常" + e.toString(), e);
            }
        }
        return resultString;
    }
    
	/**
     * 通过httpClient上传文件
     *
     * @param url      请求的URL
     * @param headers  请求头参数
     * @param path     文件路径
     * @param fileName 文件名称
     * @param timeout  超时时间
     * @return
     */
    public static String UploadFileByHttpClient(String url, Map<String, String> headers, String path, String fileName, Integer timeout) {
        String resultString = "";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        InputStream content = null;
        BufferedReader in = null;
        try {
            // 1.创建http post请求
            HttpPost httpPost = new HttpPost(url);

            // 2.设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpPost.setConfig(requestConfig);

            // 3.设置参数信息
            // HttpMultipartMode.RFC6532参数的设定是为避免文件名为中文时乱码
            MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
            // 上传文件的路径
            File file = new File(path + File.separator + fileName);
            builder.setCharset(Charset.forName("UTF-8"));
            builder.addBinaryBody("file", file, ContentType.MULTIPART_FORM_DATA, fileName);
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);

            // 4.设置头信息
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpPost.setHeader(key, headers.get(key));
                }
            }

            // 5.执行http请求
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (Exception e) {
            logger.error("上传文件失败:", e);
        } finally {
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("关闭httpClient异常" + e.toString(), e);
            }
            try {
                if (null != content) {
                    content.close();
                }
            } catch (IOException e) {
                logger.error("关闭content异常" + e.toString(), e);
            }
            try {
                if (null != in) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("关闭in异常" + e.toString(), e);
            }
        }

        return resultString;
    }
 }

	/**
     * 通过httpClient批量上传文件
     *
     * @param url     请求的URL
     * @param headers 请求头参数
     * @param params  参数
     * @param paths   文件路径(key文件名称,value路径)
     * @param timeout 超时时间
     * @return
     */
    public static String UploadFilesByHttpClient(String url, Map<String, String> headers, Map<String, String> params, Map<String, String> paths, Integer timeout) {
        String resultString = "";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        InputStream content = null;
        BufferedReader in = null;
        try {
            // 1.创建http post请求
            HttpPost httpPost = new HttpPost(url);

            // 2.设置超时时间
            int timeoutTmp = DEFULT_TIMEOUT;
            if (timeout != null) {
                timeoutTmp = timeout;
            }
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeoutTmp)
                    .setConnectionRequestTimeout(timeoutTmp).setSocketTimeout(timeoutTmp).build();
            httpPost.setConfig(requestConfig);

            // 3.设置文件信息
            // HttpMultipartMode.RFC6532参数的设定是为避免文件名为中文时乱码
            MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
            builder.setCharset(Charset.forName("UTF-8"));
            // 上传文件的路径
            for (Map.Entry<String, String> m : paths.entrySet()) {
                File file = new File(m.getValue() + File.separator + m.getKey());
                builder.addBinaryBody("files", file, ContentType.MULTIPART_FORM_DATA, m.getKey());
            }

            // 4.设置参数信息
            ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8"));
            for (Map.Entry<String, String> param : params.entrySet()) {
                builder.addTextBody(param.getKey(), param.getValue(), contentType);
            }
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);

            // 5.设置头信息
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpPost.setHeader(key, headers.get(key));
                }
            }

            // 6.执行http请求
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                resultString = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }
        } catch (Exception e) {
            logger.error("上传文件失败:", e);
        } finally {
            try {
                if (null != httpClient) {
                    httpClient.close();
                }
            } catch (IOException e) {
                logger.error("关闭httpClient异常" + e.toString(), e);
            }
            try {
                if (null != content) {
                    content.close();
                }
            } catch (IOException e) {
                logger.error("关闭content异常" + e.toString(), e);
            }
            try {
                if (null != in) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("关闭in异常" + e.toString(), e);
            }
        }

        return resultString;
    }
ログイン後にコピー

3.

上のツール クラスを拡張します。すべてのメソッドはトークンとタイムアウトを運びます。インターフェイスが使用されていない場合は、インターフェイスを拡張できます。例:

/**
 * 调用http get请求
 *
 * @param url
 * @param params
 * @return
 */
public static String doGet(String url, Map<String, Object> params) {
    return doGet(url, null, params, null);
}
ログイン後にコピー

put リクエストと delete リクエストが関係する場合は、リクエストの作成時に次のように変更される点を除き、上記と同様です:

HttpDelete httpDelete = new HttpDelete();

HttpPut httpPut = new HttpPut();
ログイン後にコピー

以上がJava HttpClientを使用してHTTPリクエストを送信する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles