PHP: POST и GET запросы для начинающих. Отправка GET-запросов в cURL Через что отправить post запрос

В PHP скриптах, очень часто используется обращение к другим сайтам путем HTTP-запроса. Мне известны несколько способов реализации таких запросов.

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

1. Самый простой, но не функциональный.

В качестве файла, в функции file_get_contents() , можно использовать URL-адрес страницы.

Функция в основном используется для файлов, но её также можно применить и для загрузки веб-страниц.

Пример реализации:

$content = file_get_contents("http://ya.ru"); echo $content;

Недостаток этого способа в том, что запрос происходит только через методу GET и нет возможности указать таймаут.

2. Более сложный, но функциональный способ.

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

Пример реализации:

$socket= fsockopen ("www.yandex.ru", 80, $errno, $errstr, 30); if (!$socket) {echo "$errstr ($errno)";} else { fputs ($socket, "GET / HTTP/1.0\r\nHost: www.yandex.ru\r\n\r\n"); while (!feof($socket)) {echo fgets ($socket,128);} fclose ($socket);}

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

3. Простой и функциональный способ.

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

Пример реализации:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://ya.ru"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $content= curl_exec($ch); curl_close($ch); echo $content;

Способ наиболее простой, но требует библиотеку cURL - обычно она уже предустановлена на веб-сервере.

В своих скриптах я использую cURL, "завернутую" в функцию с уже предустановленными параметрами.

# setcurlcookie function setcurlcookie($setcookie) { global $cookie; if (!empty($setcookie)) {$cookie = $setcookie;}} # curl function curl($url, $post = "", $binary = 0) { global $cookie; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if ($binary == 0) { curl_setopt($ch, CURLOPT_HEADER, 1);} else { curl_setopt($ch, CURLOPT_HEADER, 0);} curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_BINARYTRANSFER, $binary); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); return $result;}

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

Вторая функция curl() может осуществлять как GET запросы, так и POST. А также есть возможность указать тип получаемых данных - контент с заголовком или без.

Примеры:

GET-запрос:

$content = curl("http://ya.ru/?search=test"); echo $content;

POST-запрос:

$content = curl("http://ya.ru","username=alex&password=qwerty"); echo $content;

$content = curl("http://ya.ru/logo.svg?1","",1); echo $content;

Примечание: Информация в статье не исчерпывающая - возможно есть и другие способы.

Этот пост предназначен для объяснения принципов передачи данных в интернете с помощью двух основных методов: GET и POST. Написал я его в качестве дополнения к инструкции по генератору сменного графика работы для тех, кому вряд ли интересны подробности ☺.

Перейдите по следующему адресу (это для наглядного объяснения): http://calendarin.net/calendar.php?year=2016 Обратите внимание на адресную строку браузера: calendarin.net/calendar.php?year=2016 Основной файл называется, за ним следует вопросительный знак (?) и параметр «year» со значением «2016». Так вот, всё, что следует за вопросительным знаком, это и есть GET-запрос. Всё просто. Чтобы передать не один параметр, а несколько, то их нужно разделить амперсандом (&). Пример: calendarin.net/calendar.php?year=2016&display=work-days-and-days-off

Основной файл всё также называется, за ним следует вопросительный знак (?), затем - параметр «year» со значением «2016», затем - амперсанд (&), затем - параметр «display» со значением «work-days-and-days-off».

GET-параметры могут изменяться прямо в адресной строке браузера. Например, изменив значение «2016» на «2017» и нажав клавишу, вы перейдёте к календарю на 2017 год.

Это передача данных скрытым способом (адрес страницы не изменяется); то есть увидеть, что было передано, можно только с помощью программы (скрипта). Например, в следующем инструменте для подсчёта символов в тексте исходные данные передаются методом POST: http://usefulonlinetools.com/free/character-counter.php

Если остались вопросы, комментарии и мой E-mail к вашим услугам.

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

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

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

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

Введите текст:

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

POST и GET запросы простыми словами

Эта переменная будет отправлена методом POST.

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

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

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

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

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

POST / HTTP/1.0\r\n
Host: www.site.ru\r\n
Referer: http://www.site.ru/index.html\r\n
Cookie: income=1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 35\r\n
\r\n
login=Dima&password=12345

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

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

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

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

В прошлой заметке, мы определились с тем, что браузер (клиент) отправляет серверу HTTP запросы, а сервер отправляет клиенту HTTP ответы. Эти запросы и ответы оформляются по определенным правилам. Есть, что-то вроде синтаксиса, как и в какой последовательности, должно быть написано. Должна быть строго определенная структура.

