目录
-> 1.1 获取请求对象 通过请求上下文对象 获取信息[推荐]
-> 1.2 在controller层直接获取[不推荐 侵害性太强]
-> 1.3 interceptor中获取[部分业务中使用]
引言:
request对象获取url uri param参数 但是没有直接的api去查看body参数,参考1.4
1. 获取request对象的几种常用方式
-> 1.1 获取请求对象 通过请求上下文对象 获取信息[推荐]
RequestContextHolder 对象是一个 Holder 对象,可以在任何框架代码中访问到当前请求的请求上下文对象和会话对象。它避免了将 HttpServletRequest 传递到后端的每个方法,使得访问请求对象和会话对象变得简单。
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
-> 1.2 在controller层直接获取[不推荐 侵害性太强]
HttpServletRequest对象不需要手动去传递参数, 写上即可, 但是代码侵害性比较高 相对于1.1 显得不那么灵活
@PostMapping("/add")
@ApiOperation("添加用户")
public ResultResponse add(@Validated @RequestBody UserReqDTO userReqDTO, HttpServletRequest request) {
userService.addUserMsg(userReqDTO,request);
return ResultResponse.ok("添加成功!");
}
-> 1.3 interceptor中获取[部分业务中使用]
拦截器(Interceptor)是一种AOP(Aspect Oriented Programming,面向切面编程)的实现方式,主要用于在Controller处理请求之前或之后执行一些处理逻辑,或者是修改请求和响应的内容。相较于过滤器(Filter),拦截器可以更加细粒度控制请求处理流程,可以根据实际需求地对请求进行预处理和后处理。
@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);
补充: get请求与post请求的区别
GET请求会在URL中传递参数,而POST请求则在请求体中传递参数。因此,GET请求的URL会包含参数,而POST请求的URL不会包含参数。
GET请求的数据长度有限制,一般在2048个字符左右,而POST请求的数据长度没有限制。
GET请求是幂等的,也就是说,无论进行多少次GET请求,服务器的响应都是一样的。而POST请求则不是幂等的,因为每次POST请求,服务器可能会执行一些操作,例如写入数据库或者更新资源。
GET请求一般用于获取数据,也就是说,它是一种安全操作。而POST请求则用于提交数据,可能会对数据进行修改或者删除,因此是一种不安全的操作。
GET请求可以被缓存,可以提高响应速度,而POST请求则不能被缓存。
GET请求的URL可以被浏览器保存为历史记录,可以在浏览器的地址栏中进行修改和分享。而POST请求的URL不能被分享,也不能被保存为历史记录。