将 header 属性传递给 WS 请求 - JAX RS
Passing header attribute to WS request - JAX RS
我正在尝试连接到一个要求我在连接期间传递特定主机名的 WS。我正在尝试使用 JAX-WS 和 Apache CXF 来实现这一点,但到目前为止我一直没有成功。
我可以使用 CURL
访问端点
curl -v -H 'Host: myHost' http://.../endpoint.jws?wsdl
这里的问题是,每当我尝试访问 WSDL 时,我都需要提供 host
参数。
这是我目前尝试过的方法:
final URL wsdlLocation = URI.create("http://.../endpoint.jws?wsdl").toURL();
log.info("URL : {}", wsdlLocation.toString());
HttpURLConnection cnx = (HttpURLConnection) wsdlLocation.openConnection();
cnx.setRequestProperty("Host", "myHost");
PNMService pnmService = new PNMService(wsdlLocation);
pnmPortType = pnmService.getPNMPort();
和 PNMService
class:
@WebServiceClient(name = "PNMService", targetNamespace = "http://www.myhost.com/pnm/service", wsdlLocation = "${pnm.wsdl.url}")
public class PNMService extends Service {
private static final QName PNMSERVICE_QNAME = new QName("http://www.myhost.com/pnm/service", "PNMService");
PNMService (URL wsdlLocation) {
super(wsdlLocation, PNMSERVICE_QNAME);
}
/**
* @return returns PNMPortType
*/
@WebEndpoint(name = "PNMPort")
PNMPortType getPNMPort () {
return super.getPort(new QName("http://www.myhost.com/pnm/service", "PNMPort"), PNMPortType.class);
}
}
而且每次错误都是一样的:
Caused by: java.io.IOException: Server returned HTTP response code: 503 for URL: http://.../endpoint.jws?wsdl
CURL 命令可以访问相同的 URL(没有主机名 CURL 也会抛出相同的 503 错误)。
到目前为止,我已经尝试了所有这些问题中描述的所有内容(包括系统 属性 方法):
就像那些答案中的评论所暗示的那样,我的 pom 中有 cxf-rt-frontend-jaxrs
cxf-rt-frontend-jaxws
和 cxf-rt-transports-http
,我可以看到正在调用 CXF
org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
但到目前为止,我还没有任何运气。有人可以帮我弄清楚我在这里做错了什么吗?
我终于让它工作了,解决方案背后的技巧很简单。
创建 PNMServie
(即 WebServiceClient
)也会尝试与 WS 建立连接。由于我的 header 限制,这将不可避免地失败。
因此,我所要做的就是创建 WebServiceClient
,而无需实际尝试连接,直到我可以设置 headers。
JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
bean.setServiceClass(PNMPortType.class);
bean.setAddress(wsdlUrl);
bean.setServiceName(new QName("http://.../service", "MyService"));
pnmPortType = (PNMPortType) bean.create();
Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("host", Collections.singletonList("MyHostHeader"));
BindingProvider bindingProvider = (BindingProvider) pnmPortType;
bindingProvider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
bindingProvider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
bindingProvider.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
此外,受限制的 headers 属性 需要按照此答案的描述进行设置:https://whosebug.com/a/50653672/2427453
我正在尝试连接到一个要求我在连接期间传递特定主机名的 WS。我正在尝试使用 JAX-WS 和 Apache CXF 来实现这一点,但到目前为止我一直没有成功。
我可以使用 CURL
访问端点curl -v -H 'Host: myHost' http://.../endpoint.jws?wsdl
这里的问题是,每当我尝试访问 WSDL 时,我都需要提供 host
参数。
这是我目前尝试过的方法:
final URL wsdlLocation = URI.create("http://.../endpoint.jws?wsdl").toURL();
log.info("URL : {}", wsdlLocation.toString());
HttpURLConnection cnx = (HttpURLConnection) wsdlLocation.openConnection();
cnx.setRequestProperty("Host", "myHost");
PNMService pnmService = new PNMService(wsdlLocation);
pnmPortType = pnmService.getPNMPort();
和 PNMService
class:
@WebServiceClient(name = "PNMService", targetNamespace = "http://www.myhost.com/pnm/service", wsdlLocation = "${pnm.wsdl.url}")
public class PNMService extends Service {
private static final QName PNMSERVICE_QNAME = new QName("http://www.myhost.com/pnm/service", "PNMService");
PNMService (URL wsdlLocation) {
super(wsdlLocation, PNMSERVICE_QNAME);
}
/**
* @return returns PNMPortType
*/
@WebEndpoint(name = "PNMPort")
PNMPortType getPNMPort () {
return super.getPort(new QName("http://www.myhost.com/pnm/service", "PNMPort"), PNMPortType.class);
}
}
而且每次错误都是一样的:
Caused by: java.io.IOException: Server returned HTTP response code: 503 for URL: http://.../endpoint.jws?wsdl
CURL 命令可以访问相同的 URL(没有主机名 CURL 也会抛出相同的 503 错误)。
到目前为止,我已经尝试了所有这些问题中描述的所有内容(包括系统 属性 方法):
就像那些答案中的评论所暗示的那样,我的 pom 中有 cxf-rt-frontend-jaxrs
cxf-rt-frontend-jaxws
和 cxf-rt-transports-http
,我可以看到正在调用 CXF
org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
但到目前为止,我还没有任何运气。有人可以帮我弄清楚我在这里做错了什么吗?
我终于让它工作了,解决方案背后的技巧很简单。
创建 PNMServie
(即 WebServiceClient
)也会尝试与 WS 建立连接。由于我的 header 限制,这将不可避免地失败。
因此,我所要做的就是创建 WebServiceClient
,而无需实际尝试连接,直到我可以设置 headers。
JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
bean.setServiceClass(PNMPortType.class);
bean.setAddress(wsdlUrl);
bean.setServiceName(new QName("http://.../service", "MyService"));
pnmPortType = (PNMPortType) bean.create();
Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("host", Collections.singletonList("MyHostHeader"));
BindingProvider bindingProvider = (BindingProvider) pnmPortType;
bindingProvider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
bindingProvider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
bindingProvider.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
此外,受限制的 headers 属性 需要按照此答案的描述进行设置:https://whosebug.com/a/50653672/2427453