Чем отличаются http-методы get и post
Содержание:
- GET и POST-запросы. Кодировка.
- Методы
- Полезно знать
- Отправка данных методом POST с использованием CURL
- PHP GET request in Laravel
- Основы
- Методы requests.get() и requests.post() модуля requests.
- Функция «post в JavaScript»
- PHP GET request in Slim
- Различие между методами GET и POST
- Интеграция 1С и C#. Обращение к 1С через COM. Создание номенклатуры и выполнение запроса к 1С из C# на примере интеграции с Союз-PLM (система информационной поддержки жизненного цикла изделий). Обработка «Загрузка заказа на сборку». (ERP)
- POST запрос при помощи cURL
- ФУНКЦИЯ POST запроса через Excel
- PHP send GET request with Symfony HttpClient
- Инкапсуляция операций в классе Curl
- Формат запроса
- Подробно о «javascript post»
- POST и GET запросы без cURL
- GET запрос при помощи cURL
- Основы HTTP
GET и POST-запросы. Кодировка.
Во время обычного submit’а формы браузер сам кодирует значения полей и составляет тело GET/POST-запроса для посылки на сервер. При работе через XmlHttpRequest, это нужно делать самим, в javascript-коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять.
Вначале рассмотрим общее кодирование запросов, ниже — правильную работу с русским языком для windows-1251.
Существуют два вида кодирования HTTP-запроса. Основной — urlencoded, он же — стандартное кодирование URL. Пробел представляется как %20, русские буквы и большинство спецсимволов кодируются, английские буквы и дефис оставляются как есть.
Способ, которым следует кодировать данные формы при submit’е, задается в ее HTML-таге:
<form method="get"> // метод GET с кодировкой по умолчанию <form method="post" enctype="application/x-www-form-urlencoded"> // enctype явно задает кодировку <form method="post"> // метод POST с кодировкой по умолчанию (urlencoded, как и предыдущая форма)
Если форма submit’ится обычным образом, то браузер сам кодирует (urlencode) название и значение каждого поля данных ( и т.п.) и отсылает форму на сервер в закодированном виде.
Формируя XmlHttpRequest, мы должны формировать запрос «руками», кодируя поля функцией .
Конечно, пропускать через encodeURIComponent стоит только те переменные, в которых могут быть спецсимволы или не английские буквы, т.е которые и будут как раз закодированы.
Например, для посылки GET-запроса с произвольными параметрами name и surname, их необходимо закодировать вот так:
// Пример с GET ... var params = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname) xmlhttp.open("GET", '/script.html?'+params, true) ... xmlhttp.send(null)
В методе POST параметры передаются не в URL, а в теле, посылаемом через . Поэтому нужно указывать не в адресе, а при вызове
Кроме того, при POST обязателен заголовок Content-Type, содержащий кодировку. Это указание для сервера — как обрабатывать (раскодировать) пришедший запрос.
// Пример с POST ... var params = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname) xmlhttp.open("POST", '/script.html', true) xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ... xmlhttp.send(params)
Заголовки Content-Length, Connection в POST-запросах, хотя их и содержат некоторые «руководства», обычно не нужны. Используйте их, только если Вы действительно знаете, что делаете.
Запросы multipart/form-data
Второй способ кодирования — это отсутствие кодирования. Например, кодировать не нужно для пересылки файлов. Он указывается в форме (только для POST) так:
<form method="post" enctype="multipart/form-data">
В этом случае при отправке данных на сервер ничего не кодируется. А сервер, со своей стороны, посмотрев на Content-Type(=multipart/form-data), поймет, что пришло.
Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания
таких запросов есть, в частности, во фреймворке . Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.
Кодировка (языковая)
Если Вы используете только UTF-8 — пропустите эту секцию.
Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8. Поэтому, например, в PHP их нужно при необходимости перекодировать функцией iconv.
<?php // ajax.php $name = iconv('UTF8','CP1251',$_GET); ?>
С другой стороны, ответ с сервера браузер воспринимает именно в той кодировке, которая указана в заголовке ответа Content-Type. Т.е, опять же, в PHP, чтобы браузер воспринял ответ в windows-1251 и нормально отобразил данные на странице в windows-1251,
нужно послать заголовок с кодировкой в php-коде, например так:
<?php // ajax.php header('Content-Type: text/plain; charset=utf-8'); ?>
Или же, такой заголовок должен добавить сервер. Например, в apache автоматически добавляется кодировка опцией:
# в конфиге апача AddDefaultCharset windows-1251
Методы
С помощью URL, мы определяем точное название хоста, с которым хотим общаться, однако какое действие нам нужно совершить, можно сообщить только с помощью HTTP метода. Конечно же существует несколько видов действий, которые мы можем совершить. В HTTP реализованы самые нужные, подходящие под нужды большинства приложений.
Существующие методы:
GET
: получить доступ к существующему ресурсу. В URL перечислена вся необходимая информация, чтобы сервер смог найти и вернуть в качестве ответа искомый ресурс.
POST
: используется для создания нового ресурса. POST запрос обычно содержит в себе всю нужную информацию для создания нового ресурса.
PUT
: обновить текущий ресурс. PUT запрос содержит обновляемые данные.
DELETE
: служит для удаления существующего ресурса.
Данные методы самые популярные и чаще всего используются различными инструментами и фрэймворками. В некоторых случаях, PUT и DELETE запросы отправляются посредством отправки POST, в содержании которого указано действие, которое нужно совершить с ресурсом: создать, обновить или удалить.
Также HTTP поддерживает и другие методы:
HEAD
: аналогичен GET. Разница в том, что при данном виде запроса не передаётся сообщение. Сервер получает только заголовки. Используется, к примеру, для того чтобы определить, был ли изменён ресурс.
TRACE
: во время передачи запрос проходит через множество точек доступа и прокси серверов, каждый из которых вносит свою информацию: IP, DNS. С помощью данного метода, можно увидеть всю промежуточную информацию.
OPTIONS
: используется для определения возможностей сервера, его параметров и конфигурации для конкретного ресурса.
Полезно знать
В завершении приведем основные команды, которые вам могут понадобиться во время написания скриптов. Для лучшего усвоения, попробуйте поиграться с ними самостоятельно.
Работа со встроенными библиотеками
Документация регламентирует наличие некоторого количества встроенных библиотек, среди которых — tv4 для валидации json, xml2js конвертер xml в json, crypto-js для работы с шифрованием, atob, btoa и др.
Некоторые из библиотек, например, как tv4 не требуют прямого подключения через require и доступны по имени сразу.
Управление последовательностью запросов из скрипта
Стоит отметить, что данный метод работает только в режиме запуска всех скриптов.
После перехода на следующий запрос Postman возвращается к линейному последовательному выполнению запросов.
Создание глобального хелпера
В некоторых случаях вам захочется создать функции, которые должны быть доступны во всех запросах. Для этого в первом запросе в секции “Pre-request Script” напишите следующий код:
А в последующих скриптах пользуемся им так:
Это лишь небольшой список полезных команд. Возможности скриптов гораздо шире, чем можно осветить в одной статье. В Postman есть хорошие «Templates», которые можно найти при создании новой коллекции. Не стесняйтесь подглядывать и изучать их реализацию. А официальная документация содержит ответы на большинство вопросов.
Отправка данных методом POST с использованием CURL
Помимо сокетов, обеспечивающих низкоуровневое обращение к серверу, PHP располагает специальным расширением CURL (Client URL Library).
<?php // Задаем адрес удаленного сервера $curl = curl_init("http://localhost/handler/action.php"); // Передача данных осуществляется методом POST curl_setopt($curl, CURLOPT_POST, 1); // Задаем POST-данные $data = 'name=Евгений&password=qwerty'; curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Выполняем запрос и выводим ответ в браузер curl_exec($curl); // Закрываем CURL соединение curl_close($curl);
С помощью функции задается адрес удаленного сервера и путь к файлу на нем. В отличие от функции , необходимо задавать адрес полностью, включая префикс , т.е. расширение CURL позволяет работать с несколькими видами протоколов (HTTP, HTTPS, FTP). Если соединение с указанным сервером происходит успешно, функция возвращает дескриптор соединения, который используется во всех остальных функциях библиотеки.
Для того, чтобы сообщить CURL о том, что данные будут передаваться методом POST, необходимо задать параметр . POST-данные устанавливаются при помощи параметра .
По умолчанию библиотека удаляет HTTP-заголовки, возвращаемые сервером. Однако CURL можно настроить на выдачу заголовков, если установить при помощи функции ненулевое значение параметра .
P.S. Из-за ошибки библиотеки сокетов протокол HTTP 1.1 под Windows работает медленно. При работе скрипта использующего сокеты под управлением этой ОС, лучше использовать версию HTTP 1.0.
Поиск:
CURL • HTTP • PHP • POST • Web-разработка • Форма
PHP GET request in Laravel
In the following example, we process a GET request in Laravel.
$ laravel new larareq $ cd larareq
We create a new Laravel application.
routes/web.php
<?php use Illuminate\Support\Facades\Route; use Illuminate\Http\Request; Route::get('/', function (Request $request) { $name = $request->query('name', 'guest'); $message = $request->query('message', 'hello there'); $output = "$name says $message"; return $output; });
We get the GET parameters and create a response.
$ php artisan serve
We start the server.
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says Cau
We send a GET request with curl.
Основы
Перед тем, как отправить cURL запрос — нам следует создать сеанс. Сделать это можно при помощи функции Данная функция принимает один параметр — url, который будет загружен. Но url можно будет установить позже, по этому данный параметр не обязателен.
$curl = curl_init();
Настройки
Параметры cURL нужны для того, чтобы более точно сконфигурировать Ваш запрос. С помощью параметров можно получить те самые, почти безграничные, возможности работы с запросами.
После того, как ресурс создан, можно приступить к настройке параметров запроса. Для этого мы можем пользоваться функцией , которая принимает три обязательных параметра:
- $ch — ссылка на ресурс cURL
- Параметр, который мы устанавливаем
- Значение параметра
Ниже приведен список часто используемых параметров, а их полный список можно просмотреть в документации php.
Параметр | Описание |
CURLOPT_RETURNTRANSFER | Возвращает ответ как строку (если передать true), вместо вывода на экран |
CURLOPT_CONNECTTIMEOUT | Позволяет задать количество секунд для ожидания соединения. |
CURLOPT_TIMEOUT | Задает количество секунд, которые будет выполняться запрос. |
CURLOPT_USERAGENT | Содержимое заголовка «User-Agent: «, посылаемого в HTTP-запросе. |
CURLOPT_URL | URL, куда будет отправлен запрос. |
CURLOPT_POST | true, если нужно отправить POST запрос |
CURLOPT_POSTFIELDS | Массив параметров для POST запроса |
Как задавать параметры
Как описывалось выше, параметры можно задавать при помощи метода . Давайте разберем несколько примеров:
Пример 1: Установим значение URL, куда будет отправлен запрос:
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://testcURL.com');
К слову, установить этот параметр можно в одну строку при инициализации ресурса:
$curl = curl_init('http://testcURL.com');
Пример 2: Установим время выполнения запроса в 10 секунд:
$curl = curl_init(); curl_setopt($curl, CURLOPT_TIMEOUT, 10);
Альтернативный способ задавать настройки
Настройки можно задать при помощи функции , первый параметр которой — ссылка на ресурс cURL, второй — ассоциативный массив, где ключами выступают константы параметров.
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testcURL.com' ));
Отправка запроса cURL
Как написано выше, при помощи cURL можно отправлять различные запросы. В данной статье мы рассмотрим варианты отправки GET и POST запросов.
Отправить GET запрос
GET запрос используется по умолчанию. Как вы увидите в примере ниже, он достаточно прост для понимания.
Если есть необходимость использовать параметры, их можно просто перечислить в url:
Отправим простой GET запрос с параметрами:
// Инициализация ресурса curl $curl = curl_init(); // Параметры отправки запроса (мы добавили useragent) curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testsite.com/?param=value¶m2=value2', CURLOPT_USERAGENT => 'ctrlv cURL Request' )); // Отправка запроса; ответ будет в $response $response = curl_exec($curl); // Завершение работы с cURL curl_close($curl);
Отправка POST запроса
Синтаксис для GET и POST запросов немного отличается. В случае, если запрос не содержит параметров, разница будет только в параметре CURLOPT_POST (в POST этот параметр устанавливаем в true или 1). Если необходимо передавать параметры POST запроса, дополнительно указываем параметр CURLOPT_POSTFIELDS (массив, где название параметра — ключ массив).
В данном примере отправляется тот-же запрос, который рассматривался в выше, отличается лишь метод отправки.
// Инициализация ресурса curl $curl = curl_init(); // Параметры отправки запроса (мы добавили useragent) curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testsite.com', CURLOPT_USERAGENT => 'ctrlv cURL Request', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => array( param => 'value', param22 => 'value2' ) )); // Отправка запроса; ответ будет в $response $response = curl_exec($curl); // Завершение работы с cURL curl_close($curl);
Методы requests.get() и requests.post() модуля requests.
Передача параметров в URL для HTTP GET-запросов.
Часто в строке запроса URL-адреса, необходимо отправить какие-то данные. При составлении URL-адреса вручную, эти данные задаются в виде пар ключ/значение в конце URL-адреса после вопросительного знака, например . Модуль позволяет передавать эти параметры в метод виде словаря строк, используя ключевой аргумент . Например, если надо передать и для GET запроса к URL-адресу , то используйте следующий код:
>>> import requests # подготовка дополнительных параметров для GET запроса >>> params = {'key1' 'value1', 'key2' 'value2'} >>> resp = requests.get('https://httpbin.org/get', params=params) # смотрим, что URL-адрес был правильно закодирован >>> print(resp.url) # https://httpbin.org/get?key2=value2&key1=value1
Обратите внимание, что любой ключ словаря, значение которого равно , не будет добавлен в строку запроса URL-адреса. В качестве значения словаря можно передать список дополнительных элементов URL-адреса:
В качестве значения словаря можно передать список дополнительных элементов URL-адреса:
>>> import requests # ключ словаря 'key2' имеет список значений >>> params = {'key1' 'value1', 'key2' 'value2', 'value3']} # создаем GET запрос >>> resp = requests.get('https://httpbin.org/get', params=params) # смотрим полученный URL >>> print(resp.url) # https://httpbin.org/get?key1=value1&key2=value2&key2=value3
Передача параметров в URL для HTTP POST-запросов.
Как правило, в POST-запросах встает необходимость отправить некоторые закодированные в форме данные. Для этого необходимо передать словарь в аргумент метода . Словарь с данными формы будет автоматически закодирован.
Обратите внимание, что имя аргумента для передачи параметров метода , отличается от имени аргумента дополнительных параметров
>>> import requests
# подготовка параметров для POST-запроса
>>> param = {‘key1’ ‘value1’, ‘key2’ ‘value2’}
# обратите внимание, что для метода POST, аргумент для
# передачи параметров в запрос отличается от метода GET
>>> resp = requests.post(«https://httpbin.org/post», data=param)
>>> print(resp.text)
# {
# …
# «form»: {
# «key2»: «value2»,
# «key1»: «value1»
# },
# …
# }
Аргумент также может иметь несколько значений для каждого ключа. Это можно сделать, передав данные либо списком кортежей, либо словарем со списками в качестве значений. Это особенно полезно, когда форма содержит несколько элементов, использующих один и тот же ключ:
>>> import requests >>> param_tuples = >>> resp1 = requests.post('https://httpbin.org/post', data=payload_tuples) >>> param_dict = {'key1' 'value1', 'value2']} >>> resp2 = requests.post('https://httpbin.org/post', data=payload_dict) >>> print(resp1.text) # { # ... # "form": { # "key1": # }, # ... # } >>> resp1.text == resp2.text # True
Функция «post в JavaScript»
Создадим функцию post :
function post() {}
Получаем данные из полей ввода :
var a = ida .value; // Считываем значение a
var b = idb .value; // Считываем значение b
В переменную «data» помещаем, конструкцию похожую на массив(но не массив) ключ = значение.
var data = «a=» + encodeURIComponent(a) + «&b=» + encodeURIComponent(b);
Создаём объект xhr:
var xhr = new XMLHttpRequest();
Открываем асинхронное соединение :
xhr.open(«POST», «https://dwweb.ru/путь до файла/examople_post_js.php» , true);
Отправляем кодировку :
xhr.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
Отправляем POST-запрос :
xhr.send(data);
Далее, не буду каждую строчку расписывать смотрим комментарии:
xhr.onreadystatechange = function() // Ждём ответа от сервера
{
if (xhr.readyState == 4) // возвращает текущее состояние объекта(0-4)
{
if(xhr.status == 200) // код 200 (если страница не найдена вернет 404)
{
summa.innerHTML = xhr.responseText; // Выводим ответ сервера
}
}
}
PHP GET request in Slim
In the following example, we are going to process a GET request in the Slim
framework.
$ composer req slim/slim $ composer req slim/psr7 $ composer req slim/http
We install , , and
packages.
public/index.php
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; $app = AppFactory::create(); $app->get('/', function (Request $request, Response $response): Response { $name = $request->getQueryParam('name', 'guest'); $message = $request->getQueryParam('message', 'hello there'); $output = "$name says $message"; $response->getBody()->write($output); return $response; }); $app->run();
We get the parameters and return a response in Slim.
$name = $request->getQueryParam('name', 'guest');
The query parameter is retrieved with ; the
second parameter is the default value.
$response->getBody()->write($output);
We write the output to the response body with .
$ php -S localhost:8000 -t public
We start the server.
$ curl 'localhost:8000/?name=Lucia&message=Cau' Lucia says: Cau
We generate a GET request with curl.
Различие между методами GET и POST
Это можно делать с помощью специальных GET параметров.
Чтобы добавить GET параметры к запросу, нужно в конце URL-адреса поставить знак «?» и после него начинать задавать их по следующему правилу:
имя_параметра1=значение_параметра1& имя_параметра2=значение_параметра2&…
Разделителем между параметрами служит знак «&».
К примеру, если мы хотим передать серверу два значения, имя пользователя и его возраст, то это можно сделать следующей строкой:
http://site.ru/page.php?name=dima&age=27
Когда выполнен данный запрос, данные попадают в так называемую переменную окружения QUERY_STRING, из которой их можно получить на сервере с помощью серверного языка веб-программирования.
Вот пример, как это можно сделать на PHP.
<?php echo «Ваше имя: » . $_GET . «<br />»; echo «Ваш возраст: » . $_GET . «<br />»; ?>
Конструкция $_GET позволяет выводить значение переданного параметра.
В результате выполнения этого кода в браузере выведется:
Ваше имя: dima Ваш возраст: 27
Кстати, переходя по какой-либо ссылке, которая оформлена в HTML вот так:
<a href=”link.php?name=dima”>Ссылка</a>
Интеграция 1С и C#. Обращение к 1С через COM. Создание номенклатуры и выполнение запроса к 1С из C# на примере интеграции с Союз-PLM (система информационной поддержки жизненного цикла изделий). Обработка «Загрузка заказа на сборку». (ERP)
Союз-PLM представляет собой полнофункциональный программный комплекс для решения широкого спектра задач управления инженерной технической информацией наукоемких изделий и сложных инженерных объектов в области машиностроения, приборостроения, архитектуры, строительства.
На практике, это управление конструкторской документацией, интегрированное с САПР, бизнес-процессы, файловый архив. Все это работает в SQL и шевелится с помощью скриптов на C#. Скрипты свободно отлаживаются в MS Visual Studio. Подробнее смотрите на их сайте: http://www.programsoyuz.ru/products/system-soyuz-plm.html Редактирование, конструирование и использование бизнес-процессов на порядок лучше систем на базе 1С из тех, что я изучил.
1 стартмани
POST запрос при помощи cURL
Теперь давайте отправим post запрос на адрес https://httpbin.org/anything
$url = 'https://httpbin.org/anything'; // url, на который отправляется запрос $post_data = [ // поля нашего запроса 'field1' => 'val_1', 'field2' => 'val_2', ]; $headers = []; // заголовки запроса $post_data = http_build_query($post_data); $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_VERBOSE, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); // true - означает, что отправляется POST запрос $result = curl_exec($curl);
Отлично, с GET и POST запросами в cURL мы немного освоились.
Теперь разберемся с заголовками, которые мы можем отсылать в запросе.
Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER
Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON
ФУНКЦИЯ POST запроса через Excel
Сама функция простая и листинг её представлен ниже:
Function jsonx(KEY, TXT As Range)
For Each ccc In TXT
body = body + » » + str(ccc.value)
Next
Dim sURL As String
Dim oHttp As Object
Set oHttp = CreateObject(«MSXML2.ServerXMLHTTP»)
sURL = «http://jabber.pozitiv-r.ru/scripts/reqexcel.php»
oHttp.Open «POST», sURL, False
oHttp.setrequestheader «User-Agent», «Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)»
oHttp.setrequestheader «Content-Type», «application/x-www-form-urlencoded»
oHttp.send («from=www&key=» + KEY + «&body=» + body)
result = oHttp.ResponseText
With CreateObject(«vbscript.regexp»)
.Global = True
.Pattern = «\»
Set objMatches = .Execute(result)
Dim a() As String
a = Split(objMatches.Item(0).submatches(0), «,»)
Dim arr As Variant
ReDim arr(0 To 3)
For I = 0 To UBound(a)
arr(I) = a(I)
Next I
End With
jsonx = arr
End Function
Рассмотрим её по частям.
PHP send GET request with Symfony HttpClient
Symfony provides the component which enables us to
create HTTP requests in PHP.
$ composer req symfony/http-client
We install the component.
send_get_req.php
<?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'http://localhost:8000', ]); $content = $response->getContent(); echo $content . "\n";
The example sends a GET request with two query parameters to
.
$ php -S localhost:8000 get_req.php
We start the server.
$ php send_get_req.php Lucia says: Cau
We run the script.
Инкапсуляция операций в классе Curl
При использовании Curl в проекте рекомендуется инкапсулировать весь код вместо использования функций, описанных выше. Иначе придется повторно запускать больше кода. Кроме этого повышается вероятность возникновения ошибок. Мы собираемся создать класс, который инкапсулирует эту логику.
curl_class.php
<?php /** * Методы обработки Curl-запроса. */ class CURL { /** * Объект Curl-запроса. */ private $request; /** * Конструктор класса CURL. * * @throws Exception, если при инициализации возникли ошибки. */ public function __construct() { $this->request = curl_init(); $this->throwExceptionIfError($this->request); } /** * Настройка Curl -запроса. * * @param $url Целевой url-адрес. * @param $urlParameters Массив параметров в формате 'key' => 'value'. * @param $method 'GET' или 'POST'; по умолчанию - 'GET'. * @param $moreOptions Другие параметры, добавляемые к Curl -запросу. * По умолчанию задано 'CURLOPT_FOLLOWLOCATION'(переходить по редиректам 3XX) и 'CURLOPT_RETURNTRANSFER' * (возвращает ответ HTTP в качестве значения, вместо вывода напрямую). * @throws Exception, если возникли ошибки при настройке. */ public function configure($url, $urlParameters = [], $method = 'GET', $moreOptions = ) { curl_reset($this->request); switch ($method) { case 'GET': $options = ; break; case 'POST': $options = ; break; default: throw new Exception('Method must be "GET" or "POST".'); break; } $options = $options + $moreOptions; foreach ($options as $option => $value) { $configured = curl_setopt($this->request, $option, $value); $this->throwExceptionIfError($configured); } } /** * Выполняем Curl-запрос в соответствии с параметрами конфигурации. * * @return возвращает значение функции curl_exec(). Если настроен CURLOPT_RETURNTRANSFER, * возвращаемое значение будет ответом HTTP. В противном случае, значение true (или false, * если возникла ошибка). * @throws Exception, если возникла ошибка при исполнении. */ public function execute() { $result = curl_exec($this->request); $this->throwExceptionIfError($result); return $result; } /** * Закрываем сессию Curl. */ public function close() { curl_close($this->request); } /** * Проверяем, вернули ли функции curl_* штатное значение или ошибку, добавляя исключение * с сообщением об ошибке Curl в случае возникновения ошибки. * * @param $success была ли функция curl выполнена успешно или нет. * @throws Exception, если функция curl не выполнена. */ protected function throwExceptionIfError($success) { if (!$success) { throw new Exception(curl_error($this->request)); } } /** * Составляем строку параметров GET. * * @param $parameters массив параметров. * @return Parameters в формате строки: '?key1=value1&key2=value2' */ protected function stringifyParameters($parameters) { $parameterString = '?'; foreach ($parameters as $key => $value) { $key = urlencode($key); $value = urlencode($value); $parameterString .= "$key=$value&"; } rtrim($parameterString, '&'); return $parameterString; } }
В этом коде класса PHP Curl post запроса нет ничего, чего мы не рассматривали выше. За исключением способа, с помощью которого задаются параметры через функцию curl_setopt().
Чтобы использовать этот класс, нужно сделать что-то вроде этого:
<?php require_once('curl_class.php'); try { $curl = new CURL(); $curl->configure('webcodegeeks.com'); $response = $curl->execute(); $curl->close(); } catch (Exception $exception) { die('An exception has been thrown: ' . $exception->getMessage()); }
Приведенный выше код является более читаемым и простым в обслуживании. А также более гибким, так как он позволяет настроить любой параметр Curl.
Примечание: Запросы Curl могут быть использованы повторно, что позволяет увеличить производительность.
Например:
<?php require_once('curl_class.php'); try { $curl = new CURL(); $curl->configure('webcodegeeks.com'); $response1 = $curl->execute(); $curl->configure('webcodegeeks.com', , 'GET'); $response2 = $curl->execute(); $curl->close(); } catch (Exception $exception) { die('An exception has been thrown: ' . $exception->getMessage()); }
Данный скрипт обработки post запроса PHP будет работать без проблем. Это лучше, чем закрывать и открывать новую сессию Curl для каждого запроса. В нашем случае прирост производительности будет несущественным, но при нескольких запросах разница будет ощутимой.
Для повторного использования сессий Curl необходимо очистить и удалить установленные параметры, прежде чем добавлять новые. Это было сделано в файле curl_class.php с помощью функции curl_reset().
Формат запроса
Запрос выглядит примерно так:
Request-Line = Method SP URI SP HTTP-Version CRLF
Method = «OPTIONS»
| «HEAD»
| «GET»
| «POST»
| «PUT»
| «DELETE»
| «TRACE»
SP — это разделитель между токенами. Версия HTTP указывается в HTTP-Version. Реальный запрос выглядит так:
GET /articles/http-basics HTTP/1.1
Host: www.articles.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Список возможных заголовков запроса:
Request-header = Accept
| Accept-Charset
| Accept-Encoding
| Accept-Language
| Authorization
| Expect
| From
| Host
| If-Match
| If-Modified-Since
| If-None-Match
| If-Range
| If-Unmodified-Since
| Max-Forwards
| Proxy-Authorization
| Range
| Referer
| TE
| User-Agent
В заголовке Accept определяется поддерживаемые mime типы, язык, кодировку символов. Заголовки From, Host, Referer и User-Agent содержат информацию о клиенте. Префиксы If- предназначены для создания условий. Если условие не прошло, то возникнет ошибка 304 Not Modified.
Подробно о «javascript post»
- Скачать
-
Мы рассматривали ранее post в php — теперь пришло время разобраться в теме «post в JavaScript», не будем тянуть кота з хвост и приступим!Это самый простой пример, как работает «post в JavaScript»
Что мы будем делать!? Начнем с алгоритма!
Создадим файл php, где будет коротки код:
<?
$a = $_POST ;
$b = $_POST ;
echo $a + $b;Здесь на странице создадим форму с полями ввода.
И здесь же напишем функцию, которая получит данные из формы, отправит их с помощью «post JavaScript».
Она же получит ответ из файла и выведем результат действия в php файле.
Создадим функцию post :
function post() {}
Получаем данные из полей ввода :
var a = ida .value; // Считываем значение a
var b = idb .value; // Считываем значение b
В переменную «data» помещаем, конструкцию похожую на массив(но не массив) ключ = значение.
var data = «a=» + encodeURIComponent(a) + «&b=» + encodeURIComponent(b);
Создаём объект xhr:
var xhr = new XMLHttpRequest();
Открываем асинхронное соединение :
xhr.open(«POST», «https://dwweb.ru/путь до файла/examople_post_js.php» , true);
Отправляем кодировку :
xhr.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
Отправляем POST-запрос :
xhr.send(data);
Далее, не буду каждую строчку расписывать смотрим комментарии:
xhr.onreadystatechange = function() // Ждём ответа от сервера
{
if (xhr.readyState == 4) // возвращает текущее состояние объекта(0-4)
{
if(xhr.status == 200) // код 200 (если страница не найдена вернет 404)
{
summa.innerHTML = xhr.responseText; // Выводим ответ сервера
}
}
} -
<script>
function post()
{
var a = ida .value; // Считываем значение a
var b = idb .value; // Считываем значение b
var data = «a=» + encodeURIComponent(a) + «&b=» + encodeURIComponent(b);
var xhr = new XMLHttpRequest();// Создаём объект xhr
xhr.open(«POST», «https://dwweb.ru/путь/examople_post_js.php» , true);// Открываем асинхронное соединение
xhr.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);// Отправляем кодировку
xhr.send(data); // Отправляем POST-запрос
xhr.onreadystatechange = function() // Ждём ответа от сервера
{
if (xhr.readyState == 4) // возвращает текущее состояние объекта(0-4)
{
if(xhr.status == 200) // код 200 (если страница не найдена вернет 404)
{
summa.innerHTML = xhr.responseText; // Выводим ответ сервера
}
}
}
}
</script>
<input type=»text» name=»a» id=»ida»><br>
<input type=»text» name=»b» id=»idb»><br>
<input type=»button» value=»Сумма» onclick=»post()»>
<p>Сумма равна: <span id=»summa»></span></p>
-
Теперь — нам осталось вставить данный код прямо сюда и теперь вы можете проверить, как работает отправка POST-запроса через JavaScript
Сумма равна:
Название скрипта :Отправить POST-запрос через JavaScript
Ссылка на скачивание : Все скрипты на
POST и GET запросы без cURL
С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.
Пример:
$result = file_get_contents('https://phpstack.ru/');
Теперь у нас в переменной $result записан весь html код главной страницы этого сайта.
Мы совершили GET запрос, а html код — это ответ на него.
При помощи file_get_contents мы также можем отправить POST запрос.
Пример:
$postData = http_build_query(); $opts = [ 'http' => [ 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postData ] ]; $context = stream_context_create($opts); $result = file_get_contents('https://httpbin.org/anything', false, $context);
Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php
В $result мы получили ответ на POST запрос. httpbin.org — это сторонний сервис, который вы можете использовать для отладки запросов. Он возвращает нам наш собственный запрос в формате JSON и еще некоторую информацию. Так мы можем увидеть, что мы отправляем в своих запросах.
Как видите file_get_contents — полезная функция, которая не только позволяет читать файлы на нашем сервере, но еще и отправлять запросы.
Подробнее о ней вы можете прочитать здесь: https://www.php.net/manual/ru/function.file-get-contents.php
GET запрос при помощи cURL
cURL — мощный инструмент для отправки запросов. Только взгляните сколько он всего умеет.
Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.
Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.
Пример простого GET запроса при помощи cURL:
$url = 'https://phpstack.ru/'; $headers = []; // создаем заголовки $curl = curl_init(); // создаем экземпляр curl curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_VERBOSE, 1); curl_setopt($curl, CURLOPT_POST, false); // curl_setopt($curl, CURLOPT_URL, $url); $result = curl_exec($curl);
В итоге, переменная $result снова содержит html код страницы этого сайта.
- CURLOPT_VERBOSE — установлена в true для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR.
- CURLOPT_RETURNTRANSFER — установлена в true, для того чтобы вернуть ответ сервера. Если вам ответ сервера не нужен, то можете убрать эту опцию.
- Информация о других опциях
Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.
Основы HTTP
HTTP обеспечивает общение между множеством хостов и клиентов, а также поддерживает целый ряд сетевых настроек.
В основном, для общения используется TCP/IP, но это не единственный возможный вариант. По умолчанию, TCP/IP использует порт 80, но можно заюзать и другие.
Общение между хостом и клиентом происходит в два этапа: запрос и ответ. Клиент формирует HTTP запрос, в ответ на который сервер даёт ответ (сообщение). Чуть позже, мы более подробно рассмотрим эту схему работы.
Текущая версия протокола HTTP — 1.1, в которой были введены некоторые новые фишки. На мой взгляд, самые важные из них это: поддержка постоянно открытого соединения, новый механизм передачи данных chunked transfer encoding, новые заголовки для кэширования. Что-то из этого мы рассмотрим во второй части данной статьи.