Передача параметров в URL при использовании HTTP POST - PullRequest
9 голосов
/ 04 ноября 2008

Допустимо ли передавать параметры на веб-страницу через URL (после знака вопроса) при использовании метода POST? Я знаю, что это работает (в большинстве случаев, во всяком случае), потому что веб-приложение моей компании делает это часто, но я не знаю, поддерживается ли оно на самом деле в стандарте или могу ли я положиться на это поведение. Я рассматриваю возможность реализации обработчика запросов SOAP, который использует параметр после знака вопроса, чтобы указать, что это запрос SOAP, а не обычный запрос HTTP. Причиной этого является то, что веб-приложение является расширением IIS, поэтому доступ ко всему осуществляется через один и тот же URL-адрес (например, example.com/myisapi.dll?command), поэтому для получения SOAP-запроса, который нужно обработать, нужно указать, что " Команда "Параметр. Для SOAP будет одна общая команда, а не конкретная команда для каждого действия SOAP - они будут указаны в самом запросе SOAP.

По сути, я пытаюсь интегрировать библиотеку Apache Axis2 / C в мое веб-приложение, позволяя веб-приложению обрабатывать HTTP-запрос, а затем передавать входящий SOAP XML в Axis2 для обработки, если это SOAP-запрос. Интуитивно понятно, что я не вижу никакой причины, по которой это не сработает, поскольку отправляемый вами URL-адрес - это просто произвольный URL-адрес, поскольку речь идет о всех различных компонентах ... именно сервер придает особое значение части после знака вопроса.

Спасибо за любую помощь / понимание, которое вы можете предоставить.

Ответы [ 5 ]

6 голосов
/ 04 ноября 2008

Давайте начнем с простых вещей. Переменные запроса HTTP GET приходят из URI. URI является запрошенным ресурсом, и поэтому любой веб-сервер должен (и apache) хранит весь URI в некоторой переменной, доступной для модулей или компонентов сервера приложений, работающих на веб-сервере.

HTTP POST, который отличается от http GET, - это отдельный логический вызов веб-сервера, но он по-прежнему определяет URI, который должен обрабатывать сообщение. Хороший веб-сервер (Apache, являющийся таковым) снова сделает URI доступным для любого модуля или сервера приложений, которые в нем работают, а затем дополнительно сделает доступными переменные, которые были отправлены в заголовках POST.

В тот момент, когда ваше приложение получает контроль от apache во время POST, вы должны иметь доступ к переменным GET и POST и иметь возможность выполнять любую управляющую логику, какую пожелаете, включая ответ с использованием протокола SOAP вместо HTML.

3 голосов
/ 04 ноября 2008

Я полагаю, что ни один стандарт на самом деле не определяет понятие «параметры HTTP» или «переменные запроса». RFC 1738 определяет, что URL может иметь «поисковую часть», которая является подстрокой после знака вопроса. HTML указывает в протоколе отправки формы, как браузер, обрабатывающий элемент FORM, должен представить его. В любом случае, то, как серверная часть обрабатывает как часть поиска, так и тело HTTP, полностью зависит от сервера - отказ от обоих будет соответствовать этим двум спецификациям (но довольно бесполезен).

Чтобы определить, можете ли вы опубликовать поисковую часть в определенной службе, вам необходимо изучить спецификацию протокола этой службы. Если сервис практически определяется с помощью HTML-формы, вы не можете использовать микс - вы даже не можете использовать POST, если FORM указывает GET (и наоборот). Если вы публикуете в веб-сервисе, вам нужно взглянуть на WSDL веб-сервиса, который обычно требует POST; со всеми данными в сообщении SOAP. И т.д.

Определенные веб-фреймворки могут иметь понятие «переменные запроса» - будут ли они извлекать эти переменные как из поисковой части, так и из тела запроса, вы должны выяснить в документации продукта.

3 голосов
/ 04 ноября 2008

Если вы спрашиваете, можно ли отправлять параметры через GET и POST в одном HTTP-запросе, тогда ответ «ДА». Это стандартная функциональность, которая может быть надежно использована AFAIK.

Один из таких примеров - отправка учетных данных для аутентификации в двух частях, одна через GET, а другая через POST, так что любая попытка перехватить сеанс потребует перехвата переменных GET и POST.

Таким образом, в вашем случае вы можете использовать POST, чтобы содержать фактический запрос SOAP, но проверить, является ли он запросом SOAP на основе параметра, переданного в GET (или другими словами через URL).

2 голосов
/ 04 ноября 2008

допустимый? конечно, это выполнимо, но я склоняюсь к спецификации, предполагающей, что двойные методы не обязательно должны происходить или поддерживаться. RFC2616 определяет HTTP / 1.1, и я бы сказал, предлагает только один метод на запрос. если вы думаете о типичной HTTP-транзакции со стороны клиента, вы также можете увидеть ограничение:

$ telnet localhost 80
POST /page.html?id=5 HTTP/1.1
host: localhost

Как видите, вы можете использовать только один метод (POST / GET и т. Д.), Однако из-за особенностей работы различных языков они могут подобрать строку запроса и назначить ее для GET. переменная. в конечном счете, это запрос POST, а не GET.

так в принципе, да эта функциональность существует, она предназначена? я бы сказал нет .

2 голосов
/ 04 ноября 2008

Я развернул веб-приложение с 3 (оператор мобильной сети) в Великобритании. Первоначально он использовал параметры POST, но шлюз 3 удалил их (и X-заголовки также!). Так что будьте осторожны ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...