一、问题由来

  自己目前在做一个小程序的后台,已经写好了项目中的很多的接口,同时也在进行一些修改,比如添加拦截器,统一校验一个固定的参数是否正确。

在自己添加拦截器之前,这些接口都可以正常访问,可是在添加拦截器之后,再次访问接口就出现异常,异常信息为Required request body is missing

让我有些疑惑,之前还好好的,怎么突然就访问报错了呢?这个错误简直莫名其妙,感觉毫无道理,可是问题却实实在在出现。

二、问题分析

对于出现的这个问题,我首先是把错误信息往百度里面进行搜索,出现各种各样的答案,可是都不是我遇到的问题的答案。当查看各种答案,查看得比较

多的时候,慢慢的理解了出现这个问题的原因。一开始我理解的是,使用注解的方式不对,看了很多篇博文之后才发现问题所在,才搞清楚问题在哪里。

出现这个问题的原因是java后台项目在处理请求时,如果是使用请求对象获取输入流的方式来获取请求参数,只能获取一次请求参数;当第二次获取参数

时就会出现问题,报标题中的错误。至此终于搞清楚问题的原因,request.getInputStream()只能调用一次,我已经在拦截器中调用一次,当再使用注解

@RequestBody的时候,底层也是调用getInputStream()方法,因此抛出异常。

三、解决方案

自己去百度里面查看了很多的答案,也尝试了很多的方案,反反复复的尝试,希望能够解决问题,最终找到一种解决方案。解决方式为给所有的请求都

使用自定义的请求对象,在过滤器中进行处理。在拦截器中同样也是使用自定义的请求对象,这样就可以解决这个问题。原理就是,在自定义的请求对象

中,将获取请求的输入对象流用一个变量保存起来,然后在生成一个新的请求对象即可,代码我已经粘贴在下面:

获取请求参数的方法

/* @Description: 抽取获取请求参数的方法
* @author: dengchao
* @date: 2021/8/18 16:51
* @param: request 请求对象
* @return: String
*/
private String getLoginToken(HttpServletRequest request) throws IOException {
HttpServletRequest requestWrapper = new BodyReaderWrapper(request);

StringBuffer sb = new StringBuffer() ;
InputStream is = requestWrapper.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s = "" ;
while((s=br.readLine()) != null){
sb.append(s) ;
}
//获取请求参数示例 { "loginToken": "9a1cdf7a143047c8ad5eee87dbdfd24a", "userPhone":"15215426598", "msgType":1}
String str = sb.toString();
JSONObject jsonObject = JSONObject.parseObject(str);
String loginToken = jsonObject.getString("loginToken");
log.info("loginToken--->" + loginToken);
return loginToken;
}

自定义请求类
public class BodyReaderWrapper extends HttpServletRequestWrapper{
//用于将流保存下来
private byte[] requestBody;

public BodyReaderWrapper(HttpServletRequest request) throws IOException {
super(request);
requestBody = StreamUtils.copyToByteArray(request.getInputStream());
}

@Override
public ServletInputStream getInputStream() throws IOException {

final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);

return new ServletInputStream() {

@Override
public int read() throws IOException {
return bais.read();
}

@Override
public boolean isFinished() {
return false;
}

@Override
public boolean isReady() {
return false;
}

@Override
public void setReadListener(ReadListener readListener) {
}
};
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}

使用过滤器来处理所有的请求
@Component
@WebFilter
public class ReplaceStreamFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
BodyReaderWrapper bodyReaderWrapper = new BodyReaderWrapper((HttpServletRequest) request);
chain.doFilter(bodyReaderWrapper, response);
}

@Override
public void destroy() {

}
}

参考文章

https://blog.csdn.net/m0_37542889/article/details/82889617

https://zhuanlan.zhihu.com/p/239948869

https://www.jb51.net/article/193961.htm

