Get и post запросы c модулем requests в python
Содержание:
- Коды состояния API
- Как получить и отправить данные get запросом?
- cURL запросы через прокси
- Коды состояния
- Постскриптум.
- Страница, которая будет принимать данные с другой страницы методом get
- Пример из практики
- Параметры запроса
- GET запрос
- Что такое GET-параметр
- Работа с параметрами запроса на сервере (PHP)
- How to Display get_posts Returned Data
- Примеры запросов POST с использованием библиотеки REQUESTS в PYTHON
- Go HTTP POST request JSON data
- POST и GET запросы без cURL
- Метод POST
- POST-запросы. Метод post
- Методы requests.get() и requests.post() модуля requests.
Коды состояния API
Коды состояния возвращаются при каждом запросе к веб-серверу. Коды состояния указывают информацию о том, что произошло с запросом.
Ответы сгруппированы в пять классов:
- Информационные ответы ( — ),
- Успешные ответы ( — ),
- Перенаправления ( — ),
- Ошибки клиента ( — ),
- и ошибки сервера ( — ).
Вот некоторые коды, которые относятся к запросам GET
- : Все прошло хорошо и результат был возвращен (если есть).
- : Сервер перенаправляет вас на другую конечную точку. Это может произойти, когда компания меняет доменные имена или имя конечной точки изменяется.
- : Сервер считает, что вы сделали неверный запрос. Это может произойти, если вы отправите неверные данные.
- : Сервер думает, что вы не аутентифицированы. Для многих API требуются учетные данные для входа, поэтому код 401 случается, когда вы отправляете неверные учетные данные для доступа к API.
- : Ресурс, к которому вы пытаетесь получить доступ, запрещен: у вас нет прав для его просмотра.
- : Ресурс, к которому вы пытались получить доступ, не найден на сервере.
- : Сервер не готов обработать запрос.
Как получить и отправить данные get запросом?
Форма уже готова! Теперь получим данные из этой формы!
Для получения данных используется условие по значению атрибута «name»(см форму).
if($_GET)
Далее просто выводим результат гет запроса:
<?
if($_GET) { echo $_GET ;}
?>
Помните про якорь, который я говорил в одном из пунктов, чтобы нам вернуться прямо к результату!? Если у вас не нужно перемещаться по странице, то использовать якорь не нужно.Размещаем его тоже здесь:
<a name=»primer_1_0″></a>
Соберем форму, код и вывод в одно целое
<a name=»primer_1_0″></a>
<?
if($_GET) { echo «отправленные данные: «. strip_tags($_GET) ;}
?>
<form action=»#primer_1_0″ method=»get»>
<input type=»text» name=»name_example» value=»Значение_1″>
<input type=»submit» value=»ОТПРАВИТЬ»>
</form>
cURL запросы через прокси
Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.
$url = 'http://dynupdate.no-ip.com/ip.php'; // тут мы можем узнать свой IP адрес $proxy = '127.0.0.1:8888'; //$proxyauth = 'user:password'; // если прокси с авторизацией, то раскомметируйте $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_PROXY, $proxy); //curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth); // если прокси с авторизацией, то раскомметируйте curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); $html = curl_exec($ch); curl_close($ch); echo $html;
Коды состояния
В ответ на запрос от клиента, сервер отправляет ответ, который содержит, в том числе, и код состояния. Данный код несёт в себе особый смысл для того, чтобы клиент мог отчётливей понять, как интерпретировать ответ:
1xx: Информационные сообщения
Набор этих кодов был введён в HTTP/1.1. Сервер может отправить запрос вида: Expect: 100-continue, что означает, что клиент ещё отправляет оставшуюся часть запроса. Клиенты, работающие с HTTP/1.0 игнорируют данные заголовки.
2xx: Сообщения об успехе
Если клиент получил код из серии 2xx, то запрос ушёл успешно. Самый распространённый вариант — это 200 OK. При GET запросе, сервер отправляет ответ в теле сообщения. Также существуют и другие возможные ответы:
- 202 Accepted: запрос принят, но может не содержать ресурс в ответе. Это полезно для асинхронных запросов на стороне сервера. Сервер определяет, отправить ресурс или нет.
- 204 No Content: в теле ответа нет сообщения.
- 205 Reset Content: указание серверу о сбросе представления документа.
- 206 Partial Content: ответ содержит только часть контента. В дополнительных заголовках определяется общая длина контента и другая инфа.
3xx: Перенаправление
Своеобразное сообщение клиенту о необходимости совершить ещё одно действие. Самый распространённый вариант применения: перенаправить клиент на другой адрес.
- 301 Moved Permanently: ресурс теперь можно найти по другому URL адресу.
- 303 See Other: ресурс временно можно найти по другому URL адресу. Заголовок Location содержит временный URL.
- 304 Not Modified: сервер определяет, что ресурс не был изменён и клиенту нужно задействовать закэшированную версию ответа. Для проверки идентичности информации используется ETag (хэш Сущности — Enttity Tag);
4xx: Клиентские ошибки
Данный класс сообщений используется сервером, если он решил, что запрос был отправлен с ошибкой. Наиболее распространённый код: 404 Not Found. Это означает, что ресурс не найден на сервере. Другие возможные коды:
- 400 Bad Request: вопрос был сформирован неверно.
- 401 Unauthorized: для совершения запроса нужна аутентификация. Информация передаётся через заголовок Authorization.
- 403 Forbidden: сервер не открыл доступ к ресурсу.
- 405 Method Not Allowed: неверный HTTP метод был задействован для того, чтобы получить доступ к ресурсу.
- 409 Conflict: сервер не может до конца обработать запрос, т.к. пытается изменить более новую версию ресурса. Это часто происходит при PUT запросах.
5xx: Ошибки сервера
Ряд кодов, которые используются для определения ошибки сервера при обработке запроса. Самый распространённый: 500 Internal Server Error. Другие варианты:
- 501 Not Implemented: сервер не поддерживает запрашиваемую функциональность.
- 503 Service Unavailable: это может случиться, если на сервере произошла ошибка или он перегружен. Обычно в этом случае, сервер не отвечает, а время, данное на ответ, истекает.
Постскриптум.
Думаю, что о передаче запросов на сервер
не стоит рассказывать подробно. Это уже
дело чисто РНР техники :-). Достаточно
внимательно прочитать раздел о функциях
работы с сокетами, или о функциях модуля
CURL в официальной документации РНР.
Из выше сказанного, надеюсь теперь
понятно, почему вопрос: «Как мне
сформировать POST запрос, используя
функцию header?» — бессмысленен.
Функция header(string) добавляет запись только
в заголовок запроса, но никак не в тело
запроса.
Есть еще один тип запросов — Content-Type:
multipart/mixed, надеюсь после прочтения данной
статьи Вы легко разберетесь с данным
типом сами. Подробно изучить его можно
О запросах других типов можно прочитать
в официальной спецификации протокола HTTP
1.0 здесь.
<< предыдущая
||
следующая >>
Страница, которая будет принимать данные с другой страницы методом get
Для того, чтобы принять данные, которые будут отправляться этой, либо с любой другой страницы, мы на странице применика должны написать совершенно аналогичные условия приема данный get запроса!
if($_GET)
<!DOCTYPE html>
<html lang=»ru»>
<head>
<meta charset=»UTF-8″>
<META NAME=»ROBOTS» CONTENT=»NOINDEX,NOFOLLOW»>
<title>Пример страницы для приема get запроса</title>
</head>
<body>
<?
if($_GET)
{
$vivod = ‘<div class=»kod»><span style=»color: red;»>Вы отправили данные: </span><br>
$send_var = ‘. strip_tags ( $_GET ).’ <br>
GET запрос был отправлен <a href=»https://dwweb.ru/page/php/function/044_metod_get.html#paragraph_7″>со страницы</a>’;
echo $vivod ;
}
else
{
echo ‘Вы здесь ничего не увидите, пока не отправить get запрос со страницы <a href=»https://dwweb.ru/page/php/function/044_metod_get.html#paragraph_7″>со страницы</a>’;
}
?>
</body>
</html>
Пример из практики
Я технически поддерживаю один из обучающих проектов.
Имела место следующая ситуация.
- Есть лендинг тренинга, в котором можно участвовать как платно (с расширенными возможностями), так и бесплатно (базовый вариант).
- На этот лендинг «льется трафик» с различных рекламных систем (яндекс.директ, вконтакте, фэйсбук, партнеры…).
- Все рекламные ссылки на этот лендинг размечены utm-метками.
- В свою очередь CRM-система, используемая на проекте, поддерживает работу с UTM-метками и таким образом можно считать выгоду от того или иного канала рекламы, соотнося расходы и продажи по каждому каналу.
- На лендинге имеются 2 ссылки для платного и бесплатного участия. Ссылка для бесплатного участия ведет на отдельную страницу, где находится форма, заполнив которую, человек попадает в группу в CRM для бесплатного участия в тренинге.
Формулируем задачу для решения этой проблемы:нужно взять UTM-метки из строки запроса лендинга и подставить их в ссылку на страницу с формой.
Сделать это нужно было максимально быстро, т.е. «вчера» поскольку на страницу уже шел трафик.
Параметры запроса
Зачастую, кроме адреса страницы сайта, в ссылке требуется передавать какие-то дополнительные параметры.
Всем известен выход из этой ситуации: нужно разбить каталог на страницы. Все вы видели такие страницы, там десять или двадцать товаров, а также ссылки на другие страницы каталога.
Как же сформированы подобные ссылки? Вот здесь-то и используются параметры запроса в URL.
Посмотрите на адрес:
https://someshop.ru/catalog/iphone?page=1&perpage=20
Здесь:
- https – это протокол, по которому идет передача данных (в данном случае защищенный http);
- someshop.ru – доменное имя хоста (часто просто говорят «домен»);
- catalog/iphone – так называемый «Путь» до конкретной страницы на сайте, часто бывает иерархическим, при этом составные части пути разделяет прямой слэш /;
- page=1&perpage=20 – строка запроса (как раз состоящая из параметров).
Вот именно строку запроса, в большинстве случаев называют GET-параметрами.
Эта строка состоит из пар имя_параметра=значение_параметра.
Пары разделены между собой амперсандом &.
Строка запроса отделена от адреса (с путем) знаком вопроса ?
В адресе выше мы имеем два параметра запроса:
- page со значением 1
- perpage со значением 20
Они означают, что ссылка ведет на 1-ю страницу каталога, и выводить на странице нужно 20 товаров.
GET запрос
В RestTemplate мы можем отправить запрос GET двумя способами:
Первый тип: getForEntity
Возвращаемое значение метода getForEntity — это,Это Spring инкапсуляция ответа HTTP-запроса, включая несколько важных элементов, таких как код ответа, contentType, contentLength, тело сообщения ответа и т. Д. Например, следующий пример:
По поводу этого кода я говорю следующее:
Первый параметр getForEntity — это адрес службы, которую я хочу вызвать. Здесь я вызываю интерфейс / hello, предоставленный поставщиком услуг
Обратите внимание, что это вызывается по имени службы, а не по адресу службы. Если адрес службы записан, клиент не может быть реализован
Нагрузка сбалансирована.
Второй параметр String.class getForEntity указывает, что тип тела, который я надеюсь вернуть, — String.
После получения возвращенного результата просмотрите и распечатайте возвращенный результат
Окончательный результат отображения будет следующим:
Иногда, когда я вызываю интерфейс, предоставленный поставщиком услуг, мне может потребоваться передать параметры. Есть два разных способа, а именно:
- Вы можете использовать число в качестве заполнителя и, наконец, параметр переменной длины, чтобы заменить предыдущие заполнители один за другим.
- Вы также можете использовать форму name = {name} спереди, последний параметр — это карта, ключ карты — это имя заполнителя впереди, а значение карты — это значение параметра
Первым адресом вызова также может быть URI вместо строки. На данный момент мы можем создать URI. Параметры волшебного коня включены в URI, как показано ниже:
Uri можно создать с помощью компонентов UriComponents, предоставленных в Spring.
Конечно, поставщик услуг может возвращать не только String, но и объект настраиваемого типа. Например, у моего поставщика услуг есть следующие методы:
Для этого метода я могу вызвать его в потребителе службы следующим образом:
Результаты приведены ниже:
Второй: getForObject
Функция getForObject на самом деле является дальнейшей инкапсуляцией функции getForEntity
Если вы обращаете внимание только на содержимое тела возвращенного сообщения и не обращаете внимания на другую информацию, вы можете использовать getForObject. Простой пример выглядит следующим образом:
getForObject также имеет несколько перегруженных методов, а именно:
Значения этих параметров перегруженного метода соответствуют getForEntity, поэтому я не буду их повторять.
Что такое GET-параметр
Прежде чем перейти к определению GET-параметра, поговорим о том, как происходит связь клиента и сервера в интернете. Выполняется это через HTTP-протокол – протокол передачи гипертекста. Благодаря ему обмен данными может осуществляться по принципу «запрос-ответ»: когда пользователь получает URL-адрес через веб-браузер, выполняется запрос на сервер, и в качестве ответа предоставляется HTML-страница, загруженная браузером. Для такого рода связи используются такие параметры, как GET и POST. Нас интересуют лишь GET-запросы – остановимся на них поподробнее.
Когда выполняется метод GET, клиент использует HTTP-протокол на веб-сервере для запроса необходимого ресурса, затем он отправляет серверу определенные параметры GET через запрошенный URL. Страница, созданная данным методом, может быть открыта повторно множество раз, кэширована браузером, проиндексирована поисковыми системами и добавлена в закладки пользователем.
GET-параметры представляют собой пары и соответствующие им значения, так называемые пары «имя-значение». Они всегда начинаются с вопросительного знака «?». За ним следует имя переменной и соответствующее значение, разделенные знаком «=». Если URL-адрес содержит более одного параметра, то они разделяются амперсандом «&».
http://getrequest.com/index.php?thing=Стул§ion=Мебель
Thing – первый GET-параметр, section – второй.
В коде прописывается следующим образом:
<?php echo ‘Предмет: ‘ . $_GET . ‘<br />’; echo ‘Раздел: ‘ . $_GET . ‘<br />’; ?>
Чаще всего необходимость в таких запросах возникает, когда нужно отфильтровать страницу по каким-либо параметрам. Например, чтобы отобразить список определенных машин на сайте по продаже авто, открыть каталог смартфонов белого цвета с 32 Гб памяти и т.п.
Таким образом, мы можем прописывать параметры в URL и изменять с их помощью содержимого страницы.
Работа с параметрами запроса на сервере (PHP)
Задача была решена парой строчек кода на PHP.
Ниже код двух страничек, первая это эмуляция лендинга со ссылкой на эмуляцию страницы с формой, вторая это эмуляция страницы с формой.
Лендинг (index.php):
<?php
$queryStr = filter_input(INPUT_SERVER, ‘QUERY_STRING’);
$url = $queryStr ? ‘form.html?’ . $queryStr : ‘form.html’;
?>
<!DOCTYPE html>
<html lang=»ru»>
<head>
<meta charset=»utf-8″>
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″>
<title>Лендинг</title>
</head>
<body style=»background-color: #f5f5f5″>
<div style=»width: 100%; max-width: 600px; margin: 100px auto; background-color: #ffffff; padding: 60px 40px; text-align: center;»>
<h1>Это лендинг</h1>
<p><a href=»<?= $url ?>» target=»_blank»>Это ссылка на страницу с формой</a></p>
</div>
</body>
</html>
1 |
<?php $queryStr=filter_input(INPUT_SERVER,’QUERY_STRING’); $url=$queryStr?’form.html?’.$queryStr’form.html’; ?> <!DOCTYPE html> <html lang=»ru»> <head> <meta charset=»UTF-8″> <meta name=»viewport»content=»width=device-width, initial-scale=1.0″> <title>Лендинг<title> <head> <body style=»background-color: #f5f5f5″> <div style=»width: 100%; max-width: 600px; margin: 100px auto; background-color: #ffffff; padding: 60px 40px; text-align: center;»> <h1>Этолендинг<h1> <p><ahref=»<?=$url?>»target=»_blank»>Этоссылканастраницусформой<a><p> <div> <body> <html> |
Страница с формой (form.html):
<!DOCTYPE html>
<html lang=»ru»>
<head>
<meta charset=»utf-8″>
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″>
<title>Страница с формой</title>
</head>
<body style=»background-color: #f5f5f5″>
<div
style=»width: 100%; max-width: 600px; margin: 100px auto; background-color: #ffffff; padding: 60px 40px; text-align: center;»>
<h1>Это страница с формой</h1>
</div>
</body>
</html>
1 |
<!DOCTYPE html> <html lang=»ru»> <meta charset=»UTF-8″> <meta name=»viewport»content=»width=device-width, initial-scale=1.0″> <title>Страница с формой</title> </head> <body style=»background-color: #f5f5f5″> <div style=»width: 100%; max-width: 600px; margin: 100px auto; background-color: #ffffff; padding: 60px 40px; text-align: center;»> <h1>Это страница с формой</h1> </div> </body> |
Собственно решение в первом PHP-блоке:
<?php
$queryStr = filter_input(INPUT_SERVER, ‘QUERY_STRING’);
$url = $queryStr ? ‘form.html?’ . $queryStr : ‘form.html’;
?>
1 |
<?php $queryStr=filter_input(INPUT_SERVER,’QUERY_STRING’); $url=$queryStr?’form.html?’.$queryStr’form.html’; ?> |
В первой строке, при помощи функции filter_input, получаем строку запроса из суперглобального массива $_SERVER.
Во второй строке, если строка запроса имеется, прикрепляем её к URL страницы с формой.
Получившуюся переменную $url выводим в атрибуте href ссылки.
Таким образом на страницу form.html стали передаваться UTM-метки, и CRM-система начала получать информацию о канале рекламы, с которого пришел тот или иной посетитель.
Решение, приведенное выше, далеко не универсально. Поскольку берутся все параметры запроса, а кроме UTM-меток, среди них, могут быть и другие параметры.
Стоит немного усовершенствовать код, чтобы брать только те параметры, которые нам нужны.
<?php
$validParams = [ // Допустимые имена параметров
‘utm_source’,
‘utm_medium’,
‘utm_campaign’,
‘utm_content’,
‘utm_term’
];
$queryStr = »;
$inputArray = filter_input_array(INPUT_GET); // Получаем параметры из массива $_GET
if ($inputArray)
{
foreach ($inputArray as $key => $value)
{
$key = strtolower($key);
if(in_array($key, $validParams)) // Проверка имени параметра на допустимость
{
$queryStr .= «$key=$value&»; // В цикле формируем строку с параметрами
}
}
$queryStr = rtrim($queryStr, ‘&’); //удаляем последний символ &
}
$url = $queryStr ? ‘form.html?’ . $queryStr : ‘form.html’;
?>
1 |
<?php $validParams=// Допустимые имена параметров ‘utm_source’, ‘utm_medium’, ‘utm_campaign’, ‘utm_content’, ‘utm_term’ ; $queryStr=»; $inputArray=filter_input_array(INPUT_GET);// Получаем параметры из массива $_GET if($inputArray) { foreach($inputArrayas$key=>$value) { $key=strtolower($key); if(in_array($key,$validParams))// Проверка имени параметра на допустимость { $queryStr.=»$key=$value&»;// В цикле формируем строку с параметрами } } $queryStr=rtrim($queryStr,’&’);//удаляем последний символ & } $url=$queryStr?’form.html?’.$queryStr’form.html’; ?> |
How to Display get_posts Returned Data
WordPress returns an array of objects giving us access to a number of variables for each selected post stored in database table:
- ID
- post_author
- post_name
- post_type
- post_title
- post_date
- post_date_gmt
- post_content
- post_excerpt
- post_status
- comment_status
- ping_status
- post_password
- post_parent
- post_modified
- post_modified_gmt
- comment_count
- menu_order
wp_posts table structure in phpMyAdmin
You can easily access these data with a cycle like the following:
If found at least one post, it returns an array of items we can traverse to show the post title and a link to the original post. We used the function to retrieve the post permalink, as we don’t have a corresponding variable.
That’s pretty easy, but how can we implement that code and build our custom lists of posts using WordPress ?
You can show lists of posts on your pages in several ways.
- You can include them anywhere on the page by editing a child theme’s page template.
- You can include them in a sidebar widget.
- You can include them in a post’s content with a custom shortcode
Примеры запросов POST с использованием библиотеки REQUESTS в PYTHON
Выгрузка данных из Bitrix24 с фильтром по дате из REST API
import requests # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://domain.ru/rest/1/854984lkjdsijd432/" + method_name params = {"filter": "2020-01-01T00:00:01+01:00"} print(params) response = requests.post(url_param, data = params) result = response.json() total = result print(total)
Выгрузка данных из Bitrix24 с двумя фильтрами по дате из REST API
import requests # method method_name = "crm.deal.list" # Адрес api метода для запроса get url_param = "https://domain.ru/rest/1/854984lkjdsijd432/" + method_name params = { "filter":"2019-01-01T00:00:01+01:00", "filter":"2020-01-01T00:00:01+01:00" } print(params) response = requests.post(url_param, data = params) result = response.json() total = result print(total)
Go HTTP POST request JSON data
The following example sends a POST request with data in JSON format.
post_req_json.go
package main import ( "bytes" "encoding/json" "fmt" "log" "net/http" ) func main() { values := mapstring{"name": "John Doe", "occupation": "gardener"} json_data, err := json.Marshal(values) if err != nil { log.Fatal(err) } resp, err := http.Post("https://httpbin.org/post", "application/json", bytes.NewBuffer(json_data)) if err != nil { log.Fatal(err) } var res mapinterface{} json.NewDecoder(resp.Body).Decode(&res) fmt.Println(res) }
We generate a POST request to the webpage. The
post data is taken from a map and transformed into a string with
package.
values := mapstring{"name": "John Doe", "occupation": "gardener"} json_data, err := json.Marshal(values)
A map is serialized into JSON string with .
resp, err := http.Post("https://httpbin.org/post", "application/json", bytes.NewBuffer(json_data))
When we post the data, we set the content type to .
$ go run post_req_json.go map
In this tutorial, we have created GET and POST requests in Go.
List .
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
Метод POST
блок 1
В методе POST данные отправляются на сервер в виде пакета в отдельном сообщении со сценарием обработки. Данные, отправленные методом POST, не будут видны в URL.
Преимущества и недостатки использования метода POST
- Это более безопасно, чем GET, потому что введенная пользователем информация никогда не отображается в строке запроса URL или в журналах сервера.
- Существует гораздо больший лимит на количество данных, которые можно передать, и можно отправлять текстовые данные, а также двоичные данные (загрузка файла) с помощью POST.
- Поскольку данные, отправленные методом POST, не видны в URL-адресе, невозможно добавить страницу в закладки с помощью конкретного запроса.
Как и $_GET, PHP предоставляет еще одну суперглобальную переменную $_POST для доступа ко всей информации, отправляемой методом post или отправляемой через форму HTML с использованием method=»post».
<!DOCTYPE html> <html lang="en"> <head> <title>Пример отправки данных из формы методом POST</title> </head> <body> <?php if(isset($_POST)){ echo "<p>Привет, " . $_POST . "</p>"; } ?> <form method="post" action="<?php echo $_SERVER;?>"> <label for="inputName">Имя:</label> <input type="text" name="name" id="inputName"> <input type="submit" value="Отправить"> </form> </body> </html>
POST-запросы. Метод post
Последнее обновление: 1.11.2015
В отличие от GET-запросов данные POST-запросов передаются не в строке запроса, а в его теле. Распространенным примеров подобных запросов
является отправка данных формы на сервер.
Для отправки POST-запросов предназначен метод . Его объявление и использование в целом аналогично методу get. Он принимает
следующие параметры:
-
: обязательный параметр, содержащий адрес ресурса, к которому будет обращаться запрос
-
: необязательный параметр, содержащий простой объект javascript или строку, которые будут отправлены на сервер вместе с запросом
-
: необязательный параметр — функция обратного вызова, которая будет выполняться при
успешном выполнении запроса. Она может принимать три параметра: — данные, полученные с сервера, —
— статус запроса и — специальный объект jQuery, который представляет расширенный вариант объекта XMLHttpRequest. -
: необязательный параметр, содержащий тип данных в виде строки, например, «xml» или «json»
На выходе метод post возвращает объект .
Пример использования:
$.post('ajax.php', {'login':'1111', 'password' : '2222'}, function(data) { $('#news').html(data); });
В данном случае мы передаем в качестве данных пароль и логин. На сервере мы можем получить данные и отправить ответ пользователю:
<?php $login=$_POST; $pass=$_POST; if($login=="1111" && $pass=="2222"){ echo "Авторизация прошла успешно"; } else{ echo "Неверно введен логин или пароль"; } ?>
Поскольку наиболее часто запрос post используется при отправке данных формы, используем на стороне клиента форму:
<html> <head> <meta charset='utf-8'> <script src="jquery-1.10.1.min.js"></script> </head> <body> <form action="ajax.php" id="loginForm"> <input type="text" id="login" placeholder="Логин" /><br><br> <input type="text" id="password" placeholder="Пароль" /><br><br> <input type="submit" value="Войти" /> </form> <div id="result"></div> <script type="text/javascript"> $("#loginForm").submit(function(event) { // Предотвращаем обычную отправку формы event.preventDefault(); $.post('ajax.php', {'login':$('#login').val(), 'password' : $('#password').val()}, function(data) { $('#result').html(data); }); }); </script> </body> </html>
Итак, серверная часть, к которой будет обращаться форма — файл ajax.php — у нас остается той же. Только в данном случае теперь
для параметра в методе post мы данные берем из полей на этой форме.
Обратите внимание, что мы блокируем обычную отправку формы (), иначе у нас бы шла переадресация
Сериализация формы
Посколкьу нередко формы не ограничиваются двумя полями, то проще применять сериализацию формы. Сериализация производится посредством метода
и в качестве результата создает объект javascript, где свойствам соответствуют поля формы. И значения хранят эти свойства те же,
что имеют соответственные поля формы.
Итак, применим сеиализацию формы:
<form action="ajax.php" id="loginForm"> <input type="text" name="login" placeholder="Логин" /><br><br> <input type="text" name="password" placeholder="Пароль" /><br><br> <input type="submit" value="Войти" /> </form> <div id="result"></div> <script type="text/javascript"> $("#loginForm").submit(function(event) { // Предотвращаем обычную отправку формы event.preventDefault(); $.post('ajax.php', $("#loginForm").serialize(), function(data) { $('#result').html(data); }); }); </script>
В отличие от предыдущего примера у нас здесь два отличия
Во-первых, обратите внимание, что поля для ввода имеют атрибут. При указании параметра мы производим
сериализацию данных формы через метод :
В данном методе в тело запроса
передаются параметры. Причем имена параметров — это значения атрибутов name полей ввода. А значения параметров — соответственно введенные значения в текстовые поля.
И поэтому с помощью php мы можем извлечь эти значения: .
НазадВперед
Методы 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