Как составить пост запрос

Внимание. Специальные символы, передаваемые в качестве значений параметров в теле запроса, необходимо заменять на соответствующие экранированные последовательности в соответствии с XML-encoding. Например, вместо символа амперсанд («&») необходимо использовать последовательность «&».

https://yandex.<домен>/search/xml
 ? [user=<имя пользователя>]
 & [key=<API-ключ>]
 & [filter=<тип фильтрации>]
 & [lr=<идентификатор региона поиска>]
 & [l10n=<язык уведомлений>]
 & [showmecaptcha=<yes>]
user

Имя пользователя. Должно совпадать с логином в Яндекс.Паспорте, заданным при регистрации.

key

Значение API-ключа, выданного при регистрации.

filter

Правило фильтрации результатов поиска (исключение из результатов поиска документов в соответствии с одним из правил). Возможные значения:

  • «none» — фильтрация отключена. В выдачу включаются любые документы, вне зависимости от содержимого;

  • «moderate» — умеренная фильтрация. Из выдачи исключаются документы, относящиеся к категории «для взрослых», если запрос явно не направлен на поиск подобных ресурсов;

  • «strict» — семейный фильтр. Вне зависимости от поискового запроса из выдачи исключаются документы, относящиеся к категории «для взрослых», а также содержащие ненормативную лексику.

Если параметр не задан, используется умеренная фильтрация.

lr

Поддерживается только для типов поиска «русский» и «турецкий».

Идентификатор страны или региона поиска. Определяет правила ранжирования документов. Например, если передать в данном параметре значение «11316» (Новосибирская область), при формировании результатов поиска используется формула, определенная для Новосибирской области.

Список идентификаторов часто используемых стран и регионов приведен в приложении.

l10n

Язык уведомлений поискового ответа. Влияет на текст, передаваемый в теге found-docs-human, а также в сообщениях об ошибках.

Возможные значения зависят от используемого типа поиска:

  • «русский (yandex.ru)» — «ru» (русский), «uk» (украинский), «be» (белорусский), «kk» (казахский). Если не задан, уведомления передаются на русском языке;

  • «турецкий (yandex.com.tr)» — поддерживается только значение «tr» (турецкий);

  • «мировой (yandex.com)» — поддерживается только значение «en» (английский).

showmecaptcha

Инициирует проверку пользователя для возможной защиты от роботов.

Единственное используемое значение — «yes».

<?xml version="1.0" encoding="кодировка XML-файла"?>
<request>
<!--Группирующий тег-->
   <query>
   <!--Текст поискового запроса-->
   </query>
   <sortby>
   <!--Тип сортировки результатов поиска-->
   </sortby>
   <groupings>
   <!--Параметры группировки в дочерних тегах-->
      <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="1" />
   </groupings>
   <page>
   <!--Номер запрашиваемой страницы результатов поиска-->
   </page>
</request>
Параметр Описание
request Группирующий тег. Дочерние теги содержат параметры поискового запроса.

query

Текст поискового запроса. При обработке учитываются особенности языка запросов Яндекса (вместо специальных символов необходимо использовать соответствующие экранированные последовательности).

На запрос наложены следующие ограничения: максимальная длина запроса — 400 символов; максимальное количество слов — 40.

sortby

Правило сортировки результатов поиска. Возможные значения:

  • «rlv» — по релевантности;

  • «tm» — по времени изменения документа.

Если параметр не задан, результаты сортируются по релевантности.

При сортировке по времени изменения параметр может содержать атрибут order — порядок сортировки документов. Возможные значения:

  • «descending» — прямой (от наиболее свежего к наиболее старому). Используется по умолчанию;

  • «ascending» — обратный (от наиболее старого к наиболее свежему).

maxpassages

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

Допустимые значения — от 1 до 5. Результат поиска может содержать меньшее количество пассажей, чем значение, указанное в данном параметре.

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

page

Номер запрашиваемой страницы поисковой выдачи. Определяет диапазон позиций документов, возвращаемых по запросу. Нумерация начинается с нуля (первой странице соответствует значение «0»).

Например, если количество документов, возвращаемых на странице, равно «n», а в параметре передано значение «p», то в результаты поиска будут включены документы, находящиеся в диапазоне позиций выдачи от p*n+1 до p*n+n включительно.

Если параметр не задан, возвращается первая страница поисковой выдачи.

groupings Группирующий тег. Дочерний тег содержит параметры группировки результатов.

groupby

Набор параметров, определяющих правила группировки результатов. Группировка используются для объединения документов одного домена в контейнер. В рамках контейнера документы ранжируются по правилам сортировки, определенным в параметре sortby. Результаты, переданные в контейнере, могут быть использованы для включения в поисковую выдачу нескольких документов одного домена.

