Почему конечный слеш в веб-сервисе так важен?

Я тестировал веб-сервис на 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 - нет. Вам нужно будет сделать следующее:

  1. Попробуйте подключиться к начальному URL
  2. Поймать любой 301 перенаправление и, возможно, 302 перенаправления также
  3. Если было перенаправление, попробуйте подключиться к этому 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 не справляется и с перенаправлениями.

Другие вопросы по тегам