springboot 打印slf4_SpringBoot打印请求体与响应体

一、前言

在工作中,出现了需要打印每次请求中调用方传过来的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

你可能感兴趣的:(springboot,打印slf4)