Log-jax-ws http-request und-response
Ich brauchen, um sich den vollständigen http-request und response in einem JAX-WS-WebService-Aufruf. Für den Antrag muss ich den request-Header und den Körper und für die response, response Header und body.
Nach einiger recherche habe ich herausgefunden, dass ich diese information mit der Eigenschaft:
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
und zeigen Sie die Informationen, die ich brauche, aber es gibt Sie auf der Konsole und ich brauche, um es zu speichern in die Datenbank mit einem internen request-id.
Ich habe versucht, implementieren Sie einen handler:
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, ich kann die http-request-Header und Körper, sondern in der Antwort, bekomme ich nur den body -, den http-Antwort-Header sind immer leer.
Jede Idee, wie Sie erreichen dies? Ziel ist es zu speichern können Sie die vollständigen http request und response in einer Datenbank.
Dank!!
InformationsquelleAutor drublik | 2012-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man auch versuchen,
Ich bin davon ausgegangen, dass Sie die Bereitstellung Ihrer web service von einer Java-EE-application-server von einer Art (und nicht von einem standalone-client). Sie nicht haben Zugriff auf Java-EE-Infrastruktur wie
HttpServletRequest
undHttpServletResponse
außerhalb des Kontextes eines web - /Java-EE-container.Könnten Sie versuchen, Ihre Hände auf die eigentliche servlet-response-Objekt (im web-Kontext) mit
Ich bezweifle ernsthaft, dass Sie werde in der Lage sein, Ihre Hände auf die vollständige response-Header innerhalb einer handler-obwohl. Ihre Frage, die mich wirklich fasziniert und ich habe schon einige Zeit mit der Erforschung, Teil. In allen code-Beispielen, die ich gesehen habe, auch Nicht das Beispiel auf der U-Bahn Website versuchen, um diese Funktionalität zu implementieren und ich denke, der Grund ist einfach. Als an der Stelle, wo ein handler aufgerufen, der container kann nicht genug definitive Informationen zu Stempel einen http-header für die ausgehende Nachricht. Sie könnten in der Lage sein, um Dinge hinzufügen, aber das ist zweifelhaft, wie gut.
sicher, lassen Sie uns wissen, wie es funktioniert. Ich bin neugierig, für eine
vielen Dank für Ihre Antwort, aber HttpServletResponse nicht "getHeaderNames ()" - Methode. In der Tat, es scheint, dass es keine Methode, um die Header, nur zum einstellen. Diese Funktion ist in HttpServletRequest nur.
was servlet-version verwenden Sie? Ich kann garantieren, dass es in 3.0
ok! Ich war mit servlet-api 2.5 als Ziel-server ist Tomcat 6.0.24 (ich denke, dass die servlet-api 3.0 ist nur in Tomcat 7 oder höher)
InformationsquelleAutor kolossus