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 HTMLdocument. Следует отметить, что некоторые запросы имеют заголовки.

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

Библиотека 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 здесь.