Отправка POST-запроса на API REST | Руководство по REST API

Используйте POST-запрос HTTP для отправки одного или нескольких запросов RPC на REST API. Для настройки устройства можно использовать POST-запрос.

Для одной rpc команды общий формат оконечных точек:

scheme://device-name:port/rpc/method[@attributes]/params

  • scheme: http или https

  • method: Имя любой rpc Junos OS. Имя method идентично элементу tag. Дополнительные сведения см. в Junos протоколе XML, обработке инструкций и тегов ответа в руководстве по разработчику протокола управления XML Junos xML и справочнике разработчика Junos XML API.

  • params: Необязательные значения параметров name[=value] ().

Для аутентификации запроса отправьте имя пользователя и пароль, закодированный базой 64, в задатке авторизации:

curl -u "username:password" http://device-name:port/rpc/get-interface-information

Чтобы указать данные в качестве строки запроса в URI для POST-запросов, отправьте данные запроса rpc на теле POST. В таких случаях можно указать Content-Type как или , как text/plain application/xml показано в этих эквивалентных вызовах cURL:

curl -u "username:password" http://device-name:port/rpc/get-interface-information --header "Content-Type: text/plain" –d "interface-name=cbp0"
curl -u "username:password" http://device-name:port/rpc/get-interface-information --header "Content-Type: application/xml" –d "<interface-name>cbp0</interface-name>"

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

Например, следующий вызов cURL определяет формат вывода JSON:

curl -u "username:password" http://device-name:port/rpc -d <get-software-information /> –header "Accept: application/json"

Можно также указать формат вывода с использованием дополнительного format атрибута:

curl -u "username:password" http://device-name:port/rpc -d "<get-software-information  format=application/json'/>"

Примечание.

По умолчанию для POST-запросов, содержащих аргументы в теле, по умолчанию задается application/xml. Если необходимо использовать любое другое содержимое, например строку запроса, можно указать тип содержимого ( текст/неявный). Укажите format атрибут в командах настройки.

При выполнении нескольких команд в одном запросе rpc общий формат конечной точки:

scheme://device-name:port/rpc

RPC должны быть предоставлены в качестве XML-данных в теле POST. Тип содержимого для ответа является многопартийным/смешанным, при этом граница и подтип связаны с выходными данными каждого выполнения RPC. Формат, указанный в заглавном сообщении «Accept», используется в качестве формата выходных данных для каждого из RPC при утере

format атрибута. Если в RPC не указан задавитель Accept и в указанном RPC не указан ни один атрибут, формат вывода по умолчанию format — XML. Например, отправить один HTTP-запрос для выполнения RPC и get-software-information get-interface-information отправить POST-запрос /rpc с "Auth: Basic <base64hash>" .
"Content-Type: application/xml" Тело POST будет содержать:

<get-software-information/><get-interface-information/>

Ниже находится вызов cURL с использованием этого тела POST:

curl -u "username:password" http://device-name:port/rpc -d "<get-software-information/><get-interface-information/>"

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

HTTP/1.1 200 OK
Content-Type: multipart/mixed; boundary=fkj49sn38dcn3
Transfer-Encoding: chunked
Date: Thu, 20 Mar 2014 11:01:27 GMT
Server: lighttpd/1.4.32
--fkj49sn38dcn3
Content-Type: application/xml
<software-information>
<host-name>...</host-name>
...
</software-information>
--fkj49sn38dcn3
Content-Type: application/xml
<interface-information>
<physical-interface>...</physical-interface>
</interface-information>
--fkj49sn38dcn3--

Также можно указать формат выходных данных для каждого элемента в теле POST. Например, следующий запрос излучает JSON для RPC и обычный текст get-interface-information для get-software-information RPC:

curl -u "username:password" http://device-name:port/rpc 
-d "<get-interface-information/><get-software-information format='text/plain'/>" 
—header "Accept: application/json"

При выполнении нескольких RPC в случае возникновения ошибки по умолчанию игнорируется ошибка и продолжается выполнение. Если необходимо выйти из URI при первой ошибке, stop-on-error укажите флаг в URI. Например, при столкновении с ошибкой устройство настраивается и завершается следующим запросом:

