curl e httr: requisições HTTP para programadores R

curl e httr: requisições HTTP para programadores RGabriela Kishida KoreedaBlockedUnblockFollowFollowingApr 8Como a maioria dos aspirantes a “Data Scientists” por aí, eu comecei a programar sem ter muita base teórica sobre assuntos como internet, hardware, software, etc… Uma vez que eu tenho uma formação acadêmica não relacionada à Computação, normalmente, eu acabava buscando vários termos no Google (ainda faço isso).

Um dos conceitos mais importantes que eu aprendi foi requisição HTTP, que é a maneira como um cliente interage com um servidor web.

Ou seja, é a base para toda a comunicação de dados na internet.

Existem duas principais bibliotecas para realizar requisições: curl e httr.

A primeira é, na verdade, um invólucro da biblioteca libcurl da linguagem C e a segunda foi criada pelo bam-bam-bam do R, Hadley Wickham.

Neste artigo, discutirei a utilização de ambas as bibliotecas além de abordar, brevemente, as principais características de uma requisição.

Métodos HTTPUma requisição contêm:O método, a url e a versão do protocolo HTTP;Um ou mais cabeçalhos (opcional): informações adicionais;Um corpo de mensagem (opcional).

Os métodos também podem ser chamados de verbos, uma vez que cada um representa uma ação a ser processada pela URL.

Os principais são apresentados a seguir:GETRecupera uma representação do recurso especificado.

Por exemplo, podemos recuperar o código html de qualquer página web com esse método.

POSTSubmete uma entidade para o recurso especificado, podendo alterar o estado do servidor.

Por exemplo, quando submetemos um arquivo ou um formulário web.

PUTSubstitui (atualiza) as representações da entidade especificada caso ela exista, caso contrário, a entidade é criada.

PATCHModifica partes específicas de um recurso existente.

DELETEDeleta o recurso especificado.

ExemploPodemos ter um formulário a ser preenchido com informações de nome, e-mail e telefone de um usuário.

Ao submeter esses dados, utilizamos o método POST.

Quando queremos acessar essas informações usamos o GET.

Caso seja necessário atualizar as informações de um usuário específico, usamos o PUT.

Se quisermos alterar apenas o telefone, utilizamos o PATCH.

E para deletar um usuário, o DELETE.

ResponseApós processar a requisição, é retornada uma mensagem de resposta que é composta por:O status da request e a versão do protocolo HTTP;Um ou mais cabeçalhos;Um corpo de mensagem.

Alguns exemplos de status são: 200 (OK), 400 (Bad Request), 404 (Not Found).

Você pode encontrar uma lista completa aqui: https://developer.

mozilla.

org/pt-BR/docs/Web/HTTP/StatushttrEsta biblioteca apresenta funções com nomes muito intuitivos, então temos as funções GET, POST, PUT, PATCH e DELETE.

Além do verbo HEAD e uma função mais abrangente chamada VERB em que você pode especificar qualquer método e seus parâmetros.

Podemos adicionar os cabeçalhos à requisição utilizando add_headers dentro da função e o corpo, especificando o argumento body.

GET(url = "https://httpbin.

org/get", add_headers(a = 1, b = 2))POST(url = "https://httpbin.

org/post", body = "A simple string")PUT(url = "https://httpbin.

org/put")PATCH(url = "https://httpbin.

org/patch")DELETE(url = "https://httpbin.

org/delete")VERB("GET", url = "https://httpbin.

org/get")Essas funções retornam um objeto response que é composto pelas especificações da resposta, e às vezes, seguido pela response em formato json:Response [https://httpbin.

org/get] Date: 2019-04-08 23:06 Status: 200 Content-Type: application/json Size: 317 B{ "args": {}, "headers": { "Accept": "application/json, text/xml, application/xml, */*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.

org", "User-Agent": "libcurl/7.

54.

0 r-curl/3.

2 httr/1.

4.

0" }, "origin": "191.

181.

200.

173, 191.

181.

200.

173", "url": "https://httpbin.

org/get".

Para acessar a resposta em formato de lista, basta passar o objeto response dentro da função content.

content(GET(url = "https://httpbin.

org/get"))curlAo contrário da biblioteca httr, o curl não possuiu funções específicas para os principais verbos.

Para todos os métodos, existe apenas a função curl e as suas variações (curl_download, curl_fetch_memory, etc…).

Para especificar os headers e o body, primeiro, devemos criar um objeto handle.

Para saber todas as opções que handle_setopt aceita, podemos rodar curl_options.

h <- new_handle()handle_setopt(h, copypostfields = "moo=moomooo")handle_setheaders(h, "Content-Type" = "text/moo", "Cache-Control" = "no-cache", "User-Agent" = "A cow")curl(url = "https://httpbin.

org/get", handle = h)Essa função abre a conexão com a url especificada.

Podemos utilizar readLines para capturar o resultado no formato json e, após fechar a conexão, transformar em uma lista com a função jsonlite::fromJSON.

con <- curl(url = "https://httpbin.

org/get", handle = h)response <- readLines(con)close(con)jsonlite::fromJSON(response)PostmanUma alternativa à realizar as requisições pelo R, é o uso do software Postman que apresenta uma interface que permite interagir e desenvolver APIs.

Além disso, o programa gera snippets de códigos em diferentes linguagens de programação, no momento, ainda não existe a opção de R, porém, você pode acompanhar o meu PR para incluí-la aqui: https://github.

com/Kong/httpsnippet/pull/131ConclusãoÉ muito importante saber os principais métodos HTTP para poder interagir com APIs, além de ser uma habilidade essencial para se fazer webscrapping (tópico do meu próximo artigo).

Entre as duas bibliotecas apresentadas, httr apresenta uma funcionalidade muito mais intuitiva e compatível com a linguagem R, porém, para usos mais avançados é sugerido utilizar a biblioteca curl, uma vez que essa apresenta mais opções de personalizar as requisições mas também exige conhecimentos básicos de libcurl, se tornando uma alternativa menos amigável para iniciantes.

ReferênciasUnderstanding : RESTREST (Representational State Transfer) was introduced and defined in 2000 by Roy Fielding in his doctoral dissertation…spring.

ioPostmanPostman is the only complete API development environment, for API developers, used by more than 6 million developers…www.

getpostman.

comWhat is HTTP, Structure of HTTP Request and Response?." WebNotsHyperText Transfer Protocol is the basic communication protocol used in Internet life.

Here is a beginners guide to…www.

webnots.

comHTTP request methodsHTTP defines a set of request methods to indicate the desired action to be performed for a given resource.

Although…developer.

mozilla.

orgThe curl package: a modern R interface to libcurlEdit descriptioncran.

r-project.

orgGetting started with httrThe goal of this document is to get you up and running with httr as quickly as possible.

httr is designed to map…cran.

r-project.

org.

. More details

Leave a Reply