Ich muss die vollständige HTTP-Anfrage und Antwort in einem JAX-WS WebService-Aufruf protokollieren. Für die Anfrage benötige ich die Anforderungsheader und den Hauptteil und für die Antwort, die Antwortheader und den Hauptteil.Log jax-ws http Anfrage und Antwort
Nach einiger Forschung, habe ich festgestellt, dass ich diese Informationen mit der Eigenschaft erhalten kann:
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
und die Informationen an, die ich brauche, aber es gibt sie an die Konsole und ich brauche es zu speichern in die Datenbank mit einer internen Anforderungs-ID.
Ich habe versucht, einen Handler zu implementieren:
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();
}
}
aber in diesem Fall kann ich die http-Request-Header und Körper, sondern in der Antwort zu bekommen, erhalte ich nur den Körper, sind http-Response-Header immer leer.
Irgendeine Idee, wie man das schafft? Ziel ist es, die vollständige HTTP-Anfrage und Antwort in einer Datenbank speichern zu können.
Danke !!
Vielen Dank für Ihre Antwort. Ich stelle den Webservice mit Spring 3 auf einem Tomcat-Anwendungsserver bereit. Dein erster Vorschlag wird nur auf die Konsole übertragen, oder? Ich muss es in einer Datenbank speichern können und bezüglich der zweiten Option werde ich es versuchen. Vielen Dank! – drublik
@druk sicher, lassen Sie uns wissen, wie es funktioniert. Ich bin neugierig auf eine – kolossus
Danke für Ihre Antwort, aber HttpServletResponse hat keine "getHeaderNames()" -Methode. In der Tat scheint es, dass es keine Methode hat, Header zu erhalten, nur um zu setzen. Diese Funktion befindet sich nur in HttpServletRequest. – drublik