HttpClient之HTTP工具类

本文介绍如何使用 HttpClient 封装 GET 和 POST 请求方法,并提供了一个 Java 工具类实现。文章详细解释了 HttpClient 的概念、用途及使用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有了HttpClient对象,我们就可以把一些常用的发出GET和POST请求的代码也封装起来,写进我们的工具类中了。以下是我对GET和POST请求并返回响应字符串的方法。

1、什么是httpclient

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。而HttpClient 它支持 HTTP 协议最新的版本和建议。

2、HttpClient 不是浏览器

HttpClient 不是浏览器,它是一个客户端 HTTP 协议传输类库。HttpClient 被用来发送和接受 HTTP 消息。HttpClient 不会处理 HTTP 消息的内容,不会进行 javascript 解析,不会关心 content type,如果没有明确设置,HttpClient 也不会对请求进行格式化、重定向 url,或者其他任何和 HTTP 消息传输相关的功能。

3、 HttpClient使用流程

1、创建HttpClient对象。

2、创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3、如果需要发送请求参数,可调用HttpGetsetParams方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。

4、调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse对象。
5、调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6、释放连接。无论执行方法是否成功,都必须释放连接

 

工具类

所需jar包:

<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.7</version>
</dependency>
<!-- 异步httpclient(httpasynclient) -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpasyncclient</artifactId>
    <version>4.0-alpha3</version>
</dependency>

HttpUtils:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * http 工具类
 * TODO 改进:httpClient连接池
 * @author Zhang
 */
public final class HttpUtils {

    private HttpUtils() {
        throw new AssertionError("不能产生实例");
    }

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

    /**
     * 进行get请求
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doGet(String url, String params) throws IOException {
        return doGet(url, null, params);
    }

    /**
     * 进行get请求
     * @param url 访问地址
     * @param headers 请求头
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doGet(String url, Map<String, String> headers, String params) throws IOException {
        logger.info("the url is {}", url);
        logger.info("the request params is {}", params);
        HttpGet get = new HttpGet(url + '?' + params);
        if (headers != null) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                get.addHeader(entry.getKey(), entry.getValue());
            }
        }
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpResponse res = httpClient.execute(get);
            int status = res.getStatusLine().getStatusCode();
            logger.info("the response status is {}", status);
            if (status != HttpStatus.SC_OK) {
                throw new IOException("请求失败,响应码是:" + status);
            }
            String resText = EntityUtils.toString(res.getEntity(), "UTF-8");
            logger.info("the response is {}", resText);
            return resText;
        } finally {
            get.releaseConnection();
        }
    }

    /**
     * 进行get请求
     * @param url 访问地址
     * @param headers 请求头
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doGet(String url, Map<String, String> headers, Map<String, String> params) throws IOException {
        String query = "";
        if (params != null && !params.isEmpty()) {
            StringBuilder s = new StringBuilder();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                s.append(entry.getKey()).append('=').append(entry.getValue()).append('&');
            }
            s.setLength(s.length() - 1);
            query = s.toString();
        }
        return doGet(url, headers, query);
    }

    /**
     * 进行post请求
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPost(String url, String params, String contentType, String charset) throws IOException {
        logger.info("the params is {}", params);
        HttpEntity entity = new StringEntity(params, ContentType.create(contentType, charset));
        return doPost(url, entity);
    }

    /**
     * 进行post请求
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPost(String url, String params) throws IOException {
        return doPost(url, params, "application/x-www-form-urlencoded", "UTF-8");
    }

    /**
     * 进行post请求
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPostJson(String url, String params) throws IOException {
        return doPost(url, params, "application/json", "UTF-8");
    }

    /**
     * 进行post请求
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPost(String url, Map<String, String> params) throws IOException {
        logger.info("the request params is {}", params);
        // 添加参数
        List<NameValuePair> list = new ArrayList<>(params.size());
        for (Map.Entry<String, String> entry : params.entrySet()) {
            list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
        }
        HttpEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
        return doPost(url, entity);
    }

    /**
     * 进行post请求
     * @param url 访问地址
     * @param entity 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPost(String url, HttpEntity entity) throws IOException {
        logger.info("the url is {}", url);
        HttpPost post = new HttpPost(url);
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            post.setEntity(entity);
            HttpResponse res = httpClient.execute(post);
            int status = res.getStatusLine().getStatusCode();
            logger.info("the response status is {}", status);
            if (status != HttpStatus.SC_OK) {
                throw new IOException("请求失败,响应码是:" + status);
            }
            String resText = EntityUtils.toString(res.getEntity(), "UTF-8");
            logger.info("the response is {}", resText);
            return resText;
        } finally {
            post.releaseConnection();
        }
    }

    /**
     * 进行post,提交文件
     * @param url 访问地址
     * @param params 参数
     * @return 响应
     * @throws IOException 请求失败
     */
    public static String doPostFile(String url, Map<String, Object> params) throws IOException {
        logger.info("the params is {}", params);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        Object obj;
        // 解决中文乱码
        ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8"));
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            obj = entry.getValue();
            if (obj == null) { continue; }
            logger.info("the name is {}, the value is {}", entry.getKey(), obj);
            if (obj instanceof File) {
                File f = (File) obj;
                String name = f.getName();
                ContentType type;
                if (name.endsWith(".jpg")) {
                    type = ContentType.create("image/jpg");
                } else if (name.endsWith(".png")) {
                    type = ContentType.create("image/png");
                } else if (name.endsWith(".jpeg")) {
                    type = ContentType.create("image/jpeg");
                } else {
                    type = ContentType.DEFAULT_BINARY;
                }
                builder.addBinaryBody(entry.getKey(), f, type, f.getName());
            } else if (obj instanceof InputStream) {
                builder.addBinaryBody(entry.getKey(), (InputStream) obj);
            } else if (obj instanceof byte[]) {
                builder.addBinaryBody(entry.getKey(), (byte[]) obj);
            } else if (obj instanceof String) {
                builder.addTextBody(entry.getKey(), (String) obj, contentType);
            } else {
                builder.addTextBody(entry.getKey(), String.valueOf(obj), contentType);
            }
        }
        return doPost(url, builder.build());
    }
}
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值