1. 简介
在本教程中,我们将探索几个用于在Java中将HTTP响应主体读取为字符串的库。自第一个版本以来,Java就提供了HttpURLConnection API,该API仅包含基本功能,并且以不太用户友好而闻名。
在JDK 11中,Java引入了全新改进的HttpClient API来处理HTTP通信。我们将讨论这些库,并介绍一些替代方案,例如Apache HttpClient和Spring Rest Template。
2. HttpClient
如前所述,HttpClient已添加到Java 11中,它允许我们通过网络访问资源,但与HttpURLConnection不同,HttpClient支持HTTP/1.1和HTTP/2。此外,它还提供了同步和异步请求类型。
HttpClient提供了一个灵活且功能强大的现代API,该API由三个核心类组成:HttpClient、HttpRequest和HttpResponse。
HttpResponse描述了HttpRequest调用的结果,HttpResponse不会直接创建,而是在请求体完全接收后才可用。
要将响应主体读取为字符串,我们首先需要创建简单的客户端和请求对象:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(DUMMY_URL))
.build();
然后我们将使用BodyHandlers并调用方法ofString()来返回响应:
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. HttpURLConnection
HttpURLConnection是一个轻量级的HTTP客户端,用于通过HTTP或HTTPS协议访问资源,它允许我们创建一个InputStream。获取到InputStream后,我们就可以像读取普通本地文件一样读取它。
在Java中,我们可以用来访问互联网的主要类是java.net.URL类和java.net.HttpURLConnection类。首先,我们使用URL类指向一个Web资源。然后,我们可以使用HttpURLConnection类来访问它。
要从URL获取响应主体作为String,我们应该首先使用URL创建一个HttpURLConnection:
HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection();
new URL(DUMMY_URL).openConnection()返回一个HttpURLConnection对象,该对象允许我们添加标头或检查响应码。
接下来,我们从connection对象中获取InputStream:
InputStream inputStream = connection.getInputStream();
最后,我们需要将InputStream转换为String。
4. Apache HttpClient
在本节中,我们将学习如何使用Apache HttpClient将HTTP响应主体读取为字符串。
要使用这个库,我们需要将它的依赖添加到我们的Maven项目中:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2</version>
</dependency>
我们可以通过CloseableHttpClient类检索和发送数据,要使用默认配置创建它的实例,我们可以使用HttpClients.createDefault()。
CloseableHttpClient提供了一个执行方法来发送和接收数据,该方法使用两个参数,第一个参数是HttpUriRequest类型,该类型有许多子类,包括HttpGet和HttpPost;第二个参数是HttpClientResponseHandler类型,它从ClassicHttpResponse生成一个响应对象。
首先,我们创建一个HttpGet对象:
HttpGet request = new HttpGet(DUMMY_URL);
其次,我们将创建客户端:
CloseableHttpClient client = HttpClients.createDefault();
最后,我们将从execute方法的结果中检索响应对象:
String response = client.execute(request, new BasicHttpClientResponseHandler());
logger.debug("Response -> {}", response);
这里我们使用了BasicHttpClientResponseHandler,它将响应主体作为字符串返回。
5. Spring RestTemplate
在本节中,我们将演示如何使用Spring RestTemplate将HTTP响应主体读取为字符串。需要注意的是,RestTemplate现已弃用,因此,我们应该考虑使用Spring WebClient,如下一节所述。
RestTemplate类是Spring提供的一个重要工具,它提供了一个简单的模板,用于通过底层HTTP客户端库(例如JDK HttpURLConnection、Apache HttpClient等)进行客户端HTTP操作。
RestTemplate提供了一些用于创建HTTP请求和处理响应的有用方法。
我们可以通过首先向Maven项目添加一些依赖来使用这个库:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
为了发出Web请求并以字符串形式返回响应主体,我们将创建一个RestTemplate实例:
RestTemplate restTemplate = new RestTemplate();
然后,我们通过调用getForObject()方法获取响应对象,并传入URL和所需的响应类型,在本例中使用String.class:
String response = restTemplate.getForObject(DUMMY_URL, String.class);
6. Spring WebClient
最后,我们将介绍如何使用Spring WebClient,它是替代Spring RestTemplate的响应式、非阻塞解决方案。
我们可以通过将spring-boot-starter-webflux依赖添加到Maven项目来使用这个库:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
创建客户端最简单方法是使用create方法:
WebClient webClient = WebClient.create(DUMMY_URL);
执行HTTP Get请求最简单的方法是调用get和retrieve方法,然后,我们将使用bodyToMono方法和String.class类型将请求体提取为单个String实例:
Mono<String> body = webClient.get().retrieve().bodyToMono(String.class);
最后,我们将调用block方法来告诉WebFlux等待,直到整个body流被读取并复制到String结果中:
String s = body.block();
7. 总结
在本文中,我们学习了如何使用几个库将HTTP响应主体读取为String。
Post Directory
