【问题标题】:HTTP error code: 302 when calling https webserviceHTTP错误代码:调用https webservice时出现302
【发布时间】:2014-05-21 16:00:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: web-services ssl


    【解决方案1】:

    HTTP 状态码 302 是重定向,因此不太可能是由于证书问题。我最初的猜测是您需要从您的 URL 中添加 / (或删除它)。当资源不以 / 结尾时,一些 http 服务器框架会重定向,因此,而不是:

    GET /myRpcEndpoint
    

    试试

    GET /myRpcEndpoint/
    

    另一种可能性是此资源需要身份验证,并且服务器将您重定向到登录页面。如果您想知道发生了什么(而不是猜测),请查看 302 的响应标头。会有一个 Location 标头告诉您服务器希望您去哪里。

    【讨论】:

    • 嗨,埃里克 - 非常感谢!我正在使用带有有效服务 wsdl 的 wsimport(例如 sa-sf.erp.net/testWSthree/service?wsdl)。所以,我猜 url 或 location 都不错。关于另一种可能性,我怎样才能看到响应标头?我从 Eclipse 中的测试客户端应用程序调用该服务。
    • 使用 HTTPWatch,我注意到服务器将响应重定向到 sa-dev-sf.erp.net/testWSthree/service?wsdl。而不是 https://.. 并且在 httpwatch 中有以下标题信息:(状态行)HTTP/1.1 302 找到连接关闭位置sa-dev-sf.erp.net/testWSthree/service?wsdl
    • 好吧,我想你自己想通了——重定向是到 http。从字里行间看,如果此服务器是 ASP.NET,我相信有一个配置文件 (web.config?) 指定哪些 URL 是安全的 (https) 而哪些不是。也许就像找到配置文件一样简单。但是,我对 ASP 很差劲,所以不要太看重我的建议!
    • 嗨,埃里克 - 非常感谢您的耐心!这是托管在 Apache Tomcat 中的 java 应用程序。 Tomcat服务器有server.xml、context.xml、web.xml等文件。 Server.xml 文件有这样的条目: 但是,端口 8443(假设是 ssl 端口)被注释了出去。请帮助或让我知道在哪里可以获得帮助。我是这个领域的新手。
    • 我们在某个时间点对所有事物都是陌生的。不幸的是,我的 Tomcat 帮助甚至不如我的 .NET 帮助有用。 :( 希望其他人会提供一些详细信息。或者您可以使用这些新详细信息创建一个新问题。诸如“Tomcat 服务器将 https 重定向到 http”之类的内容并提供您的配置文件和您尝试过的内容。
    【解决方案2】:

    有一个类似的问题,客户端代码在与 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();
    
    }
    

    【讨论】:

    • 嗨拉米 - 非常感谢您的帮助!我已经相应地更改了我的代码。当我从 Eclipse IDE 调用服务时,这工作正常。但是当我调用部署在我们的 tomcat 服务器上的完全相同的客户端时,它给了我错误。 javax.xml.ws.WebServiceException: 访问 WSDL 失败:https:.... 请注意,我已经为这个问题创建了一个单独的线程。看看有没有解决办法:stackoverflow.com/questions/23835441/…
    【解决方案3】:

    您所要做的就是使用正确的端点网址

    ((BindingProvider)port).getRequestContext().put(BindingProvider.
            ENDPOINT_ADDRESS_PROPERTY, "https://yourservice");
    

    需要在顶部导入:

    import javax.xml.ws.BindingProvider;
    

    端口是方法调用:

    完整来源:

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

    【讨论】:

    • 像魅力一样工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2023-04-05
    • 2017-06-20
    • 1970-01-01
    • 2014-12-25
    • 2012-02-20
    相关资源
    最近更新 更多