Web services 将请求从CFX服务转发到外部端点
目前,我正在解决以下问题: 在特殊情况下,我需要将SOAP请求转发给外部服务(决策基于SOAP消息中提供的Web services 将请求从CFX服务转发到外部端点,web-services,cxf,single-page-application,Web Services,Cxf,Single Page Application,目前,我正在解决以下问题: 在特殊情况下,我需要将SOAP请求转发给外部服务(决策基于SOAP消息中提供的tenantId)。我为这个任务创建了一个拦截器,从消息请求中提取tenantId,获取分配(每个tenantId分配给它自己在不同服务器上运行的服务实例),如果没有分配,我需要像平常一样处理请求 目前我是以这种方式实现的:我在拦截器中创建HttpUrlConnection,并将请求转发到外部端点(如果存在分配),获取响应的outputStream,然后通过HttpServletRespon
tenantId
)。我为这个任务创建了一个拦截器,从消息请求中提取tenantId
,获取分配(每个tenantId
分配给它自己在不同服务器上运行的服务实例),如果没有分配,我需要像平常一样处理请求
目前我是以这种方式实现的:我在拦截器中创建HttpUrlConnection
,并将请求转发到外部端点(如果存在分配),获取响应的outputStream
,然后通过HttpServletResponse.getOutputStream
等发送响应
我还需要考虑使用各种服务的拦截器(在SOAP请求中必须提供<代码> TANANDID < /COD>)。 我还阅读了有关提供程序和分派对象的内容,但不确定这应该如何工作
有没有办法从传入消息中获取目标服务和端口(QNames)我现在不能使用Camel(只允许使用CXF)。也许您可以尝试以下方法:
/** 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));
}
}
希望这有帮助