大家好,我是烤鸭:
    记一次 由 HttpsURLConnection 引起的返回值400的错误。

1.   场景复现

今天线上调用第三方接口的时候突然报错了。
     严格来说也不是报错,就是发的请求不通了,http报400的错误。
     问了下对接方,也没有改代码,我们这边也没什么大的改动。
     奇了怪了。。。
     这是请求原来的代码

HttpsURLConnection conn = (HttpsURLConnection) reqURL.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("User-Agent", "stargate");
conn.setRequestProperty("Content-Type", "application/json");
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
osw.write(reqStr);
osw.flush();
osw.close();

这是改动的地方,加了句log。

OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
log.info("【返回值】"+conn.getResponseCode());
osw.write(reqStr);
osw.flush();
osw.close();

2.    寻找问题

把改动的地方逐步还原,最后发现是log的问题。
    log是没有问题,问题在于 conn.getResponseCode()。
    conn.getOutputStream() 获取连接的输出流,准备向对方发送(写入)数据的时候,
    调用conn.getResponseCode() 报错。为什么呢。一步步看。

getInputStream方法中调用的是getInputStream0()。

public synchronized InputStream getInputStream() throws IOException {this.connecting = true;SocketPermission var1 = this.URLtoSocketPermission(this.url);if (var1 != null) {try {return (InputStream)AccessController.doPrivilegedWithCombiner(new PrivilegedExceptionAction<InputStream>() {public InputStream run() throws IOException {return HttpURLConnection.this.getInputStream0();}}, (AccessControlContext)null, var1);} catch (PrivilegedActionException var3) {throw (IOException)var3.getException();}} else {return this.getInputStream0();}}

getInputStream0方法中


    if setDoInput(true)
    if else 抛出rememberedException异常
    if else 输入流不为空
    else 输出的方式是否是流的形式
    往对应的服务器写一段文字,主要调用的是这个方法

writeRequests,看是否正常响应,响应后关闭流。
    看到这大概就明白了。

3.    总结

调用 conn.getOutputStream() 获取连接的输出流,等待内容写入。(连接是阻塞的,BIO)
    此时调用 conn.getResponseCode() 会向服务器写入其他的东西(一个8192byte的字符串),
    写入完成后,flush 再close。这时对接方的服务器发现获取到的东西并不是指定格式传输的内容,
    就报400了。

关于400的说明—— HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里

https://www.cnblogs.com/beppezhang/p/5824986.html
    不能忽略每一次小的改动。一句小小的log都可能导致问题,还有就是要多测试。

HttpsURLConnection 返回 400相关推荐

  1. 远程服务器返回了意外响应400,远程服务器返回400

    远程服务器返回400 内容精选 换一换 打开运行窗口,输入gpedit.msc,打开本地组策略编辑器.打开组策略升级到V3.3.26.0及以上的版本需要执行该操作,V3.3.26.0之前的版本不执行本 ...

  2. android 数据回传代码,安卓向.net core api传输图片,执行保存到数据库命令后返回400错误代码,用postman测试没有问题安卓程序不行...

    安卓向.net core api传输图片,执行保存到数据库命令后返回400错误代码,用postman测试没有问题安卓程序不行,其他api没有问题,在执行保存到数据库命令之前也没有问题.希望各位大佬可以 ...

  3. PostMan发送请求参数带有路径特殊字符会返回400错误(与URL字符及URL编码值有关)

    目录 一.请求参数中携带URL字符返回400错误 二. 请求参数中携带URL字符返回400错误原因 三.URL字符及对应的URL编码值列表 四.请求参数中携带URL字符转成URL编码值 一.请求参数中 ...

  4. 请求头有问题导致Nginx返回400状态码

    背景 上个星期有人找我看了Nginx的问题,场景是这样的,用户访问一个网址,这个网址有一个按钮,点击这个按钮后会跳转到新的页面,但这个跳转,有时候可以,有时候不可以--不可以的时候页面显示400状态码 ...

  5. axios发送post请求返回400状态码

    axios发送post请求返回400状态码 今天在用 axios 发送一个跨域的post请求时,遇到了一个坑:Uncaught (in promise) Error: Request failed w ...

  6. get请求400错误 vue_解决axios发送post请求返回400状态码的问题

    今天在用 发送一个跨域的post请求时,遇到了一个坑:uncaught (in promise) error: request failed with status code 400. 前台代码如下: ...

  7. nginx返回400状态码

    分析: 1.后端地址正常返回200: 2.确认是url加上参数后,nginx返回400,并且nginx除了400状态码的访问日志,没有输出其他异常日志: nginx地址: https://test.c ...

  8. 海康NVR中INVITE请求一直返回 400 Bad Request

    最近对接海康NVR设备一直返回 400 Bad Request 如下: 首先我查询了via/from/to/subject/contact确认都没问题,然后测试总是出现下问题 INVITE sip:4 ...

  9. https返回400_httpClient 返回400

    场景:为何HttpClient请求返回400,URL请求返回302正常 为什么HttpClient请求返回400,URL请求返回302正常? 今天在做http请求的时候,发现了一个很别扭的地方. 我使 ...

最新文章

  1. layui中laydate兼容ie_layui菜鸟教程--乐字节前端
  2. OpenVirteX 安装
  3. Python【每日一问】36
  4. 修改centos7容器的时间和宿主机时间一致
  5. 【内核驱动】 Linux内核源码查看方法(基于Vim)
  6. Spring Cloud构建微服务架构—服务消费Ribbon
  7. Android APP 引导页实现-第一次应用进入时加载
  8. ActiveMQ 依赖JDK版本
  9. [knowledge][basic][hardware] 内存的硬件结构(转)
  10. 原生态mysql_MySQL 原生操作-速查
  11. 计算机英语900句.pdf,计算机英语900句第一章第一课:概貌
  12. linux mysql恢复数据_Mysql数据恢复和备份
  13. jquery 全国 三联 地址选择
  14. linux从入门到精通 第2版 pdf
  15. Android-APP 安全(六)之android取证
  16. 取消WIN10上shift键切换中英文输入法的设置
  17. 简单的WOW DKP系统
  18. Linux:UID和EUID
  19. Hangfire Pro 2022-08-31 update
  20. 推荐10个实用的日常开发和写作必备工具

热门文章

  1. [html] input上传图片怎样触发默认拍照功能?
  2. [html] H5页面在微信中如何禁止分享给好友和朋友圈?
  3. [jQuery] jQuery和Zepto的区别?各自的使用场景?
  4. [vue] vue如何优化首页的加载速度?
  5. [css] 使用css将图片转换成黑白的效果
  6. 工作233:定义有对话框的按钮
  7. “约见”面试官系列之常见面试题之第八十六篇之nexttick(建议收藏)
  8. java学习(21):移位运算符
  9. 断路器操作机构分合闸线圈电流特征曲线特点
  10. Qt C++ 命名空间namespaces讲解