在Java11及更高版本中使用HttpClient时,如何执行HTTP303状态代码?

在Java11及更高版本中使用HttpClient时,如何执行HTTP303状态代码?,java,http-redirect,java-http-client,Java,Http Redirect,Java Http Client,在使用Java11和更高版本中的类时,如何告诉客户机按照一个命令进入重定向页面 这里有一个例子。用于获取其内容的随机页面的摘要。该URL重定向到随机选择的页面的URL。运行此代码时,我在调用HttpResponse#toString时看到303。但是我不知道如何告诉客户机类跟随新的URL HttpClient=HttpClient.newHttpClient(); HttpRequest请求= HttpRequest .newBuilder() .uri(uri.create(“https://

在使用Java11和更高版本中的类时,如何告诉客户机按照一个命令进入重定向页面

这里有一个例子。用于获取其内容的随机页面的摘要。该URL重定向到随机选择的页面的URL。运行此代码时,我在调用
HttpResponse#toString
时看到
303
。但是我不知道如何告诉客户机类跟随新的URL

HttpClient=HttpClient.newHttpClient();
HttpRequest请求=
HttpRequest
.newBuilder()
.uri(uri.create(“https://en.wikipedia.org/api/rest_v1/page/random/summary" ) )
.build();
尝试
{
HttpResponseresponse=client.send(请求,HttpResponse.BodyHandlers.ofString());
System.out.println(“response=“+response”);//⬅️ 我们可以看到'303'状态码。
字符串body=response.body();
System.out.println(“body=“+body”);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
捕捉(中断异常e)
{
e、 printStackTrace();
}
运行时:

响应=(获取)303

身体=

问题 你正在使用。该方法的文件说明:

返回带有默认设置的新
HttpClient

相当于
newBuilder().build()

默认设置包括:“GET”请求方法、HTTP/2首选项、从不重定向策略、
[emphasis added]、默认代理选择器和默认SSL上下文

正如所强调的,您正在创建一个重定向策略为
NEVER
HttpClient


解决方案 你的问题至少有两种解决方案

自动跟踪重定向 如果要自动执行重定向,则需要使用(而不是
#newHttpClient()
)来配置要构建的客户端。具体来说,在构建客户端之前,需要使用适当的重定向策略调用。例如:

HttpClient客户端=
HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)//跟随重定向
.build();
不同的重定向策略由枚举指定:

定义自动重定向策略

每当收到
3XX
响应代码时,就会检查自动重定向策略。如果重定向没有自动发生,则返回包含
3XX
响应代码的响应,可以手动处理

有三个常量:
始终
从不
,和
正常
。前两个的含义从它们的名字中显而易见。最后一个名为
NORMAL
,其行为与
始终
类似,只是它不会从
https
url重定向到
http
url

手动跟踪重定向 如
HttpClient.Redirect
文档中所述,您可以手动执行重定向。我不太熟悉HTTP以及如何正确处理所有响应,所以这里不举一个例子。但我相信,这至少需要你:

  • 检查响应的状态代码
  • 如果代码指示重定向,请从中获取新URI
  • 如果新URI是相对的,则根据请求URI解析它
  • 发送新请求
  • 根据需要重复1-4次
  • 显然,将
    HttpClient
    配置为自动跟踪重定向要容易得多(也不太容易出错),但这种方法将为您提供更多的控制