从CFX服务转发到外部端点的请求

时间:2016-04-24 10:44:19

标签: web-services cxf single-page-application

目前我正在解决以下问题:

在特殊情况下,我需要将SOAP请求转发到外部服务(基于SOAP消息中提供的tenantId做出决定)。我为此任务创建了一个拦截器,用于从消息请求中提取tenantId,获得赋值(每个tenantId被分配给在不同服务器上运行的自己的服务实例),如果没有赋值,我需要正常处理请求。

目前我以这种方式实现:我在拦截器中创建HttpUrlConnection并将请求转发到外部端点(如果有分配)并获取响应的outputStream并发送响应HttpServletResponse.getOutputStream等...

我还需要考虑拦截器与各种服务一起使用(必须在SOAP请求中提供tenantId)。

我还读到了关于Provider和Dispatch对象的信息,不知道这应该如何工作。

有没有办法从传入消息中获取目标服务和端口(QNames)?

我目前无法使用Camel(仅允许使用CXF)。

1 个答案:

答案 0 :(得分:1)

Maybe you can try something like this :

/** Your interceptor */
public void handleMessage(SoapMessage msg) throws Fault {

    Exchange exchange = msg.getExchange();
    Endpoint ep = exchange.get(Endpoint.class);

    // Get the service name
    ServiceInfo si = ep.getEndpointInfo().getService();
    String serviceName = si.getName().getLocalPart();

    XMLStreamReader xr = msg.getContent(XMLStreamReader.class);
    if (xr != null) { // If we are not even able to parse the message in the SAAJInInterceptor (CXF internal interceptor) this can be null

        // You have the QName
        QName name = xr.getName();

        SOAPMessage msgSOAP = msg.getContent(SOAPMessage.class);

        // Read soap msg
        if (msgSOAP != null) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            msgSOAP.writeTo(byteArrayOutputStream);
            String encoding = (String) msg.get(Message.ENCODING);
            String xmlRequest = new String(byteArrayOutputStream.toByteArray(), encoding);
        }

        // Forward to external service with JAX-RS implementation
        Client client = ClientBuilder.newClient()
                .target("http://your-target")
                .path("/custom-path")
                .request()
                .post(Entity.entity(xmlRequest, MediaType.APPLICATION_XML));
    }
}

Hope this help.