Как можно отправить post запрос через crud
Перейти к содержимому

Как можно отправить post запрос через crud

  • автор:

Как отправить данные методом post с помощью curl?

Как правильно записать запрос, чтобы он не пытался открыть файл?

Отслеживать

задан 29 сен 2017 в 11:42

902 1 1 золотой знак 13 13 серебряных знаков 29 29 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Надо сменить -F на -d .

curl -X POST \ https://integration.cdek.ru/new_orders.php \ -H 'content-type: multipaНо выходит ошибка:rt/form-data' \ -d 'xml_request=@        ' 

Отслеживать

ответ дан 29 сен 2017 в 11:45

Andrio Skur Andrio Skur

2,883 3 3 золотых знака 15 15 серебряных знаков 27 27 бронзовых знаков

POST

HTTP-метод POST предназначен для отправки данных на сервер. Тип тела запроса указывается в заголовке Content-Type .

Разница между PUT и POST состоит в том, что PUT является идемпотентным: повторное его применение даёт тот же результат, что и при первом применении (то есть у метода нет побочных эффектов), тогда как повторный вызов одного и того же метода POST может иметь такие эффекты, как например, оформление одного и того же заказа несколько раз.

Запрос POST обычно отправляется через форму HTML и приводит к изменению на сервере. element or the formenctype attribute of the or elements:»>В этом случае тип содержимого выбирается путём размещения соответствующей строки в атрибуте enctype элемента или formenctype атрибута элементов или :

  • application/x-www-form-urlencoded : значения кодируются в кортежах с ключом, разделённых символом ‘&’ , с ‘=’ между ключом и значением. Не буквенно-цифровые символы — percent encoded: это причина, по которой этот тип не подходит для использования с двоичными данными (вместо этого используйте multipart/form-data )
  • multipart/form-data : каждое значение посылается как блок данных («body part»), с заданными пользовательским клиентом разделителем («boundary»), разделяющим каждую часть. Эти ключи даются в заголовки Content-Disposition каждой части
  • text/plain

Когда запрос POST отправляется с помощью метода, отличного от HTML-формы, — например, через XMLHttpRequest — тело может принимать любой тип. Как описано в спецификации HTTP 1.1, POST предназначен для обеспечения единообразного метода для покрытия следующих функций:

  • Аннотация существующих ресурсов
  • Публикация сообщения на доске объявлений, в новостной группе, в списке рассылки или в аналогичной группе статей;
  • Добавление нового пользователя посредством модальности регистрации;
  • Предоставление блока данных, например, результата отправки формы, процессу обработки данных;
  • Расширение базы данных с помощью операции добавления.
Запрос имеет тело Да
Успешный ответ имеет тело Да
Безопасный Нет
Идемпотентный Нет
Кешируемый Только если включена информация о свежести сообщения
Допускается в HTML-формах Да

Синтаксис

POST /index.html

Пример

Простая форма запроса, используя стандартный application/x-www-form-urlencoded content type:

POST / HTTP/1.1 Host: foo.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 say=Hi&to=Mom 

Форма запроса, используя multipart/form-data content type:

POST /test.html HTTP/1.1 Host: example.org Content-Type: multipart/form-data;boundary="boundary" --boundary Content-Disposition: form-data; name="field1" value1 --boundary Content-Disposition: form-data; name="field2"; filename="example.txt" value2 --boundary-- 

Спецификация

Specification
HTTP Semantics
# POST

Совместимость с браузерами

BCD tables only load in the browser

CRUD (создание, чтение, обновление, удаление)

API администрирования IIS предоставляет прямой доступ к ресурсам в системе. Многие из этих ресурсов позволяют выполнять операции создания, чтения, обновления и удаления. REST API сопоставляет операции CRUD с методами HTTP. В следующей таблице указывается, какой метод HTTP сопоставляется с какой операцией.

Операция CRUD Метод HTTP
Создание POST
Чтение GET
Update PATCH / PUT
DELETE DELETE

Создание (POST)

Ресурсы создаются путем отправки HTTP-запросов POST в API. Тип ресурса определяется URL-адресом запроса. Текст запроса должен содержать объект JSON, описывающий создаваемый ресурс. Объект в тексте запроса определяет начальное состояние ресурса при его создании. Некоторые ресурсы требуют предоставления определенных свойств при их создании, другие можно создать с пустым объектом JSON.

Создание ресурса при задании свойства name. POST

Создание ресурса, принадлежащее другому

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

Создание приложения для веб-сайта. POST

Чтение (GET)

Ресурсы извлекаются путем выполнения HTTP-запросов GET. Существует два основных метода извлечения ресурсов. Первый метод включает запрос списка ресурсов, второй метод заключается в запросе одного ресурса. Запросы к одному ресурсу помечаются наличием идентификатора ресурса в URL-адресе запроса. Иногда в URL-адресе можно также указать ресурсы с помощью синтаксического анализа строки запроса. Это поведение зависит от отдельной конечной точки API.