curl -u "username:password" http://device-name:port/rpc?stop-on-error=1 
-d "<lock-configuration/>
  <load-configuration>
    <configuration><system><hostname>foo</hostname></system></configuration>
  </load-configuration>
  <commit/>
   <unlock-configuration/>" 

python — Как отправить POST запрос с параметрами?

Вопрос задан

Изменён 1 год 9 месяцев назад

Просмотрен 416 раз

Хочу спарсить ссылки на гугл миты из сайта своего универа.

Как отправить POST запрос на страницу?

Нужно ввести группу, в моем случае «КІ-19-1», и в ответ получить HTML код с расписанием.

Дальше я уже справлюсь с BS4.

Что-то пробовал написать, но в ответ нет ответа от формы:

import requests
import fake_useragent
link = "https://dekanat.nung.edu.ua/cgi-bin/timetable.cgi/post"
pload = {'group':'КІ-19-1'}
user_agent = {
    "User_Agent":fake_useragent.UserAgent().random
}
r = requests.post(link,params=pload,headers = user_agent)
print(r.text)
  • python
  • парсер
  • post
  • form
  • requests

2

Адрес, с которого приходят данные, немного отличается. Попробуйте:

import requests
from bs4 import BeautifulSoup
url = 'https://dekanat.nung.edu.ua/cgi-bin/timetable.cgi?n=700'
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.
212 Safari/537.36'} payload = { 'faculty': '0', 'teacher': '', 'group': 'ʲ-19-1', 'sdate': '', 'edate': '' , 'n': '700' } r = requests.post(url, headers=headers, data=payload) soup = BeautifulSoup(r.content, 'html.parser')

таблицы в супе:

tables = soup.find_all('div', class_='col-md-6')
for table in tables[1:]:
    print(table.find('h5').text)

выведет:

04.06.2021 П'ятниця
07.06.2021 Понеділок
08.06.2021 Вівторок
09.06.2021 Середа
11.06.2021 П'ятниця

попробуйте искать ссылки как-то так:

table.find('a')['href']

UPD обратите внимание: ваша группа передается как 'group': 'ʲ-19-1', а не ‘КІ-19-1’ (пока не выяснил связи, но — как есть)

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

urllib — Как отправить запрос POST?

спросил

10 лет, 8 месяцев назад

Изменено 7 месяцев назад

Просмотрено 841 тысяч раз

Я нашел этот скрипт в Интернете:

 import httplib, urllib
params = urllib. urlencode({'номер': 12524, 'тип': 'проблема', 'действие': 'показать'})
заголовки = {"Content-type": "application/x-www-form-urlencoded",
            "Принять": "текст/обычный"}
conn = httplib.HTTPConnection("bugs.python.org")
conn.request("POST", "", параметры, заголовки)
ответ = conn.getresponse()
вывести response.status, response.reason
302 найдено
данные = ответ.чтение()
данные
'Перенаправление на http://bugs.python.org/issue12524'
соединение.закрыть()
 

Но я не понимаю, как использовать его с PHP или что такое все внутри переменной params или как ее использовать. Могу ли я немного помочь с попыткой заставить это работать?

  • urllib
  • python-2.x
  • httplib

5

Если вы действительно хотите работать с HTTP с помощью Python, я настоятельно рекомендую Requests: HTTP for Humans. Быстрый запуск POST, адаптированный к вашему вопросу:

 >>> запросы на импорт
>>> r = request. post("http://bugs.python.org", data={'number': '12524', 'type': 'issue', 'action': 'show'})
>>> print(r.status_code, r.reason)
200 ОК
>>> print(r.text[:300] + '...')


<голова>
<название>
Ошибка 12524: пример изменения httplib docs POST — трекер Python

 6

Это решение без каких-либо внешних pip-зависимостей, но работает только в Python 3+ (Python 2 не будет работать):

 из urllib.parse import urlencode
