[工具类] post请求 获取request对象, 获取request的请求体(body)参数
目录
引言:
1. 获取request对象的几种常用方式
-> 1.1 获取请求对象 通过请求上下文对象 获取信息[推荐]
-> 1.2 在controller层直接获取[不推荐 侵害性太强]
-> 1.3 interceptor中获取[部分业务中使用]
-> 1.4 request常用api简介
2. 获取request的body的工具类如下:
3. 使用方式:
引言:
request对象获取url uri param参数 但是没有直接的api去查看body参数,参考1.4
1. 获取request对象的几种常用方式
-> 1.1 获取请求对象 通过请求上下文对象 获取信息[推荐]
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
-> 1.2 在controller层直接获取[不推荐 侵害性太强]
@PostMapping("/add")@ApiOperation("添加用户")public ResultResponse add(@Validated @RequestBody UserReqDTO userReqDTO, HttpServletRequest request) {userService.addUserMsg(userReqDTO,request);return ResultResponse.ok("添加成功!");}
-> 1.3 interceptor中获取[部分业务中使用]
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {}
-> 1.4 request常用api简介
1.getRequestURL()方法返回客户端发出请求时的完整URL http:localhost:8080/aaa/bbb
2.getRequestURI()方法返回请求行中的资源名 /aaa/bbb
3.getQueryString()方法返回请求行的参数部分。
4.getRemoteAddr()方法返回发出请求的客户机的IP地址。
5.getRemoteHost()方法返回发出请求的客户机的完整主机名。
6.getRemotePort()方法返回客户机所使用的网络端口号。
7.getLocalAddr()方法返回服务器的IP地址。
8.getLocalName()方法返回服务器的主机名。
9.getMethod()得到客户机请求方式。
2. 获取request的body的工具类如下:
原因: api中没有获取body的方法
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.io.*;/* 请求体工具类 @author pzy* @version 0.1.0*/
public class RequestBodyUtils {private static final int BUFFER_SIZE = 1024 * 8;/* read string. @param reader Reader instance.* @return String.* @throws IOException*/public static String read(Reader reader) throws IOException {try (StringWriter writer = new StringWriter()) {write(reader, writer);return writer.getBuffer().toString();}}/* write. @param reader Reader.* @param writer Writer.* @return count.* @throws IOException*/public static long write(Reader reader, Writer writer) throws IOException {return write(reader, writer, BUFFER_SIZE);}/* write. @param reader Reader.* @param writer Writer.* @param bufferSize buffer size.* @return count.* @throws IOException*/public static long write(Reader reader, Writer writer, int bufferSize) throws IOException {int read;long total = 0;char[] buf = new char[bufferSize];while ((read = reader.read(buf)) != -1) {writer.write(buf, 0, read);total += read;}return total;}/* 获取requestBody*/public static String getRequestBody() throws IOException {RequestAttributes attributes = RequestContextHolder.getRequestAttributes();ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;assert servletRequestAttributes != null;HttpServletRequest request = servletRequestAttributes.getRequest();BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));//读取输入流的内容转换为String类型IOUtils必须引入org.apache.dubbo.common.utils.IOUtils;包return RequestBodyUtils.read(reader);}}
3. 使用方式:
当有请求的时候 需要获取 直接调用就可以, JSONObject对象-> 需要的DTO对象
String requestBody = RequestBodyUtils.getRequestBody();
JSONObject jsonObject = JSONObject.parseObject(requestBody);