8

我正在用 PHP 和 Python 测试一个 Web 服务。比如说,Web 服务的地址是http://my.domain.com/my/webservice. 当我使用该 URL 在 PHP 中测试 Web 服务时,一切正常。但是,当我使用相同的位置但在 Python 中使用 SOAPpy 时出现错误。

下面是我用来与 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()

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

4

5 回答 5

20

它们是不同的 URL。http://my.domain.com/my/webservice表示文件夹webservice中的my文件。http://my.domain.com/my/webservice/暗示 my/webservice 文件夹中的默认文档。

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

于 2009-07-27T15:46:21.997 回答
3

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

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

于 2009-07-27T15:45:14.417 回答
3

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

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

  1. 尝试连接到初始 URL
  2. 捕获任何 301 重定向和可能的 302 重定向
  3. 如果有重定向,则尝试连接到该 URL。

新的 URL 应该在响应标头中可用。

HTH。

于 2009-07-27T15:56:07.640 回答
2

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

想象一下你提供一个页面

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 指向一个目录,重定向会附加一个斜杠。

于 2009-07-27T15:50:33.643 回答
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 在重定向上也失败了。

于 2009-07-27T16:01:16.117 回答