我正在使用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()
为什么缺少尾部斜杠会导致错误?
答案 0 :(得分:19)
他们是不同的网址。 http://my.domain.com/my/webservice
表示webservice
文件夹中的文件my
。 http://my.domain.com/my/webservice/
表示my / webservice文件夹中的默认文档。
许多网络服务器会自动更正此类网址,但他们不需要这样做。
答案 1 :(得分:3)
因为实际的服务器URL是: http://my.domain.com/my/webservice/
默认情况下,PHP库必须遵循重定向。
答案 2 :(得分:3)
错误是301重定向,这意味着您将被重定向到Web服务器末端带有斜杠的URL。
似乎PHP将自动遵循此重定向,因此不会抛出错误,而Python则不会。您需要执行以下操作:
新的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在重定向方面也失败了,我想。