在Java11及更高版本中使用HttpClient时,如何执行HTTP303状态代码?
在使用Java11和更高版本中的类时,如何告诉客户机按照一个命令进入重定向页面 这里有一个例子。用于获取其内容的随机页面的摘要。该URL重定向到随机选择的页面的URL。运行此代码时,我在调用在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://
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以及如何正确处理所有响应,所以这里不举一个例子。但我相信,这至少需要你:
HttpClient
配置为自动跟踪重定向要容易得多(也不太容易出错),但这种方法将为您提供更多的控制