Давайте более подробно рассмотрим эту структуру, по которой строятся запросы и ответы в протоколе HTTP.

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

Пустая строка (разделитель)

Post и Get запросы, какая между ними разница и что лучше и для каких целей?

тело сообщения (Entity Body) – необязательный параметр

Строка запроса – указывает метод передачи, URL-адрес, к которому нужно обратиться и версию протокола HTTP.

Заголовки – описывают тело сообщений, передают различные параметры и др. сведения и информацию.

тело сообщения — это сами данные, которые передаются в запросе. Тело сообщения – это необязательный параметр и может отсутствовать.

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

Более подробно, каждый элемент запроса, мы рассмотрим в следующих заметках.

Давайте, для примера, рассмотрим один реальный запрос к серверу. Я выделил каждую часть запроса своим цветом: строка запроса — зеленый, заголовки — оранжевый, тело сообщения- голубой.

Запрос от браузера:

Host: webgyry.info

Cookie: wp-settings

Connection: keep-alive

В следующем примере уже присутствует тело сообщения.

Ответ сервера:

Content-Type: text/html; charset=UTF-8

Transfer-Encoding: chunked

Connection: keep-alive

Keep-Alive: timeout=5

X-Pingback: //webgyry.info/xmlrpc.php

Документ без названия

Вот такими сообщениями обмениваются клиент и сервер по протоколу HTTP.

Кстати, хотите узнать есть ли смысл в каком-то элементе на вашем сайте с помощью «целей» Яндекс Метрики и Google Analytics?

Уберите то, что НЕ работает, добавьте то, что работает и удвойте вашу выручку.

Курс по настройке целей Яндекс Метрики..

Курс по настройке целей Google Analytics..

HTTP клиент посылает запрос на сервер в форме cсообщения-запроса, которое имеет следующий формат:

  • Строка запроса (обязательный элемент)
  • Заголовок (опционалный элемент)
  • Пустая строка (обязательный элемент)
  • Тело сообщения (опциональный элемент)

Рассмотрим каждый из этих элементов по отдельности.

Строка запроса

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

Расмотрим данный элемент более подробно

Метод запроса

Данный элемент указывает метод, который должен быть вызван на стороне сервера по указанному индентификатору URI.

В HTTP существует восемь методов:

  • HEAD
    Используется для получения строки статуса и заголовка от сервера по URI. Не изменяет данные.
  • GET
    Используется для получения данных от сервера по указанному URI. Не изменяет данные.
  • POST
    Используется для отправки данных на сервер (например информации о разработчике и т.д.) с помощью форм HTML.
  • PUT
    Замещает все предыдущие данные на ресурсе новыми загруженными данными.
  • DELETE
    Удаляет все текущие данные на ресурсе, определённом URI.
  • CONNECT
    Устанавливает туннельное соединение с сервером по указанному URI.
  • OPTIONS
    Описывает свойства соединения для указанного ресурса.
  • TRACE
    Предоставляет сообщение, содержащее обратный трейс расположения указанного в URI ресурса.

URI запроса

URI (Uniform Resource Identifier) – это идентификатор ресурса на который отправляется запрос. Ниже приведён наиболее часто встречающийся формат URI:

‘*’ используется когда HTTP запрос не относится к конкретному ресурсу, но к серверу. Используется только в случае, когда метод не обязательно применять к ресурсу. Например,

абсолютныйURI используется, когда HTTP запрос выполняется на прокси. Прокси запрашивается для передачи запроса из доступного кэша и возвращает ответ. Например:

асболютный_путь | источник используется наиболее чатсо.

Учимся работать с GET и POST запросами

Запрашивается конкретный ресурс определённого сервера. Например, клиент хочет получить ресурс с сервера через 80-й порт. Адрес ресурса “www.proselyte.net” и отправляет следующий запрос:

Запрос полей заголовка

Поля заголовка позволяют клиенту передать дополнительную информацию о запросе и о себе самом серверу. Эти поля действуют как модификаторы запроса.

Ниже приведён списко наиболее важных полей заголовка, которые могут быть использованы:

  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Authorization
  • Expect
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Range
  • Referer
  • User-Agent

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

Пример HTTP запроса

На этом мы заканчиваем изучение запросов HTTP.
В следующей статье мы рассмотрим HTTP ответы.

Одним из способов, как можно отправить запрос по протоколу HTTP к серверу, является запрос методом GET. Этот метод является самым распространенным и запросы к серверу чаще всего происходят с его использованием.

Самый простой способ, как можно создать запрос методом GET- это набрать URL-адрес в адресную строку браузера.

Браузер передаст серверу примерно следующую информацию:

GET / HTTP/1.1
Host: webgyry.info
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: wp-settings
Connection: keep-alive

Запрос состоит из двух частей:

1. строка запроса (Request Line)

2. заголовки (Message Headers)

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

Различие между методами GET и POST

Это можно делать с помощью специальных GET параметров.

Чтобы добавить GET параметры к запросу, нужно в конце URL-адреса поставить знак «?» и после него начинать задавать их по следующему правилу:

имя_параметра1=значение_параметра1& имя_параметра2=значение_параметра2&…

Разделителем между параметрами служит знак «&».

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

http://site.ru/page.php?name=dima&age=27

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

Вот пример, как это можно сделать на PHP.

Конструкция $_GET[«имя_параметра»] позволяет выводить значение переданного параметра.

В результате выполнения этого кода в браузере выведется:

Ваше имя: dima
Ваш возраст: 27

мы тоже выполняем запрос к серверу методом GET.

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

В основном в php применяется два способа получения контента со страниц сайта.

1. get — запрос с помощью функции file_get_contents ().

Функция позволяет получить содержимое файла в виде одной строки и имеет следующий синтаксис:

string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]])
где filename — путь к файлу.

В случае неудачи функция возвращает FALSE.

В качестве имени файла можно указывать URL, то есть можно указать адрес нужной web-страницы, тогда функция вернет ее содержимое в виде html-кода. Например:

$url = "https://сайт/";
$result = file_get_contents ($url);

2. Использование библиотеки CURL .

В случае использования CURL код становится более громоздким, но появляется больше различных возможностей, так как библиотека имеет множество настроек и позволяет выполнять get и post запросы .

Получение содержимого страницы состоит из четырех действий:

  • инициализация сеанса с помощью функции curl_init() ;
  • установка нужных параметров с помощью функции curl_setopt() ;
  • выполнение запроса функцией curl_exec() ;
  • закрытие сеанса функцией curl_close() .

Например:


{





}

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

Если необходимо выполнить POST запрос к удаленному сайту , то необходимо опцию CURLOPT_POST установить в true , а в опцию CURLOPT_POSTFIELDS поместить передаваемые данные:

if ($curl = curl_init ()) //инициализация сеанса
{
curl_setopt ($curl, CURLOPT_URL, "http://сайт/");//указываем адрес страницы
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_POST, true);
curl_setopt ($curl, CURLOPT_POSTFIELDS, «i=1»);
curl_setopt ($curl, CURLOPT_HEADER, 0);
$result = curl_exec ($curl);//выполнение запроса
curl_close ($curl);//закрытие сеанса
}

В результате обоих способов в переменную $result попадает контент заданной страницы в виде строки html кода. После этого можно переходить непосредственно к парсингу страницы, то есть к извлечению из содержимого строки нужных данных. Например получить все картинки со страницы или извлечь текстовый контент.

Для парсинга можно воспользоваться регулярными выражениями, но лучше использовать встроенную библиотеку DOMDocument или библиотеку SimpleHTMLDOM .

На этом все, до новых встреч!

Решил сделать себе шпаргалку об основных методах отправки и получения данных с веб сервера средствами php и js. Так и родилась эта заметка. В ней я рассмотрел наиболее часто используемые приёмы обмена данными между веб клиентом и веб сервером, которые используют php разработчики.

Главными фаворитами отправки данных являются php get запрос и php запрос post, за ними идёт технология AJAX. Так в чём же отличия get и post запросов.

  • get запрос передаётся в адресной строке (в http заголовке) и виден пользователю
  • post запрос передаётся в теле документа
  • объём get запроса ограничен (максимум 276 символов)
  • метод get не передаёт файлы
  • метод post передаёт файлы
Php get запрос

Что бы сделать php get запрос нам для начала следует создать html форму с полем для ввода данных. В теге form указываем к какому файлу на сервере обращаться и каким методом производить отправку . Так же не забываем задавать полю атрибут name , это будет название ячейки массива GET $_GET["data"]; из которого мы получим данные в файл на сервере. Как отправлять данные get через форму я думаю ясно, теперь попробуем передать их через адресную строку. index.php?data=1 если мы вобьём такой запрос в адресную строку и отправим, то в файле в index.php мы получим из $_GET["data"] значение 1. С этим я думаю то же всё понятно, теперь пример.

Задача: есть файл index.php с формой отправки get запроса к другому файлу например get.php. При получении гет запроса файл get.php должен передать массив с данными в index.php. В index.php полученный массив должен вывестись.

