HttpURLConnection无负载POST请求返回400状态码,前置登录已成功
解决无负载POST接口返回400状态码的问题
看起来你已经成功通过登录接口拿到了权限,但调用那个无负载的POST接口时碰上个400错误,我来给你捋几个大概率的原因和对应的解决办法:
1. 没带上登录后的会话凭证
登录成功后,服务端一般会通过Cookie或者响应头给你返回一个会话标识(比如JWT Token),要是调用第二个接口时没把这个凭证带上,服务端很可能觉得你没授权,直接返回400(有些服务不会用标准的401,反而用400表示请求不完整)。
怎么解决:
- 调用登录接口时,把响应里的Cookie存下来:用
HttpURLConnection.getHeaderFields().get("Set-Cookie")就能拿到,然后调用第二个接口的时候,通过connection.setRequestProperty("Cookie", 你存的Cookie值)把Cookie加到请求头里。 - 如果登录接口返回的是JWT Token,记得在第二个接口的请求头里加上
Authorization: Bearer <你的Token>。
2. 请求头没设置对
哪怕是无负载的POST接口,有些服务也会要求特定的请求头,比如Content-Type。要是你没加这个头,服务端可能会判定请求无效,返回400。
怎么解决:
调用第二个接口的时候,加上对应的请求头试试:
connection.setRequestProperty("Content-Type", "application/json"); // 要是服务端要求别的类型,比如application/x-www-form-urlencoded,就换对应的
3. 请求方法或URL写错了
你给出的URL是http://00.00.00.00:0000/url/vs1/site/1/login,但还是要确认下:
- 有没有不小心把请求方法写成GET了?一定要确保调用了
connection.setRequestMethod("POST")。 - URL里的路径参数(比如那个
1)是不是正确的?有没有拼写错? - IP和端口号是不是和登录接口完全一致?(看起来是一致的,但再核对一遍准没错)
4. 服务端要求无负载POST也要发空请求体
有些服务端比较严格,哪怕是无负载的POST请求,也要求你发送一个空的请求体(比如空字符串""或者空JSON{}),要是完全不发请求体,就会被判定为无效请求返回400。
怎么解决:
调用第二个接口时,试着写个空请求体:
connection.setDoOutput(true); OutputStream os = connection.getOutputStream(); os.write("".getBytes()); // 或者试试os.write("{}".getBytes()),看服务端吃哪一套 os.flush(); os.close();
5. 看看服务端的错误日志(如果能看的话)
要是上面的方法都没用,最好能去看看服务端的错误日志,400错误一般都会有详细的原因说明,比如“缺少会话Cookie”“请求头缺失”之类的,能直接帮你定位问题。
你可以按照上面的步骤挨个排查,大概率是会话凭证没带对或者请求头的问题~
内容的提问来源于stack exchange,提问作者Akshay Uttur
相关产品推荐
相关产品推荐

