关于Java的HttpURLConnection重定向问题 响应码303

news/2025/2/5 2:35:29/

我有一个Java函数,发送了一个POST请求,并获取响应头的Headers,使用 java.net.http 库能正常运行。

伪代码如下

java">private static String loginPhone() throws Exception {String url1 = "https://api-user.xxx";String data1 = String.format("xxx=%s&redirect_uri=%s&xxx=xxx", CLIENT_ID, REDIRECT_URI);HttpRequest request1 = HttpRequest.newBuilder().uri(new URI(url1)).header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8").header("User-Agent", USER_AGENT).POST(HttpRequest.BodyPublishers.ofString(data1)).build();HttpResponse<String> response1 = HttpClient.newHttpClient().send(request1, HttpResponse.BodyHandlers.ofString());String location = response1.headers().firstValue("XXX").orElse("");return location;}

现在我想把代码移植到Android,但是由于Android取缔了java.net.http,只能用HttpURLConnection,所以要对代码进行修改。

修改后伪代码如下

java">    private void loginPhone() throws Exception {String url1 = "https://api-user.xxxxx";String data1 = String.format("client_id=%s&redirect_uri=%s&xxx=xxx", CLIENT_ID, REDIRECT_URI);String location = sendPostRequest4Headers(url1, data1);System.out.println("location->" + location);}private String sendPostRequest4Headers(String urlStr, String data) throws Exception {HttpURLConnection connection = (HttpURLConnection) new URL(urlStr).openConnection();connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", CONTENT_TYPE);connection.setRequestProperty("User-Agent", MI_FIT_USER_AGENT);connection.setDoOutput(true);try (OutputStream os = connection.getOutputStream()) {byte[] input = data.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);os.flush();}// 获取响应状态码int responseCode = connection.getResponseCode();System.out.println("responseCode->" + responseCode);if (responseCode == 303) {// 获取重定向的 URLString location = connection.getHeaderField("XXX");System.out.println("XXX->" + location);return location;} else {return "";}}

貌似一切顺利,但是获取的结果就是不一样。下面的,始终无法让响应码为303,始终是200。

表明通信成功?!没有重定向?

最后调试了很久,发现原来HttpURLConnection有一个函数 的getInstanceFollowRedirectssetInstanceFollowRedirects

隐约意识到这就是问题所在。

这两个函数的解释如下:

getInstanceFollowRedirects

  • 功能:该方法用于获取HttpURLConnection实例是否自动遵循重定向的当前设置。在进行 HTTP 请求时,服务器可能会返回重定向响应,告知客户端请求的资源已移动到其他位置。此方法能让开发者了解当前连接是否会自动处理这些重定向。
  • 返回值:返回一个boolean值,true表示当前实例会自动遵循重定向,即会自动根据服务器返回的重定向信息继续发送请求到新的地址;false则表示不会自动遵循,需要开发者手动处理重定向。
  • 示例
HttpURLConnection connection = (HttpURLConnection) new URL("https://example.com").openConnection();
boolean followRedirects = connection.getInstanceFollowRedirects();
System.out.println("是否自动遵循重定向:" + followRedirects);

setInstanceFollowRedirects

  • 功能:用于设置HttpURLConnection实例是否自动遵循重定向。通过此方法,开发者可以根据具体需求来决定连接在遇到重定向时的行为。
  • 参数:接受一个boolean类型的参数,true表示设置该连接实例自动遵循重定向,false表示不自动遵循。
  • 示例
HttpURLConnection connection = (HttpURLConnection) new URL("https://example.com").openConnection();
connection.setInstanceFollowRedirects(false);
// 进行连接等后续操作

在实际应用中,如果不想让连接自动处理重定向,以便自己对重定向进行更精细的控制,比如记录重定向的次数、检查重定向的目标等,就可以将其设置为false

看AI给的建议,将此处设为false。成功。

成功的伪代码:

java">    private String sendPostRequest4Headers(String urlStr, String data) throws Exception {HttpURLConnection connection = (HttpURLConnection) new URL(urlStr).openConnection();connection.setRequestMethod("POST");connection.setInstanceFollowRedirects(false);connection.setRequestProperty("Content-Type", CONTENT_TYPE);connection.setRequestProperty("User-Agent", USER_AGENT);connection.setDoOutput(true);try (OutputStream os = connection.getOutputStream()) {byte[] input = data.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);os.flush();}// 获取响应状态码int responseCode = connection.getResponseCode();System.out.println("responseCode->" + responseCode);if (responseCode == 303) {// 获取重定向的 URLString location = connection.getHeaderField("XXX");System.out.println("XXX->" + location);return location;} else {return "";}}

原来一直不一致,是因为进行了重定向处理,难道java.net.http 库不会自动重定向?

在 Java 的java.net.http库中,默认情况下,HttpClient进行 POST 请求时会自动处理重定向。

HttpClient遵循 HTTP 协议的重定向规则,当服务器返回重定向状态码(如 301、302、303、307、308 等)时,HttpClient会自动根据重定向的目标地址发起新的请求。

以下是一个简单的示例代码:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;public class HttpPostRedirectExample {public static void main(String[] args) throws Exception {HttpClient client = HttpClient.newBuilder().build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://example.com/somePath")).POST(HttpRequest.BodyPublishers.ofString("param=value")).build();// 发送请求并获取响应CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());HttpResponse<String> response = responseFuture.get();System.out.println("状态码: " + response.statusCode());System.out.println("响应体: " + response.body());}
}

在上述代码中,如果请求的地址发生了重定向,HttpClient会自动处理,最终response会包含重定向后的最终响应结果。

如果不想让HttpClient自动处理重定向,可以在创建HttpClient时通过followRedirects方法进行设置,例如:

HttpClient client = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NEVER).build();

上述代码通过followRedirects(HttpClient.Redirect.NEVER)设置了HttpClient不自动处理重定向。

 


http://www.ppmy.cn/news/1569397.html

相关文章

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…

常用的npm镜像源配置方法

常用的npm镜像源配置方法 常用的npm镜像源配置方法一、切换到淘宝镜像源二、切换到腾讯云镜像源三、切换到华为云镜像源四、通过淘宝提供的 cnpm 工具安装包 常用的npm镜像源配置方法 一、切换到淘宝镜像源 配置命令&#xff1a; npm config set registry https://registry.np…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

【Elasticsearch】_rollover API详解

解释 POST logs-foo-bar/_rollover 在Elasticsearch中&#xff0c;POST logs-foo-bar/_rollover 是一个API调用&#xff0c;用于触发索引的滚动操作。滚动操作允许您在索引达到一定大小或时间限制时&#xff0c;自动将写入操作切换到一个新的索引&#xff0c;同时保留旧索引的…

智慧城市(城市大脑)建设方案

城市建设面临的挑战 快速发展的城市面临着诸多挑战&#xff0c;如数据壁垒、缺乏数据整合、数据价值挖掘不足&#xff0c;以及应急指挥手段传统等问题。这些问题制约了城市管理的效率和效果&#xff0c;亟待解决。 智慧城市建设背景 在国家治理现代化战略的大背景下&#x…

Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 多步表单 2. 选项卡界面 3. 状态机界面 三、常见样式 四、属性设置 1. 页面管理 2. 布局管理 3. 信号与槽 五、内容处理 1. 添加页面 2. 移除页面 3.…

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果

WPF进阶 | WPF 动画特效揭秘&#xff1a;实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…