Required request body is missing-请求接口报错的更多相关文章

  1. android 请求接口报错 org.apache.http.conn.HttpHostConnectException: Connection to http://192.168.1.90:9090 refused

    No Network Security Config specified, using platform defaultI/System.out: org.apache.http.conn.HttpH ...

  2. 前端传送JSON数据,报Required request body is missing

    声明: 后端为Java,采用SSM框架 前端一个JSON.stringify()传来的json字符串,后端一般用@RequestBody标签来定义一个参数接收 但问题在于,当我使用get方式传JSON ...

  3. [已解决]报错:Required request body is missing

    问题代码: res = requests.post(getXxxxList_url, headers=headers, data={}) 对象网站: angular4 apache 通过验证 (coo ...

  4. @RequestBody对象为空,异常Required request body is missing错误解决

    1.异常 org.springframework.http.converter.HttpMessageNotReadableException: Required request body is mi ...

  5. Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public xxxxxxxx.

    最近在使用 springBoot开发的时候, 使用PostMan访问接口,  返回一个 404 ,  后台报一个 warn : Failed to read HTTP message: org.spr ...

  6. DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

    客户端当发送空的json字符串时,请求RestController时,报错: DefaultHandlerExceptionResolver : Failed to read HTTP message ...

  7. @RequestBody对象为空,异常Required request body is missing

    1.异常 org.springframework.http.converter.HttpMessageNotReadableException: Required request body is mi ...

  8. 关于请求接口报4XX错误,给广大前端同胞进行伸冤澄清,请相信它不一定都是前端的错

    关于请求接口报4XX错误,给广大前端同胞进行伸冤澄清,请相信它不一定都是前端的错 首先确保接口没有写错,参数按照后台要的写,确保自己也没有写错,若页面还是报4xx错误,请站出来大胆的质疑后端,干什么吃 ...

  9. 记一次线上由nginx upstream keepalive与http协议"协作"引起的接口报错率飙高事件

    年前接到个任务,说要解决线上一些手机客户端接口报错率很高的问题.拿到了监控邮件,粗略一看,各种50%+的错误率,简直触目惊心.这种疑难杂症解决起来还是挺好玩的,于是撸起袖子action. 最终的结果虽 ...

随机推荐

  1. [心得体会]Spring容器的初始化

    1. Spring容器的初始化过程 public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {   ...

  2. Leetcode No.108 Convert Sorted Array to Binary Search Tree(c++实现)

    1. 题目 1.1 英文题目 Given an integer array nums where the elements are sorted in ascending order, convert ...

  3. B 站崩了,受害程序员聊聊

    非吃瓜,B 站事件始末分析 + 防治技术分享 大家好,我是鱼皮,昨天小破站崩了的事情相信很多朋友都听说了. 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着 ...

  4. Spring BeanFactory和现实工厂的对比

    本文不分析Spring的源码流程,只是介绍一些基础的概念,在阅读源码之前,我们应该首先明确研究的对象是什么,才能有的放矢. Spring作为BeanFactory, 和现实工厂有着许多类似之处. 需要 ...

  5. C语言:随机数

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌.在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机 ...

  6. 家庭账本开发day04

    对之前的构架进行修改,对成员类新加属性余额,在进行账单的新增时 ,对余额进行相应的修改.并且对账单类加入属性:id方便之后的查询和 删除操作

  7. 汉诺塔Python

    刚开始看python实现汉诺塔,自己想了很久才想明白,在这里记录一下,希望以后忘记能够立马记起. n=1时,可以直接a->c n=2时,可以借助b然后将a->c n=3时,可以将最上面的那 ...

  8. python之数据驱动ddt操作(方法三)

    import unittestfrom selenium import webdriverfrom selenium.webdriver.common.by import Byimport unitt ...

  9. 公有云上构建云原生 AI 平台的探索与实践 - GOTC 技术论坛分享回顾

    7 月 9 日,GOTC 2021 全球开源技术峰会上海站与 WAIC 世界人工智能大会共同举办,峰会聚焦 AI 与云原生两大以开源驱动的前沿技术领域,邀请国家级研究机构与顶级互联网公司的一线技术专家 ...

  10. 第3天 IDEA 2021简单设置与优化 Java运算符 包机制

    IDEA 2021简单设置与优化 将工具条显示在上方 View–>Appearance–>Toolbar 鼠标悬停显示 File–>setting–>Editor–>Ge ...