Получение нескольких ресурсов

Чтение списков ресурсов выполняется путем запроса конечной точки ресурса без указания идентификатора отдельных ресурсов. Иногда ресурсам требуются параметры строки запроса или они не могут создавать допустимые списки. Например, приложения IIS живут в конечной точке /api, webserver/webapps , но запрос на использование этой конечной точки не приведет к получению сведений. Это связано с тем, что веб-сайт должен быть указан для указания API, какие приложения должны отображаться. Поэтому потребители будут запрашивать /api/webserver/webapps?website.id= для просмотра списка приложений.

Получение списка ресурсов. GET/api/websites

< "websites": [ < "name": "Default Web Site", "id": "", "status": "started", "_links": < "self": < "href": "/api/webserver/websites/" > > >, < "name": "My Site", "id": "", "status": "started", "_links": < "self": < "href": "/api/webserver/websites/" > > > < "name": "docs", "id": "", "status": "started", "_links": < "self": < "href": "/api/webserver/websites/" > > > ] > 

Извлечение отдельных ресурсов

Ресурсы извлекаются отдельно, предоставляя идентификатор ресурса в URL-адресе конечной точки ресурса. Некоторые конечные точки API также позволяют указывать отдельные ресурсы, предоставляя уникальные параметры строки запроса. Например, можно получить файл, указав идентификатор файла в URL-адресе или указав physical_path файла.

Ресурс файла позволяет нескольким методам извлекать отдельные файлы:

  • /api/files/
  • /api/files?physical_path=

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

Обновление (PATCH/ PUT)

Обновления выполняются путем выдачи HTTP-запросов PATCH на URL-адрес, по которому находится ресурс. При выполнении запроса PATCH свойства текста запроса считываются, а если ресурс имеет свойство с тем же именем, что и свойство ресурса, будет присвоено новое значение.

Пример ресурса до PATCH

Выполнение запроса PATCH

Запрос на исправление для обновления имени ресурса. PATCH/api/webserver/websites/12345

Ресурс после PATCH

Удаление (DELETE)

Ресурсы удаляются путем отправки HTTP-запроса DELETE на URL-адрес, по которому находится ресурс. Это URL-адрес, содержащий идентификатор ресурса.

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.

Отправить и просмотреть отзыв по

POST запрос, составное содержимое (multipart/form-data)

POST multipart/form-data

В жизни любого программиста попадаются задачки, которые человека цепляют. Вот не нравится стандартный метод решения и все! А порой бывает, что стандартные решения не подходят по какой-то причине. Некоторые люди обходят такие задачи стороной, другие же любят решать их. Можно даже сказать сами их находят. Одна из таких задач отсылка файла или несколько файлов методом POST.

Некоторые наверное скажут, эта задача совсем не задача. Ведь есть замечательная библиотека CURL, которая довольно простая и решает эту задачу легко! Но не спешите. Да, CURL мощная библиотека, да она загружает файлы, но… Как Вы знаете у нее есть маленькая особенность — файл должен быть размещен на жестком диске!

А теперь давайте представим себе такую ситуацию, Вы генерируете динамически файл или же он уже находится в памяти и нужно его отправить методом POST на удаленный Web сервер. Что же тогда получается? Перед его отправкой нужно его сохранить? Да именно так и поступило бы 90% программистов. Зачем искать лишние проблемы, если решение лежит на поверхности? Но мы же с Вами не из этих 90%! Мы же лучше, мы же можем решить любую задачку. Зачем нам лишнее действие? Во-первых, оно задействует не быструю файловую систему жесткого диска. Во-вторых, у нас может и не быть доступа к файловой системе или же там выделено слишком мало места.

Как же нам тогда решить эту задачку? Для этого надо взглянуть как собственно передаются данные методом POST. Единственный вариант решения — это передача файла составным запросом с помощью multipart/form-data. Этот метод хорошо описан в RFC7578. Давайте взглянем как будет выглядеть тело POST запроса multipart/form-data:

POST /form.html HTTP/1.1 Host: server.com Referer: http://server.com/form.html User-Agent: Mozilla Content-Type: multipart/form-data; boundary=-------------573cf973d5228 Content-Length: 288 Connection: keep-alive Keep-Alive: 300 (пустая строка) (отсутствующая преамбула) ---------------573cf973d5228 Content-Disposition: form-data; name="field" text ---------------573cf973d5228 Content-Disposition: form-data; name="file"; filename="sample.txt" Content-Type: text/plain Content file ---------------573cf973d5228--

Наше тело состоит из двух частей, в первой части мы передаем значение поля формы name=«field» равное: text. Во второй части мы передаем поле name=«file» с содержимым файла filename=«sample.txt»: Content file. В заголовке мы указываем формат содержимого POST запроса — Content-Type: multipart/form-data, строку разделитель составных частей: boundary=————-573cf973d5228 и длину сообщения — Content-Length: 288.