Реализация. Файл index.php

//В форме методом get через скрытое поле посылаем значение 1 Отправить запрос

Файл get.php

Php запрос post

Php запрос post передаётся так же через форму, только атрибут в теге form будет method="post" . И получать данные в указанном файле мы будем из массива пост $_POST["search"] и сразу приведём пример.

Задача: отправить данные из index.php методом POST на сервер в файл get.php и получить их обратно, если поле отправки данных пустое вывести сообщении о незаполненном поле. Решение начнём с index.php

Поисковый запрос

Заполните поле запроса

Введённый запрос:

Отправить запрос

Файл get.php

Передача массива AJAX

Выполним ту же самую задачу с помощью ajax. Вообще то ajax это технология относящаяся к javascript, но в рамках заметки о передаче данных на сервер затронем и эту технологию. Конечно ajax это тема отдельной статьи. В процессе запроса ещё будем выводить гифку индикатора загрузки. Так же имеем два файла index.php и get.php. Файл index.php. Не забываем подключать jquery. Обращу внимание, для скрытия гифки при первой загрузке страницы назначаем блоку box стиль display: none

$(document).ready(function(){ //вешаем событие на кнопку отправить $(".submit").click(function(){ $.ajax({ //как будем передавать данные type: "GET", //куда передаём url: "get.php", //какие данные передаём data: {flag: 1}, //событие перед отправкой ajax beforeSend: function(){ //выводим гифку $(".box").show(); }, //событие после получения ответа, //получаем массив в data success: function(data){ //скрываем гифку $(".box").hide(); var html = ""; //ф-я JSON.parse переводит json данные в объект var dt=JSON.parse(data); for (var i = 0; i

Файл get.php. В файл получаем данные из гет массива и из php передаём массив в javascript. Что бы передать php массив в js, его нужно привести к формату json. Для этого используем php ф-ю json_encode. После перекодировки производится отправка json php средствами, а конкретно вызываем echo.

Итак, пришло время нам начать взаимодействовать с пользователем.

Как мы говорили ранее, PHP работает на сервере. Отсюда следует вопрос, а как же нам из браузера начать с ним взаимодействовать? Например, заполнить форму логина на сайте и отправить данные на сервер, чтобы наш код с ним что-нибудь сделал.

Именно об этом мы и поговорим в этом уроке.

Итак, давайте удалим все наши файлы в проекте и создадим новый пустой файл с именем index.php. Запишем в него следующий код:

курса PHP для начинающих .

Давайте выполним этот скрипт, открыв в браузере адрес:
http://myproject.loc/index.php

  • arg1 со значением 123;
  • arg2 со значением scrrr.

Мы можем очень просто получить к ним доступ из PHP с помощью магической переменной $_GET. Эта переменная является суперглобальной, то есть доступна нам в PHP всегда и в любом месте. Она представляет собой ассоциативный массив, в котором хранятся все переданные в запросе GET-параметры.

Давайте изменим код нашего index.php, чтобы узнать, что именно хранится в этой переменной.

Код доступен только после покупки курса PHP для начинающих .

Мы увидим следующее:

Код доступен только после покупки курса PHP для начинающих .

Как мы можем видеть, это действительно наши переданные аргументы, представленные в виде ассоциативного массива.

Учимся обрабатывать параметры

Давайте попробуем передать другие аргументы:
http://myproject.loc/index.php?login=admin&password=12345

Результат:

Код доступен только после покупки курса PHP для начинающих .

Разумеется, мы можем обращаться к этим элементам как к элементам обычного массива. Например, так:

Код доступен только после покупки курса PHP для начинающих .

Давайте создадим простую страничку, на которой мы будем выводить переданные с помощью GET-запроса логин и пароль.

Код доступен только после покупки курса PHP для начинающих .

Обновим нашу страничку в браузере и увидим результат.

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

Учимся работать с формами

Как мы видим по исходному коду, форма отправит аргументы login и password с введенными значениями на адрес /login.php.

Давайте введем в поля значения admin и Pa$$w0rd соответственно и нажмем на кнопку «Войти».

Где сервер нам скажет о том, что такой странички не найдено.

Отлично! Так давайте же её создадим! Создаём рядом с нашим index.php файл с именем login.php. И пишем в него следующий код:

Код доступен только после покупки курса PHP для начинающих .

Вернёмся на нашу форму и повторно отправим пароль. Теперь мы увидим информацию о том, что мы успешно авторизовались. Это простейший прототип формы авторизации. Разумеется, он сильно упрощён, не всё сразу. А пока – делаем домашнее задание.