Почему конечный слеш в веб-сервисе так важен?
Я тестировал веб-сервис на PHP и Python. Адрес веб-службы был, скажем, http://my.domain.com/my/webservice
, Когда я тестировал веб-сервис на PHP, используя этот URL, все работало нормально. Но когда я использовал то же местоположение, но в Python, используя SOAPpy, я получил ошибку.
Ниже приведен код, который я использовал для связи с веб-сервисом (Python):
from SOAPpy import WSDL
server = SOAPProxy('http://my.domain.com/my/webservice', namespace)
server.myFunction()
Ответ, который я получил от сервера:
HTTPError: <HTTPError 301 Moved Permanently>
Я понял, что если я добавлю косую черту в расположение веб-службы, это сработает!
from SOAPpy import WSDL
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace)
server.myFunction()
Почему отсутствие косой черты вызывает ошибку?
5 ответов
Это разные URL. http://my.domain.com/my/webservice
подразумевает файл webservice
в my
папка. http://my.domain.com/my/webservice/
подразумевает документ по умолчанию в папке my/webservice.
Многие веб-серверы автоматически исправляют такие URL-адреса, но они не обязаны это делать.
Поскольку фактический URL-адрес сервера: http://my.domain.com/my/webservice/
Библиотека PHP должна следовать перенаправлениям по умолчанию.
Ошибка - перенаправление 301, означающее, что вы перенаправлены на URL с косой чертой в конце веб-сервером.
Похоже, что PHP будет автоматически следовать этому перенаправлению и, следовательно, не выдаст ошибку, а Python - нет. Вам нужно будет сделать следующее:
- Попробуйте подключиться к начальному URL
- Поймать любой 301 перенаправление и, возможно, 302 перенаправления также
- Если было перенаправление, попробуйте подключиться к этому URL.
Новый URL должен быть доступен в заголовках ответа.
НТН.
[Отказ от ответственности: это копия моего ответа отсюда. Я знаю, что некоторым людям не нравится такое копирование, но это объясняет, почему слэш важен.]
Представьте, что вы обслуживаете страницу
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 указывает на каталог.
Как выглядит SOAP-URL, зависит от сервера, если косая черта необходима, зависит от сервера и реализации SOAP.
В вашем случае я предполагаю, что целевой сервер - это сервер apache, а URL-адрес SOAP - это фактически каталог, содержащий ваш скрипт обработки SOAP. Когда вы обращаетесь к http://my.domain.com/my/webservice на сервере, apache решает, что каталог правильно адресован как http://my.domain.com/my/webservice/ и отправляет перенаправление 301.
SOAP использует HTTP POST, и клиент сам решает, следует ли выполнять перенаправление или нет, я предполагаю, что он просто не ожидает этого.
Другие реализации SOAP, например, Apache Axis в Java, имеют URL-адреса, которые выглядят как сервлеты, например, http://domain.com/soap/webservice без косой черты, в этом случае URL-адрес без косой черты верен, в любом случае каталог не существует.
Я думаю, что Axis не справляется и с перенаправлениями.