Осталось, собственно, написать программу реализующий этот метод. Так как мы люди умные и не пишем по сто раз одно и тоже в разных проектах, то оформим все в виде класса реализующий этот метод. Плюс к этому, расширим его для разных вариантов отправки как файлов, так и простых элементов формы. А что бы отличить среди массива POST данных, наличие файла, создадим отдельный файл — контейнер с содержимым файла и его данных (имя и расширение). Таким образом он будет выглядеть следующим образом:

 
class oFile < private $name; private $mime; private $content; public function __construct($name, $mime=null, $content=null) < // Проверяем, если $content=null, значит в переменной $name - путь к файлу if(is_null($content)) < // Получаем информацию по файлу (путь, имя и расширение файла) $info = pathinfo($name); // проверяем содержится ли в строке имя файла и можно ли прочитать файл if(!empty($info['basename']) && is_readable($name)) < $this->name = $info['basename']; // Определяем MIME тип файла $this->mime = mime_content_type($name); // Загружаем файл $content = file_get_contents($name); // Проверяем успешно ли был загружен файл if($content!==false) $this->content = $content; else throw new Exception('Don`t get content - "'.$name.'"'); > else throw new Exception('Error param'); > else < // сохраняем имя файла $this->name = $name; // Если не был передан тип MIME пытаемся сами его определить if(is_null($mime)) $mime = mime_content_type($name); // Сохраняем тип MIME файла $this->mime = $mime; // Сохраняем в свойстве класса содержимое файла $this->content = $content; >; > // Метод возвращает имя файла public function Name() < return $this->name; > // Метод возвращает тип MIME public function Mime() < return $this->mime; > // Метод возвращает содержимое файла public function Content() < return $this->content; > >;

Теперь собственно сам класс по формированию тела multipart/form-data для POST запроса:

 
class BodyPost < //Метод формирования части составного запроса public static function PartPost($name, $val) < $body = 'Content-Disposition: form-data; name="' . $name . '"'; // Проверяем передан ли класс oFile if($val instanceof oFile) < // Извлекаем имя файла $file = $val->Name(); // Извлекаем MIME тип файла $mime = $val->Mime(); // Извлекаем содержимое файла $cont = $val->Content(); $body .= '; filename="' . $file . '"' . "\r\n"; $body .= 'Content-Type: ' . $mime ."\r\n\r\n"; $body .= $cont."\r\n"; > else $body .= "\r\n\r\n".urlencode($val)."\r\n"; return $body; > // Метод формирующий тело POST запроса из переданного массива public static function Get(array $post, $delimiter='-------------0123456789') < if(is_array($post) && !empty($post)) < $bool = false; // Проверяем есть ли среди элементов массива файл foreach($post as $val) if($val instanceof oFile) ; if($bool) < $ret = ''; // Формируем из каждого элемента массива, составное тело POST запроса foreach($post as $name=>$val) $ret .= '--' . $delimiter. "\r\n". self::PartPost($name, $val); $ret .= "--" . $delimiter . "--\r\n"; > else $ret = http_build_query($post); > else throw new \Exception('Error input param!'); return $ret; > >;

Данный класс состоит из нескольких методов. Метод — PartPost формирует отдельные части составного запроса, а метод — Get объединяет эти части и формирует тело POST запроса в формате — multipart/form-data.

Теперь у нас есть универсальный класс для отправки тела POST запроса. Осталось написать программу использующую данный класс для отправки файлов на удаленный Web сервер. Воспользуемся библиотекой CURL:

// Подключаем класс-контейнер содержимого файла include "ofile.class.php"; // Подключаем класс для формирования тела POST запроса include "bodypost.class.php"; // Генерируем уникальную строку для разделения частей POST запроса $delimiter = '-------------'.uniqid(); // Формируем объект oFile содержащий файл $file = new oFile('sample.txt', 'text/plain', 'Content file'); // Формируем тело POST запроса $post = BodyPost::Get(array('field'=>'text', 'file'=>$file), $delimiter); // Инициализируем CURL $ch = curl_init(); // Указываем на какой ресурс передаем файл curl_setopt($ch, CURLOPT_URL, 'http://server/upload/'); // Указываем, что будет осуществляться POST запрос curl_setopt($ch, CURLOPT_POST, 1); // Передаем тело POST запроса curl_setopt($ch, CURLOPT_POSTFIELDS, $post); /* Указываем дополнительные данные для заголовка: Content-Type - тип содержимого, boundary - разделитель и Content-Length - длина тела сообщения */ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $delimiter, 'Content-Length: ' . strlen($post))); // Отправляем POST запрос на удаленный Web сервер curl_exec($ch); 

Если CURL не подходит, то данную библиотеку можно применить и для отправки через сокеты. Ну и собственно ссылки на источники:

  • сайт документации php.net
  • статья CURL: POST запрос, составное содержимое
  • википендия: multipart/form-data
  • RFC7578

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

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