一、前言
在工作中,出现了需要打印每次请求中调用方传过来的requestBody的需求
出现这个需求的原因是我在和某平台做联调工作,出现了一个比较恶心的情况。
有一些事件通知需要由他们调用我们的http接口来实现事件通知,但是这个http接口的数据格式是由他们定义的(照搬其他地方的),而他们给的相关文档很烂,示例中缺乏某些字段,而字段表里的字段又没有分级,因此很难弄清楚他们请求的字段有哪些。
自己写的类不一定能正确反序列化它的所有字段,如果反序列化有误,不清楚它传来的xml长什么样子,也无法解决问题
总结一下问题原因:
我们写的接口,要由他们定义字段类型,但文档写的烂,字段定义的不清楚,不能提供维护以及答疑支持
配合程度有限,不能提供请求的xml
这两点带来的问题是当反序列化出现问题,不自己打印它们请求过来的xml,就没法快速找到问题原因,因此,需要我们通过某种手段打印出requestBody的内容
二、传统请求参数的打印
通常,最简单的HTTP GET请求可以通过写一个继承HandlerInterceptorAdapter的拦截器来实现,形如:
package com.chasel.interceptor;
import com.alibaba.fastjson.JSON;
import com.cmic.origin.internal.gateway.core.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.util.Map;
/**
* @author XieLongzhen
* @date 2018/12/26 18:46
*/
@Slf4j
@Component
public class HttpInterceptor extends HandlerInterceptorAdapter {
private ThreadLocal startTime = new ThreadLocal<>();
/**
* 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller
*
* 返回值:
* true表示继续流程(如调用下一个拦截器或处理器)
* false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器
* 此时我们需要通过response来产生响应;
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
startTime.set(System.currentTimeMillis());
String uri = request.getRequestURI();
Map paramMap = request.getParameterMap();
log.info("用户访问地址:{}, 来路地址: {}, 请求参数: {}", uri, IpUtil.getRemoteIp(request), JSON.toJ