из запроса импорта urllib.request, urlopen
url = 'https://httpbin.org/post' # Установите целевой URL здесь
post_fields = {'foo': 'bar'} # Установите поля POST здесь
запрос = Запрос (url, urlencode (post_fields).encode())
json = urlopen(запрос).read().decode()
печать (json)
 

Пример вывода:

 {
  "аргументы": {},
  "данные": "",
  "файлы": {},
  "форма": {
    "фу": "бар"
  },
  "заголовки": {
    "Accept-Encoding": "личность",
    "Длина содержания": "7",
    "Content-Type": "application/x-www-form-urlencoded",
    «Хост»: «httpbin. org»,
    «Агент пользователя»: «Python-urllib/3.3»
  },
  "json": ноль,
  "происхождение": "127.0.0.1",
  "url": "https://httpbin.org/post"
}
 

0

Вы не можете выполнять запросы POST, используя urllib (только для GET), вместо этого попробуйте использовать модуль запросов , например:

Пример 1.0:

 запросы на импорт
base_url="www.server.com"
final_url="/{0}/friendly/{1}/url".format(base_url,любое_значение_здесь)
полезная нагрузка = {'число': 2, 'значение': 1}
ответ = запросы.сообщение (final_url, данные = полезная нагрузка)
печать(ответ.текст) #ТЕКСТ/HTML
print(response.status_code, response.reason) #HTTP
 

Пример 1.2:

 >>> запросы на импорт
>>> полезная нагрузка = {'key1': 'value1', 'key2': 'value2'}
>>> r = request.post("http://httpbin.org/post", data=payload)
>>> печать (р.текст)
{
  ...
  "форма": {
    "ключ2": "значение2",
    "ключ1": "значение1"
  },
  . ..
}
 

Пример 1.3:

 >>> импорт json
>>> url = 'https://api.github.com/some/endpoint'
>>> полезная нагрузка = {'некоторые': 'данные'}
>>> r = request.post(url, data=json.dumps(полезная нагрузка))
 

2

Используйте библиотеку запросов для GET, POST, PUT или DELETE, нажав конечную точку REST API. Передайте оставшийся URL-адрес конечной точки API в url , полезную нагрузку (dict) в данных и заголовок/метаданные в заголовков

 запросы на импорт, json
URL-адрес = "bugs.python.org"
полезная нагрузка = {"число": 12524,
           "тип": "выпуск",
           "действие": "показать"}
header = {"Content-type": "application/x-www-form-urlencoded",
          "Принять": "текст/обычный"}
response_decoded_json = request.post (url, данные = полезная нагрузка, заголовки = заголовок)
response_json = response_decoded_json.json()
 
печать (ответ_json)
 

3

Ваш словарь данных содержит имена полей ввода формы, вы просто держите их значения, чтобы найти результаты. представление формы Заголовок настраивает браузер для получения типа данных, которые вы объявляете. С библиотекой запросов легко отправить POST:

 запросы на импорт
URL-адрес = "https://bugs.python.org"
data = {'@number': 12524, '@type': 'issue', '@action': 'show'}
заголовки = {"Content-type": "application/x-www-form-urlencoded", "Accept":"text/plain"}
ответ = запросы. сообщение (url, данные = данные, заголовки = заголовки)
печать (ответ.текст)
 

Подробнее об объекте запроса: https://requests.readthedocs.io/en/master/api/

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

 urllib2.urlopen(url, тело)
 

См. документацию для urllib2 здесь: https://docs.python.org/2/library/urllib2.html.

Вы можете использовать библиотеку запросов, чтобы сделать почтовый запрос. Если у вас есть строка JSON в полезной нагрузке, вы можете использовать json. dumps(payload), которая является ожидаемой формой полезной нагрузки.

    импортировать запросы, json
    URL-адрес = "http://bugs.python.org/test"
    полезная нагрузка={
        «данные1»: 1234, «данные2»: «тест»
    }
    заголовки = {
        «Тип контента»: «приложение/json»
    }
    ответ = запросы. сообщение (url, заголовки = заголовки, данные = json.dumps (полезная нагрузка))
    печать (ответ.текст, ответ.status_code)
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Сделать запрос POST с помощью cURL

cURL (curl) — это инструмент командной строки с открытым исходным кодом, используемый для передачи данных по сети. POST — это метод HTTP-запроса, который используется для отправки данных на сервер. (Подробнее о запросах POST читайте здесь.)

Формат POST-запроса с помощью curl: [.inline-code]curl -X POST [options] [URL][.inline-code].

Пример запроса POST для отправки задачи списка дел в REST API может выглядеть так:

 curl -H 'Content-Type: application/json' \
      -d '{ "название": "foo", "body": "bar", "id": 1}' \
      -X ПОСТ \
      https://example.com/posts
 

Здесь представлены три варианта:

  • [.inline-code]-X[.inline-code] использовался для предоставления метода HTTP, который мы используем для отправки запроса. В данном случае метод POST
  • [.inline-code]-d[.inline-code] использовался для предоставления связанных данных в теле HTTP-запроса
  • [.inline-code]-H[.inline-code] использовался для указания заголовки для запроса

С каждым из этих параметров также связаны псевдонимы. Например, для [.inline-code]-X[. inline-code] вместо этого можно указать [.inline-code]—request[.inline-code], а для [.inline-code]-H[. встроенный код] вы можете предоставить [.inline-code]—headers[.inline-code].

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

[#common-operations]Общие операции запроса POST[#common-operations]

[#sending-form-data]Отправка данных формы[#sending-form-data]

Существует два распространенных способа отправки данных формы с запросами POST, каждый из которых имеет разные типы контента, как показано ниже:

 # multipart/form-data
## Текстовое поле
curl -H "Тип контента: multipart/form-data" \
     -F название=foo \
     -F тело=бар \
     -Ф \
     -X ПОСТ \
     https://example.com/posts
## Загрузка изображения
curl -H "Тип контента: multipart/form-data" \
     -F профиль[email protected] \
     https://example.com/avatar.cgi
# приложение/x-www-form-urlencoded
curl -H "Тип контента: application/x-www-form-urlencoded" \
     -d "название=foo" \
     -d "тело=бар" \
     -d "идентификатор = 1" \
     -X ПОСТ \
     https://example. com/posts
 

Как видно из изображения, чтобы использовать тип содержимого multipart/form-data , мы отправляем данные с [.inline-code]-F[.inline-code] (или [.inline-code] —form[.inline-code]). Чтобы использовать тип контента application/x-www-form-urlencoded , мы используем [.inline-code]-d[.inline-code] (или [.inline-code]—data[.inline-code ]) вариант.

Вообще говоря, multipart/form-data чаще используется для отправки двоичных данных, таких как изображения, а application/x-www-form-urlencoded используется для отправки текстовых данных.

По умолчанию HTML-формы отправляют данные с использованием типа содержимого application/x-www-form-urlencoded при отправке.

[#sending-image-data]Отправка данных изображения[#sending-image-data]

Чтобы отправить данные изображения в запросе POST, включите изображение в данные формы, указав перед именем файла префикс [.inline-code ]@[.inline-code] следующий символ:

 curl -F profile=@avatar. jpg \
     https://example.com/avatar.cgi
 

Символ @ заставляет содержимую формы быть файлом, который затем загружается на сервер.

В качестве альтернативы мы могли бы закодировать изображение в base64 и отправить его как поле в поле формы или поле тела JSON вашего запроса, но это гораздо менее удобно:

 curl -H 'Content-Type: application/json' \
     -d '{"изображение": "'"$(base64 ~/avatar.jpg)"'"}' \
     -X ПОСТ \
     https://example.com/avatar.cgi
 

[#common-gotchas]Общие ошибки[#common-gotchas]

  • Имена аргументов чувствительны к регистру. Например, [.inline-code]-F[.inline-code] соответствует аргументу для данных формы, а [.inline-code]-f[.inline-code] — это флаг, указывающий, хотим ли мы быстро выйти из строя без вывода
  • При передаче содержимого типа application/json обязательно заключайте тело JSON в одинарные кавычки, например [.inline-code]-d «{ «title»:»foo» }»[.inline-code] будет недействительным
  • Вы можете использовать линии перехода, только если вы включаете [.