HTTP-запросы в R
Цели
После прохождения этой лабораторной работы вы сможете:
- Понимание HTTP
- Обработка HTTP-запросов и ответов с помощью R
Оглавление
- Обзор HTTP
- Библиотека httr
Обзор HTTP
Когда клиент использует веб-страницу, ваш браузер отправляет HTTP-запрос на сервер, на котором размещена страница. Сервер пытается найти нужный ресурс, например домашнюю страницу (index.html).
Если ваш запрос выполнен успешно, сервер отправит ресурс клиенту в ответе HTTP; сюда входит такая информация, как тип ресурса, длина ресурса и другая информация.
На рисунке ниже показан процесс; кружок слева представляет клиент, кружок справа представляет веб-сервер. Таблица под веб-сервером представляет собой список ресурсов, хранящихся на веб-сервере. В данном случае это HTML
файл, png
изображение и txt
файл.
Протокол HTTP позволяет отправлять и получать информацию через Интернет, включая веб-страницы, изображения и другие веб-ресурсы.
Единый указатель ресурсов: URL
Единый указатель ресурсов (URL) — самый популярный способ поиска ресурсов в Интернете. Мы можем разбить URL-адрес на четыре части.
- схема вот этот протокол, для этой лабы всегда будет
http://
- Интернет-адрес или базовый URL-адрес, который будет использоваться для поиска местоположения, вот несколько примеров:
www.ibm.com
иwww.gitlab.com
- местоположение маршрута на веб-сервере, например:
/images/IDSNlogo.png
- Параметры параметров URL, включенные в URL, например:
?userid=1
Вы также можете здесь использовать термин универсальный идентификатор ресурса (URI), URL-адреса на самом деле являются подмножеством URI. Другой популярный термин — конечная точка, это URL-адрес операции, предоставляемый веб-сервером.
Запрос
Процесс может быть разбит на процесс запроса и ответа.
Запрос с использованием метода get частично показан ниже. В стартовой строке у нас метод GET
, это метод HTTP
. Также расположение ресурса /index.html
и версия HTTP
.
Заголовок запроса передает дополнительную информацию с запросом HTTP
:
Когда делается запрос HTTP
, отправляется метод HTTP
, который сообщает серверу, какое действие выполнить.
Список нескольких HTTP
методов показан ниже.
Ответ
На рисунке ниже представлен ответ; Строка начала ответа содержит номер версии HTTP/1.0
, код состояния (200), означающий успех, за которым следует описательная фраза (ОК).
Заголовок ответа содержит полезную метаинформацию.
Наконец, у нас есть тело ответа, содержащее запрошенный файл an HTML
document. Следует отметить, что некоторые запросы имеют заголовки.
Некоторые примеры кодов состояния показаны в таблице ниже, префикс указывает на класс; они показаны желтым цветом, а фактические коды состояния показаны белым. Проверьте следующую ссылку для получения дополнительных описаний.
Библиотека httr
httr
— это библиотека R, которая позволяет создавать и отправлять запросы HTTP
, а также легко обрабатывать запросы HTTP
. Мы можем импортировать пакет следующим образом (импорт может занять меньше минуты):
library(httr)
Вы можете сделать GET
запрос методом get
на www.ibm.com:
url<-'https://www.ibm.com/' response<-GET(url) response Response [https://www.ibm.com/us-en/?ar=1] Date: 2022-12-22 15:23 Status: 200 Content-Type: text/html Size: 75.6 kB <!DOCTYPE html><html lang="en-US"><head><meta name="viewport" content="width=... window.hj=window.hj||function(){(hj.q=hj.q||[]).push(arguments)}; window.hj('tagRecording', ['hjLoaded']); document.addEventListener('onMegaMenuToggle', e => { if(e.target.getAttribute("data-title") == 'products-solutions') { window.hj('trigger', 'MM_products-solutions'); } if(e.target.getAttribute("data-title") == 'services-consulting') { window.hj('trigger', 'MM_services-consulting'); } ...
У нас есть объект ответа response
, он содержит информацию об ответе, например статус запроса. Мы можем просмотреть код состояния, используя атрибут status
response$status
Вы также можете проверить заголовки ответа
response_headers <- headers(response) response_headers
Дату отправки запроса мы можем получить по ключу Date
response_headers['date'] $date = 'Thu, 22 Dec 2022 15:23:47 GMT'
Content-Type
указывает тип данных:
response_headers['content-type'] $`content-type` = 'text/html'
Чтобы получить исходный запрос, вы можете просмотреть его через объект ответа:
[8]:
response$request$headers Accept: 'application/json, text/xml, application/xml, */*'
Теперь давайте получим содержимое HTTP-ответа.
content(response) No encoding supplied: defaulting to UTF-8. {html_document} <html lang="en-US"> [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ... [2] <body>\n<div id="__next">\n<div><div class="bx--dotcom-shell">\n<main cla ...
которая является домашней страницей IBM (на самом деле HTML-страницей, которую вы изучите позже в этом курсе)
Вы можете загружать другие типы данных для нетекстовых запросов, таких как изображения, рассмотрите URL-адрес следующего изображения:
image_url<-'https://gitlab.com/ibm/skills-network/courses/placeholder101/-/raw/master/labs/module%201/images/IDSNlogo.png'
Мы можем сделать запрос на получение:
image_response<-GET(image_url)
Мы можем посмотреть заголовок ответа:
image_headers <- headers(image_response)
Мы можем видеть 'Content-Type'
, это изображение
image_headers['content-type'] $`content-type` = 'text/html; charset=utf-8'
Изображение — это ответный объект, содержащий изображение как байтоподобный объект. В результате мы должны сохранить его с помощью файлового объекта. Сначала указываем путь к файлу и имя
image <- content(image_response, "raw") writeBin(image, "logo.png")
Затем вы сможете найти log.png
в проводнике слева.
Получить запрос с параметрами URL
Вы также можете добавить параметры URL в запрос HTTP GET для фильтрации ресурсов. Например, вместо того, чтобы возвращать всех пользователей из API, я хочу получить только пользователя с идентификатором 1. Для этого я могу добавить параметр URL, например userid = 1
, в свой запрос GET.
Давайте посмотрим на пример GET с параметрами URL:
Предположим, у нас есть простой GET API с базовым URL для http://httpbin.org/
.
url_get <- 'http://httpbin.org/get'
и мы хотим добавить некоторые параметры URL к указанному выше GET API. Для этого мы просто создаем именованный список с именами и значениями параметров:
query_params <- list(name = "Yan", ID = "123")
Затем передать список query_params
в аргумент query
функции GET()
.
По сути, он сообщает GET API, что я хочу получить ресурсы только с именем, равным Yan
, и идентификатором, равным 123
.
Хорошо, давайте сделаем запрос GET на http://httpbin.org/get с двумя параметрами
response <- GET(url_get, query=query_params)
Мы можем распечатать обновленный URL
и посмотреть прикрепленные параметры URL.
response$request$url
После базового URL-адреса http://httpbin.org/get вы можете увидеть, что параметры URL-адреса name=Yan&ID=123
разделены ?
Атрибут args
ответа имел имя и значения:
content(response)$args
Почтовые запросы
Как и запрос GET
, POST
используется для отправки данных на сервер в теле запроса. Чтобы отправить Post Request в Python в URL
, мы меняем маршрут на POST
:
url_post <- 'http://httpbin.org/post'
Эта конечная точка будет ожидать данные в виде файла или формы, а from — это удобный способ настроить HTTP-запрос для отправки данных на сервер.
Для выполнения POST
запроса используем функцию POST()
, список body
передается в параметр body
:
body<- list(course_name='Introduction to R', instructor='Yan') response<-POST('http://httpbin.org/post', body = body) response
Мы видим, что запрос POST имеет тело, хранящееся в атрибуте fields
response$request$fields
Вы можете сделать гораздо больше, проверьте httr здесь.