Post и Get запросы, какая между ними разница и что лучше и для каких целей? — Хабр Q&A
Общего между ними то что они работают одинаково. Разницы между ними технически никакой. А вот идеологические различия есть.
Я расскажу о них в контексте PHP. Прошу заметить что протокол HTTP к PHP имеет косвенное отношение потому что он создавался для обмена html страницами а PHP просто расширяет возможности и того и другого.
GET запрос используется чтобы получить данные а POST чтобы отправить. (Напоминаю что технически они работают одинаково).
Поэтому в контексте PHP опираясь на эту идеологию сделали следующим образом:
1. При каждом запуске PHP по умолчанию создаются суперглобальные массивы ($_GET, $_POST).
2. Если в строке запроса есть вопросительный знак(?). То все что после него считается параметрами GET запроса они представлены в формате ‘ключ’=’значение’ и в качестве разделителя используется знак амперсанда (&)
Пример:GET /index. php?name=Андрей&surname=Галкин
это строка запроса, тут 2 параметра. эти параметры попадут в массив $_GET.
3. $_POST заполняется другим способом. содержимое этого массива заполняется из «заголовков запроса». То есть из места, скрытого от глаз в явном виде. Всю рутину по созданию таких заголовков берет на себя браузер. Хотя иногда и что-то редактируется в заголовках в ручную.
Чаще всего пост запрос используется в формах (для отправки данных).
Например у нас есть форма для входа 2 поля логин и пароль.
Представим что мы используем GET метод. Тогда при отправке формы мы перейдем на следующий адрес /login.php?login=Андрей&password=123
согласитесь что так передавать такую информацию совсем не безопасно. Любой может открыть ваш браузер и начиная вводить адрес сайта он из истории может увидеть ваши пароли и логины.
А вот если бы мы указали методом POST то мы бы получили следующий запрос: POST /login.php (login=Андрей&password=123)
то что в скобочках было бы скрыто и никак не сохранено в браузере.
Теперь другая ситуация например форма поиска. Мы вводим текст и получаем страницу с результатами. Вот тут уместнее GET форма. потому что нам было бы удобно сразу иметь ссылку на результат поиска, то есть добавить в строку запроса можно выразится «Публичные параметры», которыми можно поделиться. И как результат в строке браузера будет конкретная ссылка на текущую страницу. Мы можем ее скопировать, и разместить где-нибудь, или например скинуть другу. И получить при переходе одну и ту же страницу. А не просить других людей зайти на сайт и в поиск вбить определенную фразу чтобы получить необходимую страницу.
В общем подводя итог:
GET — это чтобы получить определенную страницу в определенном виде ( сортировка, текущая страница в блоге, строка поиска и т.п. ).
POST — для оправки данных которые не влияют на отображение страницы, в том плане что эти данные влияют только на результат выполнения скрипта ( логины, пароли, номера кредиток, сообщения и т.п. ).
И еще одна хорошая новость их можно комбинировать, например
POST /index. php?page=login (login=Андрей&password=123) Думаю я уже достаточно объяснил что из этого получится и какие параметры в какой массив попадут.
GET и POST запросы c модулем requests в Python.
Передача параметров в URL для HTTP GET-запросов.
Часто в строке запроса URL-адреса, необходимо отправить какие-то данные. При составлении URL-адреса вручную, эти данные задаются в виде пар ключ/значение в конце URL-адреса после вопросительного знака, например httpbin.org/get?key=val
. Модуль requests
позволяет передавать эти параметры в метод requests.get()
виде словаря строк, используя ключевой аргумент
. Например, если надо передать key1=value1
и key2=value2
для GET запроса к URL-адресу httpbin.org/get
, то используйте следующий код:
>>> 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
Обратите внимание
None
, не будет добавлен в строку запроса 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-запросах встает необходимость отправить некоторые закодированные в форме данные. Для этого необходимо передать словарь в аргумент
метода requests. post()
. Словарь с данными формы будет автоматически закодирован.
Обратите внимание, что имя аргумента для передачи параметров метода requests.post()
, отличается от имени аргумента дополнительных параметров метода requests.get()
.
>>> 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" # }, # ... # }
Аргумент data
также может иметь несколько значений для каждого ключа. Это можно сделать, передав данные либо списком кортежей, либо словарем со списками в качестве значений. Это особенно полезно, когда форма содержит несколько элементов, использующих один и тот же ключ:
>>> import requests >>> param_tuples = [('key1', 'value1'), ('key1', 'value2')] >>> 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": [ # "value1", # "value2" # ] # }, # ... # } >>> resp1.text == resp2.text # True
Как отправить POST с запросами Python?
Попробуйте ScrapingBee бесплатно
Ян Вуттен | 05 июля 2021 г. | 5 мин чтения
Оглавление
Запрос POST — это особый тип метода HTTP, используемый при отправке данных службам в Интернете. Мы используем их на веб-сайтах, которые используют формы — когда мы входим в систему, когда отправляем сообщения или размещаем изображения. Приложения также используют POST-запросы для взаимодействия с другими службами для отправки данных, при этом JSON является распространенным форматом данных для обмена.
Библиотека Requests
— одна из самых популярных клиентских библиотек HTTP для Python. В настоящее время у него более 45 тысяч звезд на Github, а количество загрузок на PyPI составляет 115 миллионов в месяц! Это делает отправку POST-запросов намного проще программно, чем отправку данных через безголовый браузер. В безголовом браузере нам нужно было бы писать сценарии для перехода на сайт, перемещения между полями, заполнения каждого из них нужными данными, прежде чем, наконец, отправить данные. Отправляя запрос POST, мы сразу переходим к последнему шагу отправки. Запросы также представляют собой намного меньшую библиотеку, чем браузер, что обеспечивает лучшую производительность и использование памяти.
В этой статье мы расскажем, как создать POST-запрос с помощью Requests и как это может сделать этот процесс намного проще для нас.
Создание запроса JSON POST с запросами
- 1. Установите метод запроса на POST
- 2. Установите данные POST
- 3. Установите заголовки POST
- 4. Данные POST JSON
В качестве примера давайте начнем с сложного построения запроса JSON POST. Не волнуйтесь, запросы упростят нам это позже! Мы используем службу httpbin.org, которая возвращает ответ JSON с подробным описанием отправленного контента.
1. Установите метод запроса на POST
Запросы имеют действительно простой дизайн, основанный на HTTP-глаголе, что означает, что для получения ответа мы вызываем его метод .post(), передавая наш URI в качестве аргумента. Он также предоставляет аналогичные методы для запросов GET, PUT и PATCH.
запросов на импорт г = запросы.пост("https://httpbin.org/пост")
2. Установите данные POST
Чтобы действительно отправить некоторые данные, мы предоставляем аргумент данных. По умолчанию данные отправляются в виде HTML-формы, которую мы получили бы, отправив любую форму в Интернете. Запросы задают тип содержимого «application/x-www-form-urlencoded», поэтому нет необходимости устанавливать какие-либо заголовки.
запросов на импорт импортировать json r = запросы.post("https://httpbin.org/post", данные = {"ключ": "значение"}, )
Изучив ответ службы httpbin.org, мы можем увидеть, что было отправлено в качестве данных формы с помощью ключа «form».
>>> р.текст '{\n "аргументы": {}, \n "данные": "", \n "файлы": {}, \n "форма": {\n "ключ": "значение"\n}, \ n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "9", \n "Content-Type ": "application/x-www-form-urlencoded", \n "Хост": "httpbin.org", \n "User-Agent": "python-requests/2.25.1", \n "X-Amzn -Trace-Id": "Корень=1-60df1a04-0384d3ce7d9ac00b5855064b"\n }, \n "json": null, \n "origin": "**.***.**.***", \n "url": "https://httpbin.org /пост"\n}\n'
Если мы хотим отправить JSON, мы можем предоставить строку в формате JSON. В нашем примере мы используем модуль json
для преобразования словаря в форматированную строку JSON, готовую к отправке.
запросов на импорт импортировать json r = запросы.post("https://httpbin.org/post", данные = json.dumps({"ключ": "значение"}), )
Наш пример JSON не будет работать так, как сейчас. Со многими службами мы, вероятно, получим код состояния HTTP 400 (Bad Request). Чтобы предотвратить это, нам также нужно сообщить службе, которую мы вызываем, что наши данные в формате JSON, чтобы их можно было правильно обработать. Для этого мы устанавливаем «Content-Type» в «application/json» в заголовках запроса:
запросов на импорт импортировать json г = запросы.пост( "https://httpbin.org/post", данные = json.dumps({"ключ": "значение"}), заголовки = {"Content-Type": "application/json"}, )
4. Данные POST JSON
Если вы думаете, что наши примеры JSON выглядят немного сложными, вы совершенно правы. Запросы позволяют очень легко свести все это к гораздо более простому вызову. Мы можем просто предоставить аргумент «json» с нашими данными. Запросы будут правильно устанавливать наши заголовки и автоматически кодировать форматированную строку JSON для нас.
запросов на импорт r = request.post('https://httpbin.org/post', json={'ключ':'значение'})
Чтение ответов JSON
Изучив ответ нашего сервиса, мы видим, что возвращаемые данные также представляют собой строку в формате JSON. Это всего лишь текст, поэтому нам нужно будет проанализировать его самостоятельно, чтобы использовать в нашем скрипте Python.
>>> р.текст '{\n "аргументы": {}, \n "данные": "{\\"ключ\\": \\"значение\\"}", \n "файлы": {}, \n "форма ": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "16", \n «Тип контента»: «application/json», \n «Хост»: «httpbin.org», \n «Агент пользователя»: «python-requests/2.25.1», \n «X-Amzn -Trace-Id": "Root=1-60df0aaa-3105fc35436042571335fa22"\n }, \n "json": {\n "key": "value"\n }, \n "origin": "**.* **. **.***", \n "url": "https://httpbin.org/post"\n}\n'
В качестве альтернативы, если мы хотим получить доступ к ответу как к объекту JSON, мы также можем использовать запросы, встроенные в декодер JSON, вызвав .json() для объекта ответа.
>>> r.json() {'аргументы': {}, 'данные': '{"ключ": "значение"}', 'файлы': {}, 'форма': {}, 'заголовки': {'Принять': '*/ *», «Accept-Encoding»: «gzip, deflate», «Content-Length»: «16», «Content-Type»: «application/json», «Host»: «httpbin.org», «User- Агент': 'python-requests/2.25.1', 'X-Amzn-Trace-Id': 'Root=1-60deee08-4e9c76b6457826d5001b76fa'}, 'json': {'key': 'value'}, 'origin ': '**.***.**.***', 'url': 'http://httpbin.org/post'}
Выполнение запросов POST в сеансе
В качестве последнего примера давайте войдем в Hacker News с помощью запросов и отправим некоторые данные формы для входа в сочетании с объектом Requests.Session()
. Любые файлы cookie, которые мы получаем, будут храниться в объекте и будут повторно использоваться в последующих вызовах сеанса . get().
В нашем примере мы будем искать текст ответа на странице новостей, чтобы подтвердить, показана ли нам ссылка выхода, указывающая, что мы обслуживаем страницу входа в систему.
запросов на импорт сеанс = запросы.Сеанс() r = session.post("https://news.ycombinator.com/login", data={ "acct": "имя пользователя", "pw": "***ничего не скажу***" }) r = session.get("https://news.ycombinator.com/news") logout_pos = r.text.find("выход") print(r.text[logout_pos-20:logout_pos+20]) # ЗаключениеВы видели, насколько простыми становятся Requests для публикации данных на сайтах или в службах и как мы можем сократить большую часть общего кода в наших приложениях, используя его. Этот простой дизайн, безусловно, способствовал его успеху в сообществе Python, сделав его фаворитом среди разработчиков. Прежде чем вы доберетесь до полноценного безголового браузера для отправки ваших данных, вам обязательно следует подумать об использовании запросов.
Вам часто понадобятся прокси-серверы для ваших проектов веб-скрапинга, не стесняйтесь прочитать эту статью о том, как использовать прокси-серверы с запросами Python.
Ян Вуттен
Ян — внештатный разработчик со страстью к простым решениям. Он написал код для проведения опросов, студийных пайплайнов и имеет докторскую степень в области распределенных вычислений.
Попробуйте ScrapingBee бесплатно
Объяснение запроса POST• datagy
В этом руководстве вы узнаете, как использовать функцию POST библиотеки запросов Python для отправки данных через HTTP . Библиотека запросов Python абстрагируется от сложностей выполнения HTTP-запросов. Функция
request.post()
позволяет размещать данные на веб-ресурсе.К концу этого руководства вы узнаете:
- Как работает функция публикации запросов Python
- Как настроить функцию публикации запросов Python с помощью заголовков
- Как использовать объекты ответа Python при работе с функцией отправки
Содержание
Понимание функции POST запросов Python
Запрос HTTP
POST
используется для отправки данных на сервер, где данные совместно используются через тело запроса. В функцииrequest.post()
данные отправляются с параметромdata
, который принимает словарь, список кортежей, байтов или файловый объект.Давайте посмотрим, как выглядит функция request.post() в Python:
# Понимание функции request.post() запросы на импорт запросы.пост( URL, данные = нет, json = нет, **кваргс )Мы видим, что функция принимает три параметра:
url
, который определяет URL-адрес для публикации наdata
, который принимает словарь, список кортежей, бутов или файлоподобный объект для отправки в теле запросаjson
, который представляет данные json для отправки в теле запросаКроме того, функция принимает ряд различных аргументов ключевого слова, унаследованных от функции
request. request()
. Эти ключевые аргументы могут быть переданы напрямую и описаны в таблице ниже:
Параметр | Описание | Значение по умолчанию |
---|---|---|
3 allow_redirects не разрешать перенаправление | Истина | |
auth | Кортеж для включения защищенной аутентификации HTTP | Нет |
сертификат | 19 0168 Нет | |
печенье | Словарь файлов cookie для отправки на указанный URL-адрес | Нет |
заголовков | Словарь HTTP-заголовков для отправки | Нет |
прокси | Словарь протокола прокси URL | Нет | Логический индикатор для определения необходимости загрузки ответа (когда установлено значение False ) или потоковое (если установлено значение True ) | False |
тайм-аут | число секунд, необходимое для ожидания отправки соединения клиентом ответ. Значение по умолчанию Нет означает, что запрос будет ждать бесконечно долго. | Нет |
Verify | Логическое или строковое указание для проверки сертификата TLS сервера в функции request.post() В следующем разделе вы узнаете, как сделать запрос Создание запроса POST на Python В этом разделе вы узнаете, как сделать запрос HTTP Давайте создадим наш первый запрос # Создание запроса POST с помощью request.post запросы на импорт resp = request.post('https://httpbin.org/post') печать (соотв.) # Возвращает: # <Ответ [200]> В приведенном выше примере мы просто передаем URL-адрес конечной точки Мы можем передавать данные в запрос, используя параметр # Передача данных в наш POST-запрос запросы на импорт resp = request.post('https://httpbin.org/post', data={'веб-сайт': 'datagy.io'}) печать (соотв.) # Возвращает: # <Ответ [200]> В следующем разделе вы узнаете, как понять, как работают эти объекты Понимание объекта ответа запросов Python В предыдущем разделе вы узнали, как создать свой первый запрос HTTP Мы можем увидеть, был ли запрос успешно выполнен, проверив либо 9Свойство 0013 .status_code или свойство # Проверка статуса запроса запросы на импорт resp = request. post('https://httpbin.org/post', data={'веб-сайт': 'datagy.io'}) печать (соответственно ок) печать (соотв. код_статуса) # Возвращает: # Истинный # 200 Анализируя приведенный выше код, мы видим, что запрос был выполнен успешно. Теперь посмотрим, что возвращает запрос, проанализировав свойство # Анализ текста запроса запросы на импорт resp = request.post('https://httpbin.org/post', data={'веб-сайт': 'datagy.io'}) печать (соответственно текст) # Возвращает: # { # "аргументы": {}, # "данные": "", # "файлы": {}, # "форма": { # "веб-сайт": "datagy.io" # }, # "заголовки": { # "Принимать": "*/*", # "Accept-Encoding": "gzip, deflate, br", # "Длина контента": "17", # "Content-Type": "application/x-www-form-urlencoded", # "Хост": "httpbin.org", # "User-Agent": "python-requests/2.27.1", # "X-Amzn-Trace-Id": "" # }, # "json": ноль, # "источник": "", # "url": "https://httpbin.org/post" # } Из этого мы видим, что запрос был передан как тип Передача заголовков в функцию POST запросов Python Параметр # Указание типа содержимого POST-запроса запросы на импорт импортировать json соотв = запросы.пост( 'https://httpbin.org/post', data=json.dumps({'веб-сайт': 'datagy.io'}), заголовки = {"Content-Type": "application/json"}) печать (соотв.) # Возвращает: Давайте разберем то, что мы сделали выше:
При работе с данными JSON это может показаться немного сложным. Из-за того, как часто вы будете передавать данные JSON в запрос, библиотека Отправка данных JSON с запросами Python Из-за того, как часто вам может понадобиться передавать данные JSON в запрос POST, Python справляется с этим довольно легко. Вместо передачи данных в Давайте посмотрим, как мы можем отправлять данные JSON с помощью функции # Отправка данных JSON с помощью функции json.post() запросы на импорт импортировать json соотв = запросы.пост( 'https://httpbin.org/post', json={'веб-сайт': 'datagy.io'}, ) печать (соотв.) # Возвращает: В приведенном выше вызове функции мы передали словарь в параметр json=, что позволило функции преобразовать его в объект JSON. |