2014-05-21 17 views
7

Próbuję wywołać SOAP RPC usługę styl internetową i otrzymuję następujący błąd:HTTP kod błędu: 302 Dzwoniąc https WebService

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

Jest to usługa https internetowej i ja importowany certyfikat do cacerts przez przeglądarkę, ale uzyskując ten sam wynik. Należy pamiętać, że mogę spożywać usługę sieciową REST z tego samego komputera bez importowania certyfikatu.

Czego mi brakuje podczas wywoływania usługi SOAP? Czy jest to problem mojego klienta, czy coś trzeba zrobić po stronie serwera. Mam dostęp do serwera.

Odpowiedz

10

Kod stanu HTTP 302 jest przekierowaniem, a więc jest mało prawdopodobne z powodu problemu z certyfikatem. Domyślam się, że musisz dodać/(lub usunąć) z adresu URL. Niektóre ramy serwera http przekieruje gdy zasób nie kończy się w /, więc zamiast:

GET /myRpcEndpoint 

Spróbuj

GET /myRpcEndpoint/ 

Inną możliwością jest to, że ten zasób wymaga uwierzytelnienia i serwer przekierowuje do strony logowania. Jeśli chcesz wiedzieć, co się dzieje (i nie zgadnij), spójrz na nagłówki odpowiedzi dla 302. Będzie tam nagłówek Location, informujący cię, gdzie serwer chce, abyś zamiast tego.

+0

Witaj Eric - Wielkie dzięki! Używam wsimport z poprawną usługą wsdl (np. Https://sa-sf.erp.net/testWSthree/service?wsdl). Domyślam się, że adres URL lub lokalizacja są dobre. O drugiej możliwości, jak mogę zobaczyć nagłówek odpowiedzi? Wywołuję usługę z aplikacji klienta testowego w czasie zaćmienia. – JoyLahi

+0

Korzystając z HTTPWatch, zauważyłem, że serwer przekierowuje odpowiedź na http://sa-dev-sf.erp.net/testWSthree/service?wsdl. zamiast https: // .. i ma następujące informacje nagłówka w httpwatch: (Status-Line) HTTP/1.1 302 Znaleziono Połączenie \t zamknij Lokalizacja https://sa-dev-sf.erp.net/testWSthree/service? wsdl – JoyLahi

+0

cóż, myślę, że sam to wymyśliłeś - przekierowanie to http. Czytanie między wierszami, jeśli ten serwer to ASP.NET, wydaje mi się, że istnieje plik konfiguracyjny (web.config?), Który określa, które adresy URL są zabezpieczone (https), a które nie. Może to tak proste, jak znalezienie pliku konfiguracyjnego. Ale, jestem zgniatanie z ASP, więc nie rób zbyt mocno z moją radą! –

3

Miał podobny problem, gdy kod klienta otrzymywałby kod błędu HTTP 302 podczas komunikowania się z https i działał poprawnie podczas komunikacji z http. W kodzie klienta może być konieczne określenie adresu punktu końcowego w kontekście żądania za pomocą właściwości BindingProvider.ENDPOINT_ADDRESS_PROPERTY. Zgodnie z paradygmatem JAX-WS poniższy przykład powinien zadziałać. Należy pamiętać, że tylko definicja BindingProvider.ENDPOINT_ADDRESS_PROPERTY musi być zdefiniowana, reszta kodu powinna pozostać taka sama.

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

Witam Rami - Dziękuję bardzo za bycie pomocnym! Zmieniłem swój kod odpowiednio.To działa dobrze, gdy wywołuję usługę z Eclipse IDE.Ale gdy zadzwonię do tego samego klienta wdrożonego na naszym serwerze Tomcat ot daje mi błąd. .ws.WebServiceException: Nie można uzyskać dostępu do WSDL na: https: .... Należy pamiętać, że utworzyłem osobny wątek dla tego problemu. Sprawdź, czy możesz mieć jakieś rozwiązanie: http://stackoverflow.com/questions/ 23835441/odbierający-http-302-error-code-when-communicating-with-https-web-service – JoyLahi

2

Wszystko co musisz jest użycie poprawne punktu końcowego adresu URL

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

trzeba importować na górze:

import javax.xml.ws.BindingProvider; 

port jest wywołanie metody:

pełne źródło :

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); 
} 
Powiązane problemy