为什么Web服务中的尾部斜杠如此重要?

时间:2009-07-27 15:43:16

标签: php python wsdl soappy

我正在使用PHP和Python测试Web服务。举例来说,网络服务的地址是http://my.domain.com/my/webservice。当我使用该URL测试PHP中的Web服务时,一切正常。但是,当我使用相同的位置但在使用SOAPpy的Python时,我收到了一个错误。

以下是我用来与Web服务(Python)通信的代码:

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

我从服务器得到的回复:

HTTPError: <HTTPError 301 Moved Permanently>

我发现如果我在Web服务位置添加一个尾部斜杠就可以了!

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

为什么缺少尾部斜杠会导致错误?

5 个答案:

答案 0 :(得分:19)

他们是不同的网址。 http://my.domain.com/my/webservice表示webservice文件夹中的文件myhttp://my.domain.com/my/webservice/表示my / webservice文件夹中的默认文档。

许多网络服务器会自动更正此类网址,但他们不需要这样做。

答案 1 :(得分:3)

因为实际的服务器URL是: http://my.domain.com/my/webservice/

默认情况下,PHP库必须遵循重定向。

答案 2 :(得分:3)

错误是301重定向,这意味着您将被重定向到Web服务器末端带有斜杠的URL。

似乎PHP将自动遵循此重定向,因此不会抛出错误,而Python则不会。您需要执行以下操作:

  1. 尝试连接到初始网址
  2. 同时捕获任何301重定向和可能的302重定向
  3. 如果有重定向,请尝试连接到该网址。
  4. 新的URL应该在响应标头中可用。

    HTH。

答案 3 :(得分:2)

[免责声明:这是我的回复from here的副本。我知道有些人不喜欢这种复制,但这解释了为什么斜线很重要。]

想象一下,你提供了一个页面

http://mydomain.com/bla

包含

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

点击后,用户的浏览器将检索http://mydomain.com/more.html。如果你没有服务

http://mydomain.com/bla/

(内容相同),浏览器会检索http://mydomain.com/bla/more.html。为避免这种歧义,如果URL指向目录,重定向会附加一个斜杠。

答案 4 :(得分:0)

SOAP-URL的外观取决于服务器,如果需要斜杠取决于服务器和SOAP实现。

在您的情况下,我假设目标服务器是一个apache服务器,SOAP URL实际上是一个包含SOAP处理脚本的目录。 当您访问服务器上的http://my.domain.com/my/webservice时,apache会确定该目录已正确解决为http://my.domain.com/my/webservice/并发送301重定向。

SOAP使用一个http POST,它由客户端决定是否应该遵循重定向,我认为它只是不期望一个。

SOAP的其他实现,例如Java中的Apache Axis具有看起来像Servlet的URL,例如http://domain.com/soap/webservice没有斜杠,在这种情况下,没有斜杠的URL是正确的,无论如何都没有目录。

Axis在重定向方面也失败了,我想。