Перейти к содержимому

Как передать параметры в post запросе

  • автор:

Как передать параметры в post запросе

Добрый вечер всем. Есть пример запроса:

curl -X POST \
‘http://localhost/vip/v1/authUser’ \
-H ‘api_key: ХХХ’ \
-H ‘cache-control: no-cache’ \
-H ‘date_time: 2017-06-03 18:41:00’ \
-F login=vashlogin \
-F password=vashparol

Создаю http соединение, в заголовки добавляю соответствие, в котором описываю поля (-Н).
А вот как правильно передавать параметры -F?
Пробовал так:

Запрос = Новый HTTPЗапрос(СервисРесурс,Заголовки);
Запрос.УстановитьТелоИзСтроки(«login=»+ЛогинГП+»&password=»+ПарольГП);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Приходит ошибка 400.
Подскажите пожалуйста

(0) Установите Charles — реально классная штука.
С помощью неё можно посмотреть, что в действительности отправляет 1С, ну, и что получает в ответ.
https://habrahabr.ru/company/redmadrobot/blog/269109/
Я его даже с HTTPS использовал. Сертификат только подсунуть нужно.

Тело POST-запроса, кстати, имеет определенный формат и его можно легко сформировать вручную.

(1) спасибо за ссылку. Попробовал через

WinHttp = Новый COMОбъект(«WinHttp.WinHttpRequest.5.1»);

Передача данных query string — Протокол HTTP

Помимо того, что данные на сервер можно передавать через body, которое используется при POST запросах и отправке форм, мы также можем передать так называемую строку запроса query string. Это параметры ключ=значение, которые располагаются в request line после указания глагола POST или GET.

=value HTTP/1.1 

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

=value HTTP/1.1 

query string имеет такой же формат, как и строка в body при POST запросе, только в начале ставится знак ? . После него мы можем передавать параметры key=value&key2=value2 и так далее.

Параметры query string не имеют никакого отношения к GET-запросам, хотя многие разработчики называют их GET-параметрами. На собеседованиях иногда задают вопрос: «Можно ли одновременно отправить POST и GET параметры?». Правильный ответ — конечно можно, так как никакой связи между ними нет. Более того, в некоторых языках существуют способы получения этих данных отдельно друг от друга. Например, в PHP есть глобальный массив $_REQUEST , в который попадают как параметры, переданные через query string, так и переданные в POST.

Но как понять, когда и для чего использовать query string? Для этого нужно определить, что на самом деле значат глаголы HTTP. Семантика HTTP-глаголов выражается не только в том, какой вам будет возвращен ответ, а еще и в том, как можно с ним работать. Глагол GET считается идемпотентным. Это означает, что его повторное выполнение всегда возвращает один и тот же результат, т.е. это обычный запрос. Мы спрашиваем систему о чем-то, она возвращает нам данные и при этом не изменяет своего внутреннего состояния. Таким образом любой повторный запрос отработает точно так же — детерминировано. В качестве аналогии можно привести чистую функцию. В реальности состояние системы конечно же может поменяться и мы не можем это контролировать, поэтому кэширование не является тривиальной задачей.

POST-запрос, напротив, не является идемпотентным и предназначен для изменения данных. Таким образом повторный запрос может приводить к другим результатам. Если первым POST-запросом мы удаляем данные, то вторым получим ошибку 404. Такие запросы никогда не кешируются.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

XMLHttpRequest POST, формы и кодировка

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/xmlhttprequest.

Во время обычной отправки формы браузер собирает значения её полей, делает из них строку и составляет тело GET/POST-запроса для посылки на сервер.

При отправке данных через XMLHttpRequest , это нужно делать самим, в JS-коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять.

Кодировка urlencoded

Основной способ кодировки запросов – это urlencoded, то есть – стандартное кодирование URL.

Здесь есть два поля: name=Ivan и surname=Ivanov .

Браузер перечисляет такие пары «имя=значение» через символ амперсанда & и, так как метод GET, итоговый запрос выглядит как /submit?name=Ivan&surname=Ivanov .

Все символы, кроме английских букв, цифр и — _ . ! ~ * ‘ ( ) заменяются на их цифровой код в UTF-8 со знаком %.

Например, пробел заменяется на %20 , символ / на %2F , русские буквы кодируются двумя байтами в UTF-8, поэтому, к примеру, Ц заменится на %D0%A6 .

