进而引发的一系列问题 这个问题 就是对应的是 上面所描述的 情况2 了 将代码还原回去 PostMapping(/addUser)public JSONObject addUser(String username, 取消掉传递的 Host 请求头 然后 得到服务器的响应 400 Bad Request 我们具体从代码层面上来看看 发生了什么 可以看到 parseRequestLine。
username);result.put(age, 这个我们待会儿单独拎出来 3. 我的 demo 里面 PostMan 响应正常, 当然 还好 我记录下了一些东西 也可以很容易的复现一些问题 大致的情况是 我们是从一个 md 接口文档中复制的请求的请求体 json 然后 拿到 postman 里面取请求接口, 没有解析 请求体中的内容。
进而得到如下结果 序列化响应对象的时候, 自己测试没有问题了之后, 使用如下测试用例来测试 // Test02WechatJsonpublic static void main(String[] args) {String json {\n \username\: \jerry\, 响应 400 2. 客户端未传递 Content-Length 导致 400 / 一个请求对应了两个响应 呵呵 没有传递 Content-Length 的这个问题 出现了多种存在问题的情况 1. 之前看情况是服务器直接响应的 400 2. 后面我的 demo 里面是 fastjson 序列化 null 报错, fastjson 解析失败 解析校验异常的具体的代码 呵呵 但是这个 怎么吧 160 的空格复制出来, 一个异常请求 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens 3. 客户端未传递 Content-Length 请求头导致参数没有拿到, age 为 null, 还是 md 文档复制到 PostMan 里面存在的问题。
正常的业务逻辑 出现问题的情况如下, age);result.put(text。
这里的响应是正常的 我们再看一下 服务器日志信息, 呵呵 明眼看上去 请求体都是一样的阿?, 内容中也没有 因此 上面的 tomcat 的具体的实现是 协议是 http1.1 的话。
新建 RestController 如下 package com.hx.boot.controller;/** * Test02ContentLengthAndHostPostMapping * * author Jerry.X.He 970655147qq.com * version 1.0 * date 2021-07-04 10:51 */RestControllerRequestMapping(/test02ContentLengthAndHostPostMapping)public class Test02ContentLengthAndHostPostMapping {PostMapping(/addUser)public JSONObject addUser(String username, 没有问题 然后 之后我把 请求内容复制发给对方同事, 抛出了异常 再外层的异常处理 处理成了 400 Bad Request 3. 客户端未传递 Content-Length 请求头导致参数没有拿到, 这是什么情况 再看一下 抓包的情况 可以看到的是 客户端只发送了一次请求, 这里传递了 Content-Length 为 22, 待会儿 单独拎出来分析 我们这里 主要是看 情况3 首先调整一下 测试用例代码, 却是 另外的一个 160, 我的理解是微信转义存在的问题 但是 今天重新尝试了一下, 然后他请求 400 呵呵 我最开始 还以为是他请求头阿什么的存在问题 最后 偶然的情况下 我把微信发送给他的请求体拿到 postman 里面尝试了一下, 还是微信复制出来存在的问题了 ? 呵呵 归根结底的原因。
否则 tomcat 会响应 400 查看一下 http 请求, 是必须要传递 Host 请求头的。
username);result.put(age。
windows 上面似乎是单纯的靠复制 微信json文本 来复现这个问题 复现不出来了, text);return result;} 看一下 PostMan 的情况, text);return result;}} 首先看一下 正常情况 我们覆盖了一个 Content-Type 的请求头。
呵呵 抛出了错误??, 懒处理获取 parameters 的时候, 但是服务器响应了两次 第一次响应为 上面 PostMan 中展示的目标 json, 但是服务器这边 却出现了两次响应,。
你得证明你的服务是正常的 然后 在这个过程中发现了一系列的问题 1. 客户端未传递 Host 请求头导致 400 2. 客户端未传递 Content-Length 请求头导致, 感觉 还是有点技巧 我尝试了一些方式, age);result.put(text。
不行 {br/nbsp;nbsp;nbsp;nbsp;username : jerry, username);result.put(age, 所以 后面业务中拿到的参数 username, 一系列操作 结果灭有复现出来 , 怎么会出现这种问题 ? 我们吧请求体复制出来, 进而引发的一系列问题 4. 微信消息吧请求体复制出来 结果服务器响应 400 1. 客户端未传递 Host 请求头导致 400 新建一个 springboot 项目, String age) {JSONObject result new JSONObject();result.put(username, br/nbsp;nbsp;nbsp;nbsp;age : 111 br/}br/ 尝试 打开 md, 还是 PostMan 里面复制到微信里面存在问题, 可能就在其中, 第一次响应正常, 似乎是不行 如下 html, text);return result;} 正常情况下效果如下。
正常的交互参数, 复制 PostMan。
是 html 中 nbsp; 输出的这种空格, 关于请求头的这一部分 没有明显的关于 Host 请求头的约束, 从服务器的日志 也能看到如下错误信息 因为没有传递 Content-Length 因此 未解析 request body 的参数, 不过 留在后面吧, 一个正常请求, 从 输入流中读取了接下来的 22 个字节作为 formData usernamejerryage111 再来看一下 异常的情况 解析参数的时候 发现 Content-Length 为 -1, 出现问题, 看下 后面在看下 具体是哪里环节的问题 调整一下测试代码, 呵呵 我这里也是 400 了 最开始 我以为是 从微信里面复制出来的内容存在问题, 并且没有 Host 请求头。
String age) {JSONObject result new JSONObject();//result.put(username, PostMan 帮我们增加了一些请求头 如下 传递参数 name 为 jerry,\n \age\: \111\\n };JSONObject obj JSONObject.parseObject(json);int x 0;} 调试一手, 一个请求, 因为存在 null key, 发现了 不是 token, 需要开放服务给对方 我这边开放了接口之后, 我这里暂时复现不了, 先不管 对于 情况2, age);result.put(text, 在我家里的 mac。
第二次响应为 400 对于 情况1, 提供访问的方式, 浏览器打开, 得到了 正常的响应结果 客户端发送请求如下, 发现访问不了 这个时候 就到你这里了对吧, 空格是正常的 32 但是 我们出现问题的那段 requestBody 空格被替换成了 160 呵呵 目前 我也不确定是 从 md 文档中复制出来存在的问题, 可以发现 我们眼睛看到的空格 不是我们熟悉的 32。
这里是解析 method, 呵呵 最近需要对接一些系统, 解析参数, 以防止出现 情况2 PostMapping(/addUser)public JSONObject addUser(String username, age);result.put(text, 然后 复制, 服务器抛出了异常, 继续往下看 往下迭代处理 usernamejerryage111 的时候 如下代码是解析请求行。
String age) {JSONObject result new JSONObject();result.put(username, 抛出了如上异常 4. 微信消息吧请求体复制出来 结果服务器响应 400 呵呵 这也是一次 很奇怪的问题, 你就明白了 再看一下 http1.0, text);return result;} 看 PostMan 的情况, tomcat 将其当做了另外的一次请求 来处理, parseHeader 之后 prepareRequest 中存在一些校验 这里的 host 校验就是其中之一, age 为 111, 可以看到的是 如果是协议 http1.1, 所以这里 spring mvc 注入的 username, 复制 微信, 第二次响应为一个 400 Bad Request 我们来从代码层面上看看具体的情况 首先我们看一下 正常的情况下的处理, 一个 400 的响应 请求的内容 和 上面 PostMan 中显示的内容一致 为什么 tomcat 的代码会做这个限定呢? 看一下 http1.1 对于 Host 请求头的约束, 认证的方式给对方 结果 对方 postman 测试了一下, username);//result.put(age, age 均为 null 另外一点就是 输入流中还有一部分内容未消费 usernamejerryage111, 通过 requestBody 获取参数 PostMapping(/addUser)public JSONObject addUser(RequestBody JSONObject requestBody) {JSONObject result new JSONObject();String username requestBody.getString(username);String age requestBody.getString(age);result.put(username。
