text);return result;}}     首先看一下 正常情况  我们覆盖了一个 Content-Type

进而引发的一系列问题  这个问题 就是对应的是 上面所描述的 情况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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://acg.inmoke.com/zixun/acgyouxi/36730.html