我有下面的代码使用,我试图获取和打印使用ContainerRequestContext的请求流的实体。然而,在我读取输入流之后,它打破了API调用。我能够从"ContainerRequestContext"获取其他详细信息使用诸如responseContext.getURiInfo()等getter。请注意,我不想使用" aroundfrom ";ReaderInterceptor"和龙目岛。任何帮助都是感激的。谢谢! !
更新:请求有效负载是"x-www-form-urlencoded";以及如何将请求有效载荷设置回"x-www-form-urlencoded";读完之后?这可能是我读取有效负载后请求失败的原因。我可能没有设置settentitystream ()&;正确。
public String getRequestEntityStream(ContainerRequestContext requestContext) throws IOException {
try (InputStream in = requestContext.getEntityStream()) {
ByteArrayOutputStream out = new ByteArrayOutputStream(64 * 1024);
IOUtils.copy(in, out);
byte[] entity = out.toByteArray();
//restore input
requestContext.setEntityStream(new ByteArrayInputStream(entity));
String str=new String(entity);
return str;
}
}
我像下面一样使用上面的附加到StringBuilder:
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
StringBuilder sbRequest = new StringBuilder();
sbRequest.append(" - Request Entity Stream : ").append(getRequestEntityStream(requestContext));
}
当您尝试使用ContainerRequestContext获取请求流的实体时,您获得null的原因是,当您调用IOUtils时,正在读取和消耗输入流。复制(,)。
一旦读取流,流指针到达流的末尾,没有更多的字节可读。因此,当您尝试在读取输入流后使用requestContext.getEntityStream()访问请求实体流时,它将返回null。
要解决这个问题,你可以使用实体字节数组创建一个ByteArrayInputStream的新实例,并在返回实体字符串之前使用requestContext.setEntityStream()将其设置回ContainerRequestContext。这将确保请求实体流被重置为其初始状态,如果需要,您可以再次访问它。
Try this please:
public String getRequestEntityStream(ContainerRequestContext requestContext) throws IOException {
try (InputStream in = requestContext.getEntityStream()) {
ByteArrayOutputStream out = new ByteArrayOutputStream(64 * 1024);
IOUtils.copy(in, out);
byte[] entity = out.toByteArray();
//reset the input stream
ByteArrayInputStream inNew = new ByteArrayInputStream(entity);
requestContext.setEntityStream(inNew);
String str = new String(entity);
return str;
}
}