面试题答案
一键面试处理服务器返回的重定向情况
在Java 11及以上版本中,HttpClient
类提供了内置的重定向处理机制。HttpClient
默认会自动处理重定向,遵循HTTP规范的重定向状态码(如301、302、303、307、308)。如果想要自定义重定向策略,可以使用HttpClient.Redirect
枚举类中的不同策略:
HttpClient.Redirect.NORMAL
:默认策略,自动处理重定向。HttpClient.Redirect.NEVER
:从不自动处理重定向,即便收到重定向响应,也不会发起新的请求。HttpClient.Redirect.ALWAYS
:总是自动处理重定向,无论重定向的类型是什么。
设置连接超时和读取超时
- 连接超时:设置连接超时是指客户端尝试与服务器建立连接的最长等待时间。可以通过
HttpClient.Builder
的connectTimeout
方法来设置。 - 读取超时:读取超时是指从服务器读取响应数据的最长等待时间。可以通过
HttpRequest.Builder
的timeout
方法来设置。
代码示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建HttpClient实例,设置连接超时为5秒
HttpClient client = HttpClient.newHttpClient()
.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
// 创建HttpRequest实例,设置读取超时为10秒
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://example.com"))
.timeout(Duration.ofSeconds(10))
.GET()
.build();
// 发送请求并获取响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 输出响应状态码和响应体
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}
}
在上述代码中:
HttpClient.newHttpClient().newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
设置了连接超时为5秒。HttpRequest.newBuilder().uri(URI.create("http://example.com")).timeout(Duration.ofSeconds(10)).GET().build();
设置了读取超时为10秒。client.send(request, HttpResponse.BodyHandlers.ofString());
发送请求并获取字符串形式的响应体。
通过这种方式,既可以处理服务器返回的重定向情况(默认自动处理),又可以设置连接超时和读取超时。