java之net.http.HttpClient详解

HttpClient的主要特点

  1. 支持同步和异步请求:HttpClient可以发送同步和异步的HTTP请求。同步请求会阻塞当前线程,直到收到响应或发生超时。异步请求则不会阻塞线程,可以通过回调函数或Future对象来处理响应。
  2. 连接管理:HttpClient可以自动管理HTTP连接的生命周期,包括连接的建立、重用和释放。它支持连接池,可以重用已经建立的连接,减少连接的建立和关闭的开销。
  3. 请求和响应拦截器:HttpClient提供了拦截器机制,可以在发送请求和处理响应的过程中进行自定义操作。拦截器可以用于添加认证信息、修改请求头、处理响应等。
  4. 支持HTTPS:HttpClient可以与使用SSL/TLS协议保护的HTTPS服务器进行通信。它支持证书验证、主机名验证和安全协议的选择。
  5. 支持代理:HttpClient可以通过代理服务器发送请求,支持HTTP和SOCKS代理。
  6. 支持重定向:HttpClient可以自动处理HTTP重定向,包括301和302状态码的重定向。
  7. 支持Cookie管理:HttpClient可以自动处理HTTP Cookie,包括发送和接收Cookie,以及保存和管理Cookie。
  8. 支持连接超时和读取超时设置:HttpClient可以设置连接超时和读取超时,以防止请求长时间无响应。

需要手动关闭吗

Java 11(8需要手动)的HttpClient中,不需要手动关闭HttpClient。HttpClient内部使用的是非阻塞的IO,不持有任何需要显式关闭的资源,比如Socket或者文件句柄。这是一个很大的改进,因为它意味着你不再需要在finally块中关闭资源,这样可以使代码更简洁,更易于阅读和维护。

性能问题

**HttpClient的实例是重量级的对象,它的创建和配置都需要消耗一定的系统资源。一般来说,为了提高效率,应该尽可能重用HttpClient实例,而不是为每个请求都新建一个。尤其是在处理大量请求的情况下,重用HttpClient**实例可以显著提高性能。

线程问题

HttpClient实例可以被多个线程共享,但HttpRequest和HttpResponse实例是不可变的,且不应被多个线程共享。所以每个请求要创建新的HttpRequest和HttpResponse实例。

代码实现:

使用HttpClient发送GET请求的示例代码
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;

public class HttpClientExample {
    public static void main(String[] args) {
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpGet httpGet = new HttpGet("https://api.example.com/data");
        
        try {
            HttpResponse response = httpClient.execute(httpGet);
            String responseBody = EntityUtils.toString(response.getEntity());
            
            System.out.println("Response Code: " + response.getStatusLine().getStatusCode());
            System.out.println("Response Body: " + responseBody);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用HttpClient设置重定向请求的示例代码
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class Main {

    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder()
            .followRedirects(HttpClient.Redirect.NORMAL) 
            .build();

        HttpRequest request = HttpRequest.newBuilder()
            .uri(new URI("http://example.com")) 
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用org.apache.http.client.HttpClient上传文件的Java示例: ```java import java.io.File; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.client.ClientProtocolException; 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.HttpClientBuilder; import org.apache.http.util.EntityUtils; public class FileUploader { public static void main(String[] args) { String url = "http://example.com/upload"; String filePath = "/path/to/file.jpg"; HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(url); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("file", new File(filePath)); HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); try { httpClient.execute(httpPost); HttpEntity responseEntity = httpResponse.getEntity(); String responseString = EntityUtils.toString(responseEntity, "UTF-8"); System.out.println(responseString); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在此示例中,我们使用HttpClient创建一个HttpPost请求对象,并使用MultipartEntityBuilder创建一个multipart/form-data实体,以便我们可以将文件作为二进制数据添加到请求中。最后,我们使用execute方法将请求发送到服务器,并从响应中提取响应字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值