我正在尝试调用SOAP RPC样式的Web服务并收到以下错误:
线程“main”中的异常com.sun.xml.internal.ws.client.ClientTransportException:服务器发送了HTTP状态码302:
这是一个https网络服务,我已通过浏览器将证书导入cacerts但得到相同的结果。请注意,我可以在不导入证书的情况下从同一台计算机上使用REST Web服务。
调用SOAP服务时我缺少什么?是我的客户端问题还是需要在服务器端完成的事情。我可以访问服务器。
答案 0 :(得分:11)
HTTP状态代码302是重定向,因此不太可能由于证书问题。我最初的猜测是你需要在你的URL中添加/(或删除它)。当资源不以/结尾时,某些http服务器框架将重定向,因此,而不是:
GET /myRpcEndpoint
尝试
GET /myRpcEndpoint/
另一种可能性是此资源需要身份验证,服务器会将您重定向到登录页面。如果你想知道发生了什么(而不是猜测),看一下302的响应标题。会有一个Location标题告诉你服务器要你去哪里。
答案 1 :(得分:4)
有一个类似的问题,客户端代码在与https通信时会收到HTTP 302错误代码,并且在与http通信时可以正常工作。在客户端代码中,您可能需要使用BindingProvider.ENDPOINT_ADDRESS_PROPERTY属性在请求上下文中指定端点地址。遵循JAX-WS范例,下面的示例应该可行。 请注意,只需要定义BindingProvider.ENDPOINT_ADDRESS_PROPERTY,其余代码应保持不变。
public static void main(String args[]) throws {
ObjectFactory factory = new ObjectFactory();
GetProducts_Service service = new GetProducts_Service();
GetProducts getProducts = service.getGetProductsPort();
final BindingProvider getProductsBP = (BindingProvider) getProducts;
getProductsBP.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"https://example.server.net/ExampleServicesWar/GetProducts");
GetProductsRequest request = factory.createGetProductsRequest();
GetProductsResponse response=getProducts.getProducts(request);
List<Product> products=response.getProducts();
}
答案 2 :(得分:2)
您只需要使用正确的终点网址
((BindingProvider)port).getRequestContext().put(BindingProvider.
ENDPOINT_ADDRESS_PROPERTY, "https://yourservice");
需要在顶部导入:
import javax.xml.ws.BindingProvider;
port是方法调用:
完整来源:
private static String getApplicationStatus(java.lang.String remoteAccessKey, java.lang.Integer responseId) {
net.quotit.oes._2010.ws.applicationstatusupdate.OASStatusUpdateService service = new net.quotit.oes._2010.ws.applicationstatusupdate.OASStatusUpdateService();
net.quotit.oes._2010.ws.applicationstatusupdate.IApplicationStatusUpdate port = service.getStatusUpdate();
((BindingProvider)port).getRequestContext().put(BindingProvider.
ENDPOINT_ADDRESS_PROPERTY, "https://servicename/basic");
return port.getApplicationStatus(remoteAccessKey, responseId);
}