Каков граничный параметр в HTTP-запросе, состоящем из нескольких частей (POST)?

StackOverflow https://stackoverflow.com/questions/2305218

Вопрос

Я пытаюсь разработать устройство боковой панели, которое автоматизирует процесс проверки веб-страницы на предмет изменения моей квоты передачи.Я почти у этого, но есть еще один последний шаг, который мне нужен, чтобы заставить это работать:Отправка HttpRequest с правильными данными POST на страницу php.Используя плагин Firefox, вот как выглядит "Content-Type" заголовка:

Content-Type=multipart/form-data; boundary=---------------------------99614912995

с параметром "boundary", кажущимся случайным, а POSTDATA - это:

POSTDATA =-----------------------------99614912995
Content-Disposition: form-data; name="SOMENAME"

Formulaire de Quota
-----------------------------99614912995
Content-Disposition: form-data; name="OTHERNAME"

SOMEDATA
-----------------------------99614912995--

Я не понимаю, как правильно эмулировать POSTDATA с возвращением таинственного параметра "boundary".

Может быть, кто-нибудь знает, как я могу это решить?

Это было полезно?

Решение

Параметр boundary задается в виде нескольких дефисов плюс случайной строки в конце, но вы можете задать для него вообще любое значение.Проблема в том, что если строка границы отображается в данных запроса, она будет обрабатываться как граница.

Несколько советов и пример функции для отправки составных данных / form-data см. В моем ответе на этот вопрос.Было бы не слишком сложно изменить эту функцию, чтобы использовать цикл для каждой части, которую вы хотели бы отправить.

Другие советы

Процитирую из RFC 1341, раздел 7.2.1, то , что я считаю соответствующими битами на boundary параметр для Content-Type заголовок (для MIME):

Все подтипы "multipart" имеют общий синтаксис ...

Поле типа содержимого для составных объектов требует одного параметра, "boundary", который используется для указания границы инкапсуляции.Граница инкапсуляции определяется как строка, состоящая полностью из двух символов дефиса ("-", десятичный код 45), за которой следует значение параметра границы из поля заголовка Content-Type.

а затем уточняет:

Таким образом, типичное поле заголовка типа содержимого, состоящее из нескольких частей, может выглядеть следующим образом:

 Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p

Это указывает на то, что объект состоит из нескольких частей, каждая из которых имеет структуру, синтаксически идентичную сообщению RFC 822, за исключением того, что область заголовка может быть полностью пустой, и что каждой части предшествует строка --gc0p4Jq0M2Yt08jU534c0p

На что следует обратить внимание:

  1. Граница инкапсуляции должна располагаться в начале строки, т. е. после CRLF (Возврат каретки-Перевод строки).
  2. За границей должен немедленно следовать либо другой CRLF и поля заголовка для следующей части, либо два CRLF, в этом случае полей заголовка для следующей части нет (и поэтому предполагается, что она имеет тип содержимого text / plain).
  3. Границы инкапсуляции не должны появляться внутри самих инкапсуляций и должны быть не длиннее 70 символов, не считая двух ведущих дефисов.

И последнее, но не менее важное:

Граница инкапсуляции, следующая за последней частью тела, является выделенным разделителем, который указывает, что за ней не последуют другие части тела.Такой разделитель идентичен предыдущим разделителям, с добавлением еще двух дефисов в конце строки:

 --gc0p4Jq0M2Yt08jU534c0p-- 

Я надеюсь, что это поможет кому-то еще в будущем, поскольку мне пришлось некоторое время поплутать, прежде чем получить полную картину (пожалуйста, обязательно прочитайте необходимые RFC для получения самого глубокого понимания).

Фактическая спецификация для multipart /form-data находится в RFC 7578.Граница определяется в Раздел 4.1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top