HTTP错误代码:302调用https webservice时

时间:2014-05-21 16:00:11

标签: web-services ssl

我正在尝试调用SOAP RPC样式的Web服务并收到以下错误:

  

线程“main”中的异常com.sun.xml.internal.ws.client.ClientTransportException:服务器发送了HTTP状态码302:

这是一个https网络服务,我已通过浏览器将证书导入cacerts但得到相同的结果。请注意,我可以在不导入证书的情况下从同一台计算机上使用REST Web服务。

调用SOAP服务时我缺少什么?是我的客户端问题还是需要在服务器端完成的事情。我可以访问服务器。

3 个答案:

答案 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);
}