2009-07-27 10 views
7

Estaba probando un servicio web en PHP y Python. La dirección del servicio web era, digamos, http://my.domain.com/my/webservice. Cuando probé el servicio web en PHP usando esa URL todo funcionó bien. Pero, cuando utilicé la misma ubicación pero en Python usando SOAPpy, recibí un error.¿Por qué la barra diagonal en el servicio web es tan importante?

A continuación se muestra el código que utiliza para comunicarse con el servicio web (Python):

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

El responden llegué desde el servidor:

HTTPError: <HTTPError 301 Moved Permanently> 

Calculo que si añado una raya vertical a la ubicación del servicio web que funciona!

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

¿Por qué la falta de la barra inclinada final provoca el error?

Respuesta

19

Son URL diferentes. http://my.domain.com/my/webservice implica un archivo webservice en la carpeta my. http://my.domain.com/my/webservice/ implica el documento predeterminado dentro de la carpeta my/webservice.

Muchos servidores web corregirán automáticamente tales URL, pero no es necesario que lo hagan.

2

[Descargo de responsabilidad: Esta es una copia de mi respuesta from here. Sé que algunas personas no les gusta este tipo de copia, pero esto explica por qué la barra es importante.]

Imagínese que usted sirve una página

http://mydomain.com/bla 

que contiene

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

Al hacer clic , el navegador del usuario recuperaría http://mydomain.com/more.html. Si hubiera servido en lugar

http://mydomain.com/bla/ 

(con el mismo contenido), el navegador podría recuperar http://mydomain.com/bla/more.html. Para evitar esta ambigüedad, la redirección agrega una barra inclinada si la URL apunta a un directorio.

3

El error es un redireccionamiento 301, lo que significa que el servidor web lo está redirigiendo a la URL con la barra al final.

Parece que PHP seguirá automáticamente esta redirección y, por lo tanto, no arrojará el error, mientras que Python no lo hará. Usted tendrá que hacer lo siguiente:

  1. intenta conectarse a la URL inicial
  2. Catch cualquier redireccionamiento 301 y, posiblemente, 302 redirecciones, así
  3. Si había una redirección a continuación, intenta conectarse a esa URL en lugar .

La nueva URL debe estar disponible en los encabezados de respuesta.

HTH.

0

La apariencia de una URL SOAP depende del servidor, si es necesaria una barra depende del servidor y de la implementación de SOAP.

En su caso, supongo que el servidor de destino es un servidor apache y el URL SOAP es en realidad un directorio que contiene su script de manejo SOAP. Cuando accede al http://my.domain.com/my/webservice en el servidor, apache decide que el directorio está correctamente direccionado como http://my.domain.com/my/webservice/ y envía un redireccionamiento 301.

SOAP utiliza un HTTP POST, depende del cliente decidir si se debe seguir el redireccionamiento o no, supongo que simplemente no lo espera.

Otras implementaciones de SOAP, p. Ej. Apache Axis en Java tiene URL que se parecen a los servlets, p. http://domain.com/soap/webservice sin barra, en este caso la URL sin barra es correcta, no hay directorio que exista de todos modos.

El eje también falla en los redireccionamientos, creo.

Cuestiones relacionadas