JAX-WS WebService çağrısında tam http isteği ve yanıtını kaydetmem gerekiyor. İstek için istek başlıklarına ve vücuda ve yanıt, cevap başlıkları ve gövdesine ihtiyacım var. Oturum açma jax-ws http istek ve Yanıt
bazı araştırma sonra ben özelliğiyle bu bilgileri alabilirsiniz fark ettik:-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
ve ihtiyacım bilgileri gösterir ama konsola döker ve ben depolamak gerekir bir iç istek kimliği ile veritabanı.
Ben bir işleyici uygulamak için denedim:
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();
}
}
ancak bu durumda, ben http istek başlıklarını ve beden alabilirsiniz ama cevap olarak, sadece vücut olsun, http yanıt başlıkları daima boş.
Bunu nasıl arşivleyeceğiniz hakkında bir fikriniz var mı? Amaç, tam http istek ve yanıtını bir veritabanında saklayabilmektir.
Teşekkürler!
Cevabınız için teşekkür ederiz. Bir Tomcat uygulama sunucusundaki Spring 3'ü kullanarak web servisini yapıyorum. İlk teklifin, onu konsola bırakacaksın, değil mi? Bir veritabanında saklayabilmem gerekiyor ve ikinci seçenekle ilgili olarak, bunu deneyeceğim. Teşekkürler! – drublik
@drublik emin, nasıl çalıştığını bize bildirin. Bir – kolossus
cevabını merak ettim ama cevabınız için teşekkürler HttpServletResponse "getHeaderNames()" yöntemine sahip değil. Aslında, başlıkları almak için herhangi bir yöntem yoktur, sadece ayarlanmış gibi görünüyor. Bu işlev sadece HttpServletRequest'tedir. – drublik