2014-05-21 73 views
7

我試圖調用一個SOAP RPC樣式的Web服務,並得到以下錯誤時:HTTP錯誤代碼:302調用HTTPS web服務

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 302:

這是一個HTTPS Web服務,我已經將證書導入到cacerts中通過瀏覽器,但得到相同的結果。請注意,我可以在不導入證書的情況下從同一臺機器上使用REST Web服務。

我在調用SOAP服務時丟失了什麼?這是我的客戶端問題還是需要在服務器端完成的事情?我有權訪問服務器。

回答

10

HTTP狀態碼302是一個重定向,所以不太可能由於證書問題。我最初的猜測是你需要從你的URL中添加一個/(或刪除它)。當資源沒有在/ end一些HTTP服務器框架將重定向,這樣,而不是:

GET /myRpcEndpoint 

嘗試

GET /myRpcEndpoint/ 

另一種可能性是,這種資源需要認證服務器重定向你到一個登錄頁面。如果您想知道發生了什麼(而不是猜測),請查看302的響應標題。將會有一個Location標題,告訴您服務器希望您轉到哪裏。

+0

嗨埃裏克 - 非常感謝!我正在使用wsimport和有效的服務wsdl(例如https://sa-sf.erp.net/testWSthree/service?wsdl)。所以,我想網址或位置都很好。關於另一種可能性,我怎樣才能看到響應頭?我正在從eclipse中的測試客戶端應用程序調用服務。 – JoyLahi

+0

使用HTTPWatch,我注意到服務器將響應重定向到http://sa-dev-sf.erp.net/testWSthree/service?wsdl。而不是https:// ..並在httpwatch中具有以下標題信息:(Status-Line)HTTP/1.1 302找到 連接\t關閉 位置https://sa-dev-sf.erp.net/testWSthree/service? wsdl – JoyLahi

+0

好吧,我想你已經明白了 - 重定向是http。如果這個服務器是ASP.NET,那麼在這兩行之間進行閱讀,我相信有一個配置文件(web.config?),它指定哪些URL是安全的(https),哪些不是。也許這和找到配置文件一樣簡單。但是,我對ASP很失望,所以不要太看我的建議! –

3

有一個類似的問題,即與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(); 

} 
+0

Hi Rami - 非常感謝您的幫助!我已經相應地更改了我的代碼。當我從Eclipse IDE調用服務時工作正常。但是,當我調用部署在我們的Tomcat服務器上的完全相同的客戶端時,它會給我提供錯誤信息。 .ws.WebServiceException:無法訪問WSDL:https:....請注意,我爲此問題創建了單獨的線程。請參閱是否可以有任何解決方案:http://stackoverflow.com/questions/ 23835441 /接收HTTP-302錯誤碼時相通與 - HTTPS的web服務 – JoyLahi

2

所有你必須是使用正確的終點URL

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