Параметры:

  • mode — метод группировки. Возможные значения:

    • «flat» — плоская группировка. Каждая группа содержит один документ. Передается с пустым значением параметра attr;

    • «deep» — группировка по доменам. Каждая группа содержит документы одного домена. Передается со значением «d» параметра attr.

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

  • attr — служебный атрибут. Зависит от значения атрибута mode.

  • groups-on-page — максимальное количество групп, которые могут быть возвращены на одной странице результатов поиска. Допустимые значения — от 1 до 100,

  • docs-in-group — максимальное количество документов, которое могут быть возвращены в одной группе. Допустимые значения — от 1 до 3.

Приведенные ниже URL запроса и запрос возвращают третью страницу результатов поиска по запросу «<table>» для пользователя «xml-search-user». Результаты сортируются по времени редактирования документа. Тип поиска — русский (yandex.ru). Результаты группируются по домену. Каждая группа содержит три документа, а количество групп, возвращаемых на одной странице, равно десяти. Максимальное количество пассажей на один документ — два. Сервис возвращает XML-файл в кодировке UTF-8.

URL запроса:

https://yandex.ru/search/xml?user=xml-search-user&key=03.44583456:c876e1b098gh65khg834ggg1jk4ll9j8

Тело запроса:

<?xml version="1.0" encoding="UTF-8"?> 
<request>   
<query>%3Ctable%3E</query>
      <sortby>tm</sortby>
      <maxpassages>2</maxpassages>
      <page>2</page> 
      <groupings>
      <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="3" /> 
</groupings>        
</request>

Время на прочтение
5 мин

Количество просмотров 112K

POST multipart/form-data

Передача составных данных методом POST

В жизни любого программиста попадаются задачки, которые человека цепляют. Вот не нравится стандартный метод решения и все! А порой бывает, что стандартные решения не подходят по какой-то причине. Некоторые люди обходят такие задачи стороной, другие же любят решать их. Можно даже сказать сами их находят. Одна из таких задач отсылка файла или несколько файлов методом 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 данных, наличие файла, создадим отдельный файл — контейнер с содержимым файла и его данных (имя и расширение). Таким образом он будет выглядеть следующим образом:

<pre>
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; }

};
</pre>

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

<pre>
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 . '"' . "rn";
     $body .= 'Content-Type: ' . $mime ."rnrn";
     $body .= $cont."rn";
    } else $body .= "rnrn".urlencode($val)."rn";
   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) {$bool = true; break; };
     if($bool)
      {
       $ret = '';
// Формируем из каждого элемента массива, составное тело POST запроса
       foreach($post as $name=>$val)
        $ret .= '--' . $delimiter. "rn". self::PartPost($name, $val);
        $ret .= "--" . $delimiter . "--rn";
      } else $ret = http_build_query($post);
    } else throw new Exception('Error input param!');
   return $ret;
  }
};
</pre>

Данный класс состоит из нескольких методов. Метод — 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

В следующей статье предложу вашему вниманию информацию о том, как качать большие файлы с удаленных Web-серверов в несколько потоков, с указанной скоростью. Всем, кто дочитал до конца, спасибо за внимание!

I’d like to add some thoughts about the curl-based answer of Fred Tanrikut. I know most of them are already written in the answers above, but I think it is a good idea to show an answer that includes all of them together.

Here is the class I wrote to make HTTP-GET/POST/PUT/DELETE requests based on curl, concerning just about the response body:

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
}

Improvements

  • Using http_build_query to get the query-string out of an request-array.(you could also use the array itself, therefore see: http://php.net/manual/en/function.curl-setopt.php)
  • Returning the response instead of echoing it. Btw you can avoid the returning by removing the line curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);. After that the return value is a boolean(true = request was successful otherwise an error occured) and the response is echoed.
    See: http://php.net/en/manual/function.curl-exec.php
  • Clean session closing and deletion of the curl-handler by using curl_close. See: http://php.net/manual/en/function.curl-close.php
  • Using boolean values for the curl_setopt function instead of using any number.(I know that any number not equal zero is also considered as true, but the usage of true generates a more readable code, but that’s just my opinion)
  • Ability to make HTTP-PUT/DELETE calls(useful for RESTful service testing)

Example of usage

GET

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

POST

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

PUT

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

DELETE

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

Testing

You can also make some cool service tests by using this simple class.

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

Кроме метода GET, который мы рассмотрели в предыдущей заметке, существует еще один метод отправки запроса по протоколу HTTP – метод POST. Метод POST тоже очень часто используется на практике.

http метод post

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

Для того, чтобы выполнить этот вид запроса, нам необходимо нажать на кнопку с атрибутом type=”submit”, которая расположена на веб-странице. Обратите внимание, что эта кнопка расположена в элементе <form>, у которого установлен атрибут method со значением post.

Рассмотрим этот HTML-код:

<form name="form1" method="post" action="post.php">
 Введите текст:<br />
 <textarea name="text" cols="80" rows="10"></textarea>
 <input name="" type="submit" value="Отправить"/>
 </form>

метод post

Если пользователь введет в текстовое поле какой-либо текст и нажмет на кнопку «Отправить», то на сервер будет отправлена переменная text со значением того содержимого, которое ввел пользователь. Эта переменная будет отправлена методом POST.

Если в форме написать так:

<form name="form1" method="get" action="post.php">

То данные будут отправляться методом GET.

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

Еще одно отличие метода POST от GET, метод POST скрывает все передаваемые им переменные и их значения, в своём теле (Entity-Body). В случае с методом GET они хранились в строке запроса (Request-URI).

Вот пример запроса, выполненного методом POST:

POST / HTTP/1.0rn
Host: www.site.rurn
Referer: http://www.site.ru/index.htmlrn
Cookie: income=1rn
Content-Type: application/x-www-form-urlencodedrn
Content-Length: 35rn
rn
login=Dima&password=12345

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

Кроме того, методом POST можно передавать не только текст, но и мультимедиа данные (картинки, аудио, видео). Существует специальный параметр Content-Type, который определяет тот вид информации, который необходимо передать.

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

Вот пример обработки на языке PHP:

<?php echo $_POST['text']; ?>

Все мои уроки по серверному программированию здесь.

In this article, we will know what HTTP GET and POST methods are in PHP, how to implement these HTTP methods & their usage, by understanding them through the examples.

HTTP: The Hypertext Transfer Protocol (HTTP) is designed to enable communications between clients and servers. HTTP works as a request-response protocol between a client and server. A web browser may be the client, and an application on a computer that hosts a website may be the server. A client (browser) submits an HTTP request to the server; then the server returns a response to the client. The response contains status information about the request and may also contain the requested content.

There are 2 HTTP request methods:

  • GET: Requests data from a specified resource.
  • POST: Submits data to be processed to a specified resource.

We will understand both these methods in detail through the examples.

GET Method: In the GET method, the data is sent as URL parameters that are usually strings of name and value pairs separated by ampersands (&). In general, a URL with GET data will look like this:

Example: Consider the below example:

http://www.example.com/action.php?name=Sam&weight=55 

Here, the bold parts in the URL denote the GET parameters and the italic parts denote the value of those parameters. More than one parameter=value can be embedded in the URL by concatenating with ampersands (&). One can only send simple text data via GET method.

Example: This example illustrates the HTTP GET method in PHP.

HTML

<?php

  error_reporting(0);

  if( $_GET["name"] || $_GET["weight"] )

  {

      echo "Welcome ". $_GET['name']. "<br />";

      echo "You are ". $_GET['weight']. " kgs in weight.";

      exit();

  }

?>

<html>

<body>

  <form action="<?php $_PHP_SELF ?>" method="GET">

    Name: <input type="text" name="name" />

    Weight:<input type="text" name="weight" />

           <input type="submit" />

  </form>

</body>

</html>

Output:

GET() method

Advantages:

  • Since the data sent by the GET method are displayed in the URL, it is possible to bookmark the page with specific query string values.
  • GET requests can be cached and GET requests to remain in the browser history.
  • GET requests can be bookmarked.

Disadvantages:

  • The GET method is not suitable for passing sensitive information such as the username and password, because these are fully visible in the URL query string as well as potentially stored in the client browser’s memory as a visited page.
  • Because the GET method assigns data to a server environment variable, the length of the URL is limited. So, there is a limitation for the total data to be sent.

POST Method: In the POST method, the data is sent to the server as a package in a separate communication with the processing script. Data sent through the POST method will not be visible in the URL. 

Example: Consider the below example:

POST /test/demo_form.php HTTP/1.1 
Host: gfs.com 
SAM=451&MAT=62 

The query string (name/weight) is sent in the HTTP message body of a POST request.

Example: This example illustrates the HTTP POST method in PHP. Here, we have used the preg_match() function to search string for a pattern, returns true if a pattern exists, otherwise returns false.

HTML

<?php

   error_reporting(0);

   if( $_POST["name"] || $_POST["weight"] )

      {

        if (preg_match("/[^A-Za-z'-]/",$_POST['name'] ))

         {

           die ("invalid name and name should be alpha");

        }

      echo "Welcome ". $_POST['name']. "<br />";

      echo "You are ". $_POST['weight']. " kgs in weight.";

      exit();

         }

?>

<html>

<body>  

  <form action = "<?php $_PHP_SELF ?>" method = "POST">

     Name: <input type = "text" name = "name" />

     Weight: <input type = "text" name = "weight" />

             <input type = "submit" />

  </form>

</body>

</html>

Output:

POST() method

Advantages:

  • It is more secure than GET because user-entered information is never visible in the URL query string or in the server logs.
  • There is a much larger limit on the amount of data that can be passed and one can send text data as well as binary data (uploading a file) using POST.

Disadvantages:

  • Since the data sent by the POST method is not visible in the URL, so it is not possible to bookmark the page with a specific query.
  • POST requests are never cached
  • POST requests do not remain in the browser history.

Please refer to the Difference between HTTP GET and POST Methods article for the differences between them in detail.

Last Updated :
06 Dec, 2021

Like Article

Save Article

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