Передача параметров URL-адреса при использовании HTTP POST
Можно ли передавать параметры на веб-страницу через URL-адрес (после вопросительного знака) при использовании метода POST? Я знаю, что он работает (в большинстве случаев, в любом случае), потому что моя компания webapp делает это часто, но я не знаю, действительно ли она поддерживается в стандарте или я могу положиться на это поведение. Я рассматриваю возможность использования обработчика запросов SOAP, который использует параметр после вопросительного знака, чтобы указать, что это SOAP-запрос, а не обычный HTTP-запрос. Причиной этого является то, что webapp является расширением IIS, поэтому все доступны через один и тот же URL-адрес (например: example.com/myisapi.dll?command), поэтому чтобы запрос SOAP был обработан, мне нужно указать, что "команда". Для SOAP будет одна общая команда, а не отдельная команда для каждого действия SOAP - они будут указаны в самом запросе SOAP.
В основном, я пытаюсь интегрировать библиотеку Apache Axis2/C в мой webapp, позволяя webapp обрабатывать HTTP-запрос, а затем передавать входящий XML SOAP в Axis2 для обработки, если это запрос SOAP. Интуитивно я не вижу причин, почему это не сработает, поскольку URL-адрес, который вы отправляете, является просто произвольным URL-адресом, насколько это касается всех различных компонентов... это сервер, который придает особое значение части после вопросительного знака.
Спасибо за любую помощь/понимание, которое вы можете предоставить.
Ответы
Ответ 1
Давайте начнем с простого материала. HTTP-запросы запроса GET поступают из URI. URI является запрошенным ресурсом, поэтому любой веб-сервер должен (и apache) иметь весь URI, хранящийся в некоторой переменной, доступной для модулей или компонентов приложений, работающих на веб-сервере.
http POST, который отличается от HTTP GET, является отдельным логическим вызовом веб-сервера, но он все еще определяет URI, который должен обрабатывать сообщение. Хороший веб-сервер (один из apache) снова сделает URI доступным для любого модуля или сервера приложений в нем, затем дополнительно предоставит переменные, которые были отправлены в заголовках POST.
В момент, когда ваше приложение получает контроль над apache во время POST, вы должны иметь доступ к переменным GET и POST и иметь возможность выполнять любую логику управления, в том числе отвечать на протокол SOAP вместо HTML.
Ответ 2
Если вы спрашиваете, можно ли отправлять параметры через GET и POST в одном HTTP-запросе, тогда ответ будет "YES". Это стандартная функциональность, которую можно надежно использовать AFAIK.
Одним из таких примеров является отправка учетных данных аутентификации в две части: одна из GET, а другая через POST, чтобы любая попытка захватить сеанс потребовала захвата как переменных GET, так и POST.
Итак, в вашем случае вы можете использовать POST, чтобы содержать фактический запрос SOAP, но проверить, является ли он SOAP-запросом на основе параметра, переданного в GET (или, другими словами, через URL-адрес).
Ответ 3
Я считаю, что ни один стандарт не определяет концепцию "параметров HTTP" или "переменных запроса". RFC 1738 определяет, что URL-адрес может содержать "часть поиска", которая является подстрокой после вопросительного знака. HTML указывает в протоколе представления формы, как браузер должен обработать элемент FORM. В любом случае, как серверная сторона обрабатывает как часть поиска, так и тело HTTP полностью зависит от сервера - отбрасывание обоих будет соответствовать этим двум спецификациям (но довольно бесполезно).
Чтобы определить, можно ли отправить часть поиска в определенную службу, вам необходимо изучить эту спецификацию протокола обслуживания. Если сервис практически определен с помощью HTML-формы, вы не можете использовать микс - вы даже не можете использовать POST, если FORM указывает GET (и наоборот). Если вы отправляете сообщение в веб-службу, вам нужно посмотреть WSDL веб-сервиса, который обычно будет выполнять POST; со всеми данными в SOAP-сообщении. Etc.
Конкретные веб-фреймворки могут иметь понятие "переменных запроса" - будут ли они рисовать эти переменные как из части поиска, так и из тела запроса, вам нужно узнать в документации продукта.
Ответ 4
Я развернул веб-приложение с 3 (оператором мобильной сети) в Великобритании. Первоначально он использовал параметры POST, но 3 шлюза разделил их (и X-заголовки тоже!). Так что будьте осторожны...
Ответ 5
допустимое? Конечно, это выполнимо, но я склоняюсь к спецификации, предлагающей двойные методы, которые не обязательно должны произойти или поддерживаться. RFC2616 определяет HTTP/1.1, и я бы сказал, что предлагает только один метод для каждого запроса. если вы думаете о своей типичной транзакции HTTP с клиентской стороны, вы также можете увидеть это ограничение:
$ telnet localhost 80
POST /page.html?id=5 HTTP/1.1
host: localhost
как вы можете видеть, вы можете использовать только один метод (POST/GET и т.д.), однако из-за характера работы разных языков они могут забрать строку запроса и назначить ее GET переменная. в конечном счете, хотя это запрос POST, а не GET.
так что в принципе, да эта функциональность существует, она предназначена? я бы сказал нет.