当前位置: 首页 > 知识库问答 >
问题:

数据格式为POJO时获取请求和响应SOAP消息

松铭
2023-03-14

我使用WebServices和apachecamel,并使用dataFormat作为POJO来请求该webservice。我能够成功地调用服务,但我想记录请求和响应SOAP消息,但我无法记录,因为SOAP消息是由CXF从POJO类创建的。

当dataFormat为POJO时,是否有任何方法可以记录请求和响应SOAP消息?

共有1个答案

冷涵忍
2023-03-14

这是我如何在我的项目中记录肥皂请求和响应的示例,希望这有所帮助

BindingProvider bindingProvider = ((BindingProvider) PortType);
List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
handlerChain.add(new SOAPLoggingHandler());    
bindingProvider.getBinding().setHandlerChain(handlerChain);

和SOAPLoggingHandler类

public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {

    // change this to redirect output if desired
    public static Logger logger = Logger.getLogger("GetCustomerDataLand");

    public Set<QName> getHeaders() {
        return null;
    }

    public boolean handleMessage(SOAPMessageContext smc) {
        logToSystemOut(smc);
        return true;
    }

    public boolean handleFault(SOAPMessageContext smc) {
        logToSystemOut(smc);
        return true;
    }

    // nothing to clean up
    public void close(MessageContext messageContext) {
    }

    /*
     * Check the MESSAGE_OUTBOUND_PROPERTY in the context to see if this is an
     * outgoing or incoming message. Write a brief message to the print stream
     * and output the message. The writeTo() method can throw SOAPException or
     * IOException
     */
    private void logToSystemOut(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (outboundProperty.booleanValue()) {
            logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "\nOutbound message:");
        } else {
            logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "\nInbound message:");
        }

        SOAPMessage message = smc.getMessage();
        try {

            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            message.writeTo(stream);
            String msg = new String(stream.toByteArray(), "utf-8");

            logger.info(toPrettyString(msg));
            // message.writeTo(out);
            logger.info(""); // just to add a newline
        } catch (Exception e) {
            logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(new Date()) + "Exception in handler: "
                    + org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(e));
        }
    }

    public String toPrettyString(String xml) {

        try {
            final InputSource src = new InputSource(new StringReader(xml));
            final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src)
                    .getDocumentElement();
            final Boolean keepDeclaration = Boolean.valueOf(xml.startsWith("<?xml"));
            final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
            final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
            final LSSerializer writer = impl.createLSSerializer();

            writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
            writer.getDomConfig().setParameter("xml-declaration", keepDeclaration);
            return writer.writeToString(document);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
 类似资料:
  • 我正试图在groovy中使用JAXB取消对java POJO的SOAP响应,但遇到了一些问题 下面是我的XML 下面是我的POJO 但是对于第二种方法,我将获得 有人能帮我一下吗?

  • 我正在使用API,我是PHP SOAP的新手。我正在尝试创建一个请求来获取车辆值,并希望获得响应值。 以下是示例SOAP 1.1请求。显示的占位符需要替换为实际值。 这是SOAP客户端URL调用- 这是我尝试过的,但没有结果- 我尝试了另一种方法,但在解析WSDL时出错 这是我得到的错误- SOAP-ERROR:解析WSDL:无法从'POST /vehicles/vehicle.asmxHTTP/

  • 原理 对于POST请求的处理,koa2没有封装获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req,将POST表单数据解析成query string(例如:a=1&b=2&c=3),再将query string 解析成JSON格式(例如:{"a":"1", "b":"2", "c":"3"}) 注意:ctx.request是context经过封装的请求对象,ctx.

  • 使用方法 在koa中,获取GET请求数据源头是koa中request对象中的query方法或querystring方法,query返回是格式化好的参数对象,querystring返回的是请求字符串,由于ctx对request的API有直接引用的方式,所以获取GET请求数据有两个途径。 1.是从上下文中直接获取 请求对象ctx.query,返回如 { a:1, b:2 } 请求字符串 ctx.que

  • 我是iOS和Swift的新手,我正在尝试使用AlamoFire3.4.0来做一个web请求。当我的请求成功时,一切都很好。但是,如果我的请求失败,服务器将返回300或更大的状态代码,以及响应体中的一些JSON,其中包含关于请求失败原因的更多信息。例如,我正在与之交谈的API要求对每个请求进行身份验证。如果身份验证由于某种原因失败,我将返回401,响应体中的JSON将为: 我发出此请求的代码如下所示

  • 虽然,如果我将链接插入浏览器,我将得到json格式。 这就是请求的工作结果 `