gpt4 book ai didi

java - 记录 jax-ws http 请求和响应

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:17 26 4
gpt4 key购买 nike

我需要在 JAX-WS WebService 调用中记录完整的 http 请求和响应。对于请求,我需要请求 header 和正文,对于响应,我需要响应 header 和正文。

经过一些研究,我发现我可以通过属性获取此信息:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

并显示我需要的信息,但它会将其转储到控制台,我需要使用内部请求 ID 将其存储在数据库中。

我已经尝试实现一个处理程序:

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outbound) {
System.out.println("SOAP outbound!!!!!");
Map<String, List<String>> responseHeaders = (Map<String, List<String>>) context
.get(SOAPMessageContext.HTTP_RESPONSE_HEADERS);
try {
String headers = getHeaders(responseHeaders);
System.out.println(headers);
String body = getBody(context.getMessage());
System.out.println(body);
} catch (Exception ex) {
// TODO: What do I have to do in this case?
}
} else {
System.out.println("SOAP inbound!!!!!");
Map<String, List<String>> requestHeaders = (Map<String, List<String>>) context
.get(SOAPMessageContext.HTTP_REQUEST_HEADERS);
try {
String headers = getHeaders(requestHeaders);
System.out.println(headers);
String body = getBody(context.getMessage());
System.out.println(body);
} catch (Exception ex) {
// TODO: What do I have to do in this case?
}
}
return true;
}

private String getBody(SOAPMessage message) throws SOAPException, IOException {
OutputStream stream = new ByteArrayOutputStream();
message.writeTo(stream);
return stream.toString();
}

public String getFullHttpRequest(HttpServletRequest request) throws IOException {
InputStream in = request.getInputStream();
String encoding = request.getCharacterEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
return body;
}

private String getHeaders(Map<String, List<String>> headers) throws IOException {
StringBuffer result = new StringBuffer();
if (headers != null) {
for (Entry<String, List<String>> header : headers.entrySet()) {
if (header.getValue().isEmpty()) {
// I don't think this is legal, but let's just dump it,
// as the point of the dump is to uncover problems.
result.append(header.getValue());
} else {
for (String value : header.getValue()) {
result.append(header.getKey() + ": " + value);
}
}
result.append("\n");
}
}
return result.toString();
}

}

但在这种情况下,我可以获得 http 请求 header 和正文,但在响应中,我只能获得正文,http 响应 header 始终为空。

关于如何实现这个的任何想法?目标是能够将完整的 http 请求和响应存储在数据库中。

谢谢!!

最佳答案

你也可以试试

    -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true

我假设您是从某种 Java EE 应用程序服务器(而不是从独立客户端)中提供 Web 服务。在 Web/Java EE 容器的上下文之外,您无法访问 HttpServletRequestHttpServletResponse 等 Java EE 基础设施。

您可以尝试使用(在 Web 上下文中)获取实际的 servlet 响应对象

    HttpServletResponse response = (HttpServletResponse) messageContext.get(SOAPMessageContext.SERVLET_RESPONSE); //messageContext is the SOAPMessageContext
List<String> responseHeaderNames = (List<String>)response.getHeaderNames();
for(String headerName : responseHeaderNames){
//Do whatever you want with it.
}

不过,我严重怀疑您能否在处理程序中获得完整的响应 header 。你的问题真的很吸引我,我花了很多时间研究那部分。在我见过的所有代码示例中,甚至没有 metro site 上的示例尝试实现此功能,我认为原因很简单。在调用处理程序时,容器可能没有足够的确定信息来在出站消息上标记 http header 。您也许可以添加东西,但这也值得怀疑。

关于java - 记录 jax-ws http 请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13285342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com