JAX-RS LoggingFilter - 记录请求实体
JAX-RS LoggingFilter - Log request entities
我正在使用 class 实现 ClientRequestFilter
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, requestContext.getMethod(), requestContext.getUri()));
requestContext.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, requestContext.getHeaders().get(key)));
});
if (requestContext.hasEntity()) {
if(requestContext.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) requestContext.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), requestContext.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
requestContext.setProperty(PROPERTY_NANOS, System.nanoTime());
}
除了在记录正文部分流后似乎已被消耗并且未随请求发送外,它工作正常。
我该如何显示正文部分流并使其再次可用于请求本身?
对于响应,这是同样的问题,我设法让它与
一起工作
if (responseContext.hasEntity()) {
InputStream entityStream = responseContext.getEntityStream();
byte[] bytes = IOUtils.toByteArray(entityStream);
responseContext.setEntityStream(new ByteArrayInputStream(bytes));
String entity = new String(bytes);
logger.trace(String.format(F_ENTITY, entity));
}
解决方案 1:缓冲流。
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), clientRequest.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}
但是还是不行。
我的工作解决方案
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), bodyPart.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(((StreamDataBodyPart)bodyPart).getStreamEntity());
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), new String(bytes)));
} catch (IOException e) {
e.printStackTrace();
}
((StreamDataBodyPart) bodyPart).setStreamEntity(new ByteArrayInputStream(bytes));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}
我正在使用 class 实现 ClientRequestFilter
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, requestContext.getMethod(), requestContext.getUri()));
requestContext.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, requestContext.getHeaders().get(key)));
});
if (requestContext.hasEntity()) {
if(requestContext.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) requestContext.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), requestContext.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
requestContext.setProperty(PROPERTY_NANOS, System.nanoTime());
}
除了在记录正文部分流后似乎已被消耗并且未随请求发送外,它工作正常。 我该如何显示正文部分流并使其再次可用于请求本身?
对于响应,这是同样的问题,我设法让它与
一起工作 if (responseContext.hasEntity()) {
InputStream entityStream = responseContext.getEntityStream();
byte[] bytes = IOUtils.toByteArray(entityStream);
responseContext.setEntityStream(new ByteArrayInputStream(bytes));
String entity = new String(bytes);
logger.trace(String.format(F_ENTITY, entity));
}
解决方案 1:缓冲流。
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), clientRequest.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
StreamDataBodyPart streamDataBodyPart = (StreamDataBodyPart) bodyPart;
String part = new BufferedReader(
new InputStreamReader(streamDataBodyPart.getStreamEntity(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), part));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}
但是还是不行。
我的工作解决方案
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
ClientRequest clientRequest = (ClientRequest) requestContext;
clientRequest.enableBuffering();
logger.trace(F_SEPARATOR);
logger.trace(String.format(F_REQUEST, clientRequest.getMethod(), clientRequest.getUri()));
clientRequest.getHeaders()
.keySet()
.stream()
.sorted()
.forEach(key -> {
logger.trace(String.format(F_HEADER, key, clientRequest.getHeaders().get(key)));
});
if (clientRequest.hasEntity()) {
if(clientRequest.getHeaders().get("Content-Type").get(0).toString().equals("multipart/form-data")) {
FormDataMultiPart formDataMultiPart = (FormDataMultiPart) clientRequest.getEntity();
logger.trace(String.format(F_PART_NUMBER, formDataMultiPart.getBodyParts().size()));
AtomicInteger index = new AtomicInteger(1);
formDataMultiPart.getBodyParts().stream()
.forEach(bodyPart -> {
logger.trace(String.format(F_PART + F_PART_CONTENT_TYPE, index.get(), bodyPart.getMediaType().toString()));
if(bodyPart.getMediaType().toString().equals("text/xml")) {
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(((StreamDataBodyPart)bodyPart).getStreamEntity());
logger.trace(String.format(F_PART + F_PART_CONTENT, index.get(), new String(bytes)));
} catch (IOException e) {
e.printStackTrace();
}
((StreamDataBodyPart) bodyPart).setStreamEntity(new ByteArrayInputStream(bytes));
}
index.getAndIncrement();
});
}
}
clientRequest.setProperty(PROPERTY_NANOS, System.nanoTime());
}