httpcomponents-client-4.5.3 学习笔记(2) 1.2 HttpClient接口

HttpClient是线程安全的

CloseableHttpClient 使用完以后需要关闭

CloseableHttpClient httpclient = HttpClients.createDefault();
try {
    <...>
} finally {
    httpclient.close();
}

HttpContext就像一个Map

里面包含着各种值:

HttpConnection Http连接

HttpHost  Http连接的目标服务器

HttpRoute  Http完整的连接路由信息

HttpRequest Http请求

HttpResponse Http响应

RequestConfig Http请求设置

Boolean 是否连接到目标服务器的标识

List<URI> 请求执行过程中接收到的所有重定向位置的集合

你可以用适配器获取你需要的这些信息:

HttpContext context = <...>
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpHost target = clientContext.getTargetHost();
HttpRequest request = clientContext.getRequest();
HttpResponse response = clientContext.getResponse();
RequestConfig config = clientContext.getRequestConfig();

你可以在两个不同的请求中共用一个HttpContext:

CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom()
        .setSocketTimeout(1000)
        .setConnectTimeout(1000)
        .build();

HttpGet httpget1 = new HttpGet("http://localhost/1");
httpget1.setConfig(requestConfig);
CloseableHttpResponse response1 = httpclient.execute(httpget1, context);
try {
    HttpEntity entity1 = response1.getEntity();
} finally {
    response1.close();
}
HttpGet httpget2 = new HttpGet("http://localhost/2");
CloseableHttpResponse response2 = httpclient.execute(httpget2, context);
try {
    HttpEntity entity2 = response2.getEntity();
} finally {
    response2.close();
}

重发请求控制:

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {

    public boolean retryRequest(
            IOException exception,
            int executionCount,
            HttpContext context) {
        if (executionCount >= 5) {
            // Do not retry if over max retry count
            return false;
        }
        if (exception instanceof InterruptedIOException) {
            // Timeout
            return false;
        }
        if (exception instanceof UnknownHostException) {
            // Unknown host
            return false;
        }
        if (exception instanceof ConnectTimeoutException) {
            // Connection refused
            return false;
        }
        if (exception instanceof SSLException) {
            // SSL handshake exception
            return false;
        }
        HttpClientContext clientContext = HttpClientContext.adapt(context);
        HttpRequest request = clientContext.getRequest();
        boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
        if (idempotent) {
            // Retry if the request is considered idempotent
            return true;
        }
        return false;
    }

};
CloseableHttpClient httpclient = HttpClients.custom()
        .setRetryHandler(myRetryHandler)
        .build();

重定向控制:

LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();
CloseableHttpClient httpclient = HttpClients.custom()
        .setRedirectStrategy(redirectStrategy)
        .build();

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpClientContext context = HttpClientContext.create();
HttpGet httpget = new HttpGet("http://localhost:8080/");
CloseableHttpResponse response = httpclient.execute(httpget, context);
try {
    HttpHost target = context.getTargetHost();
    List<URI> redirectLocations = context.getRedirectLocations();
    URI location = URIUtils.resolve(httpget.getURI(), target, redirectLocations);
    System.out.println("Final HTTP location: " + location.toASCIIString());
    // Expected to be an absolute URI
} finally {
    response.close();
}




HttpClient可以使用MultipartEntityBuilder来添加form-data。 首先需要导入以下包: ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; ``` 然后可以使用以下代码片段来添加form-data: ```java // 创建HttpClient对象 HttpClient httpClient = HttpClients.createDefault(); // 创建HttpPost对象 HttpPost httpPost = new HttpPost(url); // 创建MultipartEntityBuilder对象 MultipartEntityBuilder builder = MultipartEntityBuilder.create(); // 添加form-data参数 builder.addTextBody("key1", "value1"); builder.addTextBody("key2", "value2"); // 构建HttpEntity对象 HttpEntity entity = builder.build(); // 将HttpEntity对象设置到HttpPost对象中 httpPost.setEntity(entity); // 发送HttpPost请求,并获取HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpPost); // 获取响应状态码 int statusCode = httpResponse.getStatusLine().getStatusCode(); // 获取响应字符串 String responseString = EntityUtils.toString(httpResponse.getEntity()); ``` 其中,`url`为请求的URL地址,`key1`和`key2`为form-data字段名,`value1`和`value2`为form-data字段值。 需要注意的是,如果要上传文件,可以使用`addBinaryBody`方法来添加文件,具体使用方法可以参考[MultipartEntityBuilder](https://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntityBuilder.html)文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值