請(qǐng)求參數(shù),返回參數(shù),請(qǐng)求路徑日志打印
在平時(shí)前后端聯(lián)調(diào)過程中,需要查詢?nèi)罩究吹角岸苏?qǐng)求的接口,上送的參數(shù),返回?cái)?shù)據(jù)這樣有利于我們定位問題;話不多說直接上代碼。
打印請(qǐng)求路徑、請(qǐng)求參數(shù)
在gateway模塊中,新建一個(gè)filter的包,然后創(chuàng)建改類,即可在控制臺(tái)和日志文件里面打印出請(qǐng)求參數(shù),只寫了常用的post和get請(qǐng)求的方式;
/**
* @author
* @date 2023/2/3 - 10:54
* @描述 請(qǐng)求參數(shù)日志打印
*/
@Component
@Slf4j
@AllArgsConstructor
public class HttpRequestFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String method = request.getMethodValue();
String contentType = request.getHeaders().getFirst("Content-Type");
String url = JSONObject.toJSONString(request.getURI());
log.info("網(wǎng)關(guān)請(qǐng)求路徑: "+url);// 請(qǐng)求路徑打印
if ("POST".equals(method)) {
return DataBufferUtils.join(exchange.getRequest().getBody())
.flatMap(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
try {
String bodyString = new String(bytes, "utf-8");
log.info("請(qǐng)求參數(shù): "+bodyString);//打印請(qǐng)求參數(shù)
exchange.getAttributes().put("POST_BODY", bodyString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
DataBufferUtils.release(dataBuffer);
Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
DataBuffer buffer = exchange.getResponse().bufferFactory()
.wrap(bytes);
return Mono.just(buffer);
});
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
return chain.filter(exchange.mutate().request(mutatedRequest)
.build());
});
}else if ("GET".equals(method)) {
MultiValueMap<String, String> queryParams = request.getQueryParams();
log.info("請(qǐng)求參數(shù):" + queryParams);
log.info("****************************************************************************\n");
return chain.filter(exchange);
}
log.info("****************************************************************************\n");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -200;
}
}
返回參數(shù)打印
/**
* @author
* @date 2023/2/3 - 10:54
* @描述 返回參數(shù)日志打印
*/
@Component
public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(WrapperResponseGlobalFilter.class);
@Override
public int getOrder() {
// -1 is response write filter, must be called before that
return -2;
}
private static Joiner joiner = Joiner.on("");
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator response = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
// 獲取ContentType,判斷是否返回JSON格式數(shù)據(jù)
String originalResponseContentType = exchange.getAttribute(ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR);
if (StringUtils.isNotBlank(originalResponseContentType) && originalResponseContentType.contains("application/json")) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
//(返回?cái)?shù)據(jù)內(nèi)如果字符串過大,默認(rèn)會(huì)切割)解決返回體分段傳輸
return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
List<String> list = Lists.newArrayList();
dataBuffers.forEach(dataBuffer -> {
try {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
DataBufferUtils.release(dataBuffer);
list.add(new String(content, "utf-8"));
} catch (Exception e) {
log.info("加載Response字節(jié)流異常,失敗原因:{}", Throwables.getStackTraceAsString(e));
}
});
String responseData = joiner.join(list);
log.info("返回參數(shù)responseData:"+responseData);
//System.out.println("responseData:"+responseData);
byte[] uppedContent = new String(responseData.getBytes(), Charset.forName("UTF-8")).getBytes();
originalResponse.getHeaders().setContentLength(uppedContent.length);
return bufferFactory.wrap(uppedContent);
}));
}
}
return super.writeWith(body);
}
@Override
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
return writeWith(Flux.from(body).flatMapSequential(p -> p));
}
};
return chain.filter(exchange.mutate().response(response).build());
}
}
結(jié)果演示
圖片:文章來源:http://www.zghlxwxcb.cn/news/detail-551198.html
記錄和幫助文章來源地址http://www.zghlxwxcb.cn/news/detail-551198.html
到了這里,關(guān)于springcloud gateway中打印請(qǐng)求參數(shù),請(qǐng)求路徑和返回?cái)?shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!