Будет отправлена так: /submit?name=%D0%92%D0%B8%D0%BA%D1%82%D0%BE%D1%80&surname=%D0%A6%D0%BE%D0%B9 .

в JavaScript есть функция encodeURIComponent для получения такой кодировки «вручную»:

alert( encodeURIComponent(' ') ); // %20 alert( encodeURIComponent('/') ); // %2F alert( encodeURIComponent('В') ); // %D0%92 alert( encodeURIComponent('Виктор') ); // %D0%92%D0%B8%D0%BA%D1%82%D0%BE%D1%80

Эта кодировка используется в основном для метода GET, то есть для передачи параметра в строке запроса. По стандарту строка запроса не может содержать произвольные Unicode-символы, поэтому они кодируются как показано выше.

GET-запрос

Формируя XMLHttpRequest, мы должны формировать запрос «руками», кодируя поля функцией encodeURIComponent .

Например, для посылки GET-запроса с параметрами name и surname , аналогично форме выше, их необходимо закодировать так:

// Передаём name и surname в параметрах запроса var xhr = new XMLHttpRequest(); var params = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname); xhr.open("GET", '/submit?' + params, true); xhr.onreadystatechange = . ; xhr.send();

Прочие заголовки

Браузер автоматически добавит к запросу важнейшие HTTP-заголовки, такие как Content-Length и Connection .

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

Сообщаем про AJAX

Запрос, отправленный кодом выше через XMLHttpRequest , никак не отличается от обычной отправки формы. Сервер не в состоянии их отличить.

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

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

POST с urlencoded

В методе POST параметры передаются не в URL, а в теле запроса. Оно указывается в вызове send(body) .

В стандартных HTTP-формах для метода POST доступны три кодировки, задаваемые через атрибут enctype :

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

В зависимости от enctype браузер кодирует данные соответствующим способом перед отправкой на сервер.

В случае с XMLHttpRequest мы, вообще говоря, не обязаны использовать ни один из этих способов. Главное, чтобы сервер наш запрос понял. Но обычно проще всего выбрать какой-то из стандартных.

В частности, при POST обязателен заголовок Content-Type , содержащий кодировку. Это указание для сервера – как обрабатывать (раскодировать) пришедший запрос.

Для примера отправим запрос в кодировке application/x-www-form-urlencoded :

var xhr = new XMLHttpRequest(); var body = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname); xhr.open("POST", '/submit', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = . ; xhr.send(body);

Только UTF-8

Всегда используется только кодировка UTF-8, независимо от языка и кодировки страницы.

Если сервер вдруг ожидает данные в другой кодировке, к примеру windows-1251, то их нужно будет перекодировать.

Кодировка multipart/form-data

Кодировка urlencoded за счёт замены символов на %код может сильно «раздуть» общий объём пересылаемых данных. Поэтому для пересылки файлов используется другая кодировка: multipart/form-data.

В этой кодировке поля пересылаются одно за другим, через строку-разделитель.

Чтобы использовать этот способ, нужно указать его в атрибуте enctype и метод должен быть POST:

Форма при такой кодировке будет выглядеть примерно так:

. Заголовки. Content-Type: multipart/form-data; boundary=RaNdOmDeLiMiTeR --RaNdOmDeLiMiTeR Content-Disposition: form-data; name="name" Виктор --RaNdOmDeLiMiTeR Content-Disposition: form-data; name="surname" Цой --RaNdOmDeLiMiTeR--

…То есть, поля передаются одно за другим, значения не кодируются, а чтобы было чётко понятно, какое значение где – поля разделены случайно сгенерированной строкой, которую называют «boundary» (англ. граница), в примере выше это RaNdOmDeLiMiTeR :

Сервер видит заголовок Content-Type: multipart/form-data , читает из него границу и раскодирует поля формы.

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

Однако, никто не мешает использовать эту кодировку всегда для POST запросов. Для GET доступна только urlencoded.

POST с multipart/form-data

Сделать POST-запрос в кодировке multipart/form-data можно и через XMLHttpRequest.

Достаточно указать в заголовке Content-Type кодировку и границу, и далее сформировать тело запроса, удовлетворяющее требованиям кодировки.

Пример кода для того же запроса, что и раньше, теперь в кодировке multipart/form-data :

var data = < name: 'Виктор', surname: 'Цой' >; var boundary = String(Math.random()).slice(2); var boundaryMiddle = '--' + boundary + '\r\n'; var boundaryLast = '--' + boundary + '--\r\n' var body = ['\r\n']; for (var key in data) < // добавление поля body.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n' + data[key] + '\r\n'); >body = body.join(boundaryMiddle) + boundaryLast; // Тело запроса готово, отправляем var xhr = new XMLHttpRequest(); xhr.open('POST', '/submit', true); xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); xhr.onreadystatechange = function() < if (this.readyState != 4) return; alert( this.responseText ); >xhr.send(body);

Тело запроса будет иметь вид, описанный выше, то есть поля через разделитель.

Отправка файла

Можно создать запрос, который сервер воспримет как загрузку файла.

Для добавления файла нужно использовать тот же код, что выше, модифицировав заголовки перед полем, которое является файлом, так:

Content-Disposition: form-data; name="myfile"; filename="pic.jpg" Content-Type: image/jpeg (пустая строка) содержимое файла

FormData

Современные браузеры, исключая IE9- (впрочем, есть полифил), поддерживают встроенный объект FormData, который кодирует формы для отправки на сервер.

Это очень удобно. Например:

    

Этот код отправит на сервер форму с полями name , surname и patronym .

  • Конструктор new FormData([form]) вызывается либо без аргументов, либо с DOM-элементом формы.
  • Метод formData.append(name, value) добавляет данные к форме.

Объект formData можно сразу отсылать, интеграция FormData с XMLHttpRequest встроена в браузер. Кодировка при этом будет multipart/form-data .

Другие кодировки

XMLHttpRequest сам по себе не ограничивает кодировку и формат пересылаемых данных.

Поэтому для обмена данными часто используется формат JSON:

var xhr = new XMLHttpRequest(); var json = JSON.stringify(< name: "Виктор", surname: "Цой" >); xhr.open("POST", '/submit', true) xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); xhr.onreadystatechange = . ; // Отсылаем объект в формате JSON и с Content-Type application/json // Сервер должен уметь такой Content-Type принимать и раскодировать xhr.send(json);

Итого

  • У форм есть две основные кодировки: application/x-www-form-urlencoded – по умолчанию и multipart/form-data – для POST запросов, если явно указана в enctype . Вторая кодировка обычно используется для больших данных и только для тела запроса.
  • Для составления запроса в application/x-www-form-urlencoded используется функция encodeURIComponent .
  • Для отправки запроса в multipart/form-data – объект FormData .
  • Для обмена данными JS ↔ сервер можно использовать и просто JSON, желательно с указанием кодировки в заголовке Content-Type .

В XMLHttpRequest можно использовать и другие HTTP-методы, например PUT, DELETE, TRACE. К ним применимы все те же принципы, что описаны выше.

Что такое параметры post запроса?

Есть ресурс, в котором для того, чтобы получить изображение нужно нажать по нему. После чего изображение сгенерируется.

Если попытаться отобразить изображение, по прямому адресу, без клика по нему, то оно не отобразится. Для этого я в URL время менял.

Суть в том, что я считаю, что браузер генерирует POST запрос и после чего сервер генерирует нужное изображение.

Я хотел это проверить и отправить POST запрос без клика по самому изображению. Однако во вкладке Сеть -> Заголовки никаких post данных в которых бы было указано время снимка нет.

e65e1c47e2af425db7d8ac40aae73c24.png

Зато есть вкладка Параметры, где можно найти имя запрашиваемого изображения. Что это за параметры? Как их отредактировать и вписать туда новое значение, после чего отправить их?

  • Вопрос задан более трёх лет назад
  • 10233 просмотра

Комментировать
Решения вопроса 1

5angel

Фронтенд-лид

Параметры запроса – это key-value данные, которые записываются в url запроса после знака вопроса («свистка»).

Грубо говоря, если мы обращаемся к адресу toster.ru
и хотим передать параметр herp со значением derp, то адрес примет следующий вид:
toster.ru/?herp=derp

Кроме того, множественные параметры должны разделяться знаком «&».
Т.е. если помимо derp мы хотим передать также foo со значением bar, конечный url будет таким:
toster.ru/?herp=derp&foo=bar

Собственно, когда вы в url изменяли время – вы меняли значение соответствующего параметра.

Да, так как в post невозможно передать параметры по аналогии с get, значения будут упакованы внутри тела запроса в зависимости от того, какой у него указан content-type.

Чтобы изменить здесь данные, думаю, лучше воспользоваться специальным плагином (какой-нибудь «Poster» или его аналоги).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *