2009-07-27 16 views
7

Stavo testando un servizio web in PHP e Python. L'indirizzo del servizio web era, diciamo, http://my.domain.com/my/webservice. Quando ho provato il servizio web in PHP usando quell'URL, tutto ha funzionato bene. Ma, quando ho usato la stessa posizione ma in Python usando SOAPpy ho avuto un errore.Perché la barra finale del servizio Web è così importante?

Di seguito è il codice che ho usato per comunicare con il servizio web (Python):

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice', namespace) 
server.myFunction() 

Il rispondono ho ricevuto dal server:

HTTPError: <HTTPError 301 Moved Permanently> 

ho capire che, se posso aggiungere un barra finale alla posizione del servizio Web funziona!

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace) 
server.myFunction() 

Perché la mancanza della barra finale causa l'errore?

risposta

19

Sono URL diversi. http://my.domain.com/my/webservice implica un file webservice nella cartella my. http://my.domain.com/my/webservice/ implica il documento predefinito all'interno della cartella my/webservice.

Molti server Web correggeranno automaticamente tali URL, ma non è necessario per farlo.

2

[Disclaimer: Questa è una copia della mia risposta from here. So che alcune persone non piace questo tipo di copia, ma questo spiega il motivo per cui la barra è importante.]

Immaginate voi servite una pagina

http://mydomain.com/bla 

che contiene

<a href="more.html">Read more...</a> 

Al clic , il browser dell'utente recupererebbe http://mydomain.com/more.html. Se aveste invece servito

http://mydomain.com/bla/ 

(con lo stesso contenuto), il browser recupera http://mydomain.com/bla/more.html. Per evitare questa ambiguità, il reindirizzamento aggiunge una barra se l'URL punta a una directory.

3

L'errore è un reindirizzamento 301 che significa che si viene reindirizzati all'URL con la barra alla fine del server web.

Sembra che PHP seguirà automaticamente questo reindirizzamento e quindi non genererà l'errore, mentre Python non lo farà. Sarà necessario effettuare le seguenti operazioni:

  1. tenta di connettersi al all'URL iniziale
  2. Cattura qualsiasi redirect 301 e forse 302 reindirizza così
  3. Se ci fosse un reindirizzamento quindi provare a connettersi a tale URL invece .

Il nuovo URL deve essere disponibile nelle intestazioni di risposta.

HTH.

0

L'aspetto di un URL SOAP dipende dal server, se una barra è necessaria dipende dal server e dall'implementazione SOAP.

Nel tuo caso, presumo che il server di destinazione sia un server Apache e l'URL SOAP sia in realtà una directory che contiene lo script di gestione SOAP. Quando si accede a http://my.domain.com/my/webservice sul server, apache decide che la directory viene indirizzata correttamente come http://my.domain.com/my/webservice/ e invia un reindirizzamento 301.

SOAP utilizza un POST http, relativo al client per decidere se il reindirizzamento deve essere seguito o meno, presumo che non se lo aspetti.

Altre implementazioni di SOAP, ad es. Gli Apache Axis in Java hanno URL che assomigliano a Servlet, ad es. http://domain.com/soap/webservice senza barra, in questo caso l'URL senza barra è corretto, non esiste comunque alcuna directory.

L'asse non funziona anche sui reindirizzamenti, penso.