前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探究Java中常见的HTTP工具库

探究Java中常见的HTTP工具库

原创
作者头像
叫我阿柒啊
发布2024-01-26 02:05:45
5751
发布2024-01-26 02:05:45
举报

前言

平时做爬虫比较多,我的第一个爬虫,就是用Java的jsoup写的。爬虫说白了就是对各种网页进行请求,而发起请求就需要用到HTTP的工具库。今天就来枚举一下Java中常用的各种工具库,从代码层面分析它们的优点和缺点。

HttpURLConnection

HttpURLConnection是Java标准库java.net自带的原生HTTP客户端,Jsoup就是基于HttpURLConnection实现的,我们这里使用HttpURLConnection来实现一个简单的请求,来探究他的用法。

代码语言:java
复制
String start_url = "http://www.baidu.com";
URL url = new URL(start_url);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");

int status = con.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuilder content = new StringBuilder();
    while ((inputLine = in.readLine()) != null) {
        content.append(inputLine);
    }
    in.close();
    System.out.println(content.toString());
} else {
    System.out.println("状态码:" + status);
}
con.disconnect();

执行代码:

可以看到,HttpURLConnection使用起来比较简单,能让使用者更好地理解请求和响应的过程。但是使用者需要调用基础的api,例如创建URL,获取响应数据,需要编写大量代码。

Apache HttpClient

引入HttpClient依赖:

代码语言:xml
复制
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

使用HttpClient实现简单的请求代码。

代码语言:java
复制
String start_url = "http://www.baidu.com";

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(start_url);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        String result = EntityUtils.toString(entity, "utf-8");
        System.out.println("服务器返回的数据: " + result);
    }
} catch (IOException e) {
    e.printStackTrace();
}

执行程序,也输出了百度的首页内容。除了这种简单的用法,httpclient支持请求头等设置:

代码语言:java
复制
// 设置请求头
httpGet.addHeader("Content-Type", "application/json");
// 设置连接和读取超时时间
httpGet.setParams(RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build()); 

还可以使用连接池提高性能:

代码语言:java
复制
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100); 
CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();

除此之外,还提供了灵活的配置选项和多种定制功能,适用于处理复杂的HTTP请求身份认证、重定向、添加代理等功能。

但是过多的配置选项会让人初次使用的人产生迷茫的感觉。尤其是初学者。我在2018年第一次使用HttpClient中就对各种参数配置产生过迷茫。

OkHttp

在日常工作中,OkHttp用的比较多。从官网了解到oKHttp有以下优点:

  1. HTTP/2支持允许对同一主机的所有请求共享一个套接字。
  2. 连接池减少了请求延迟(。
  3. 透明压缩(Transparent GZIP )缩小了交互数据的大小,减轻了网络I/O负担
  4. 响应缓存完全避免了网络重复请求
  5. 当网络出现问题时,OkHttp会从常见的连接问题中静默地恢复

然后研究了一下api,看看使用OkHttp发起http请求如何实现。

代码语言:java
复制
String start_url = "http://www.baidu.com";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url(start_url)
        .build();

try {
    Response response = client.newCall(request).execute();
    ResponseBody responseBody = response.body();
    if (responseBody != null) {
        String result = responseBody.string();
        System.out.println("服务器返回的数据: " + result);
    }
} catch (IOException e) {
    e.printStackTrace();
}

执行代码输出请求:

感觉没啥缺点。。

Spring RestTemplate

Spring框架集成了RestTemplate,作为HTTP客户端依赖Spring框架,对于非Spring应用可能不太适用。

结语

上面就是我日常开发中遇到过的Http的工具库。从上面看,每种HTTP库都有自己的优势和劣势。开发者可以根据项目的具体需求来选择合适的HTTP库。对于初学者来说,可以使用HttpURLConnection进行学习,了解HTTP的请求响应其实就是I/O操作

对于复杂的HTTP请求,可以考虑使用Apache HttpClient或OkHttp,但从实际的开发应用中OkHttp使用是最广泛的,尤其是对高并发的场景。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • HttpURLConnection
  • Apache HttpClient
  • OkHttp
  • Spring RestTemplate
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档