{"id":20341929,"url":"https://github.com/douglaszuqueto/esp8266-http-request","last_synced_at":"2025-04-11T23:34:19.102Z","repository":{"id":91302768,"uuid":"94567403","full_name":"douglaszuqueto/esp8266-http-request","owner":"douglaszuqueto","description":"Realizando requisições HTTP no ESP8266 utilizando a biblioteca HTTPClient","archived":false,"fork":false,"pushed_at":"2022-12-11T15:58:32.000Z","size":69,"stargazers_count":56,"open_issues_count":2,"forks_count":14,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T19:21:19.732Z","etag":null,"topics":["api","esp8266","http","httpclient","nodejs"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/douglaszuqueto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-16T17:36:54.000Z","updated_at":"2025-01-28T00:10:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"3f486c9e-f439-48a3-aec1-4646ccd573f8","html_url":"https://github.com/douglaszuqueto/esp8266-http-request","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/douglaszuqueto%2Fesp8266-http-request","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/douglaszuqueto%2Fesp8266-http-request/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/douglaszuqueto%2Fesp8266-http-request/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/douglaszuqueto%2Fesp8266-http-request/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/douglaszuqueto","download_url":"https://codeload.github.com/douglaszuqueto/esp8266-http-request/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248495166,"owners_count":21113580,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","esp8266","http","httpclient","nodejs"],"created_at":"2024-11-14T21:29:46.122Z","updated_at":"2025-04-11T23:34:19.094Z","avatar_url":"https://github.com/douglaszuqueto.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Realizando requisições HTTP no ESP8266 utilizando a biblioteca HTTPClient\n\n![img](https://raw.githubusercontent.com/douglaszuqueto/esp8266-http-request/master/files/esp8266-request.png)\n\n## Introdução\n\nCertamente você já precisou recuperar algum dado de um servidor, ou até mesmo enviar algum dado para o mesmo a partir do seu embarcado - neste caso estamos nos referindo ao nosso querido ESP8266.\n\nPortanto, neste artigo, será abordado um pequeno cenário de como utilizar o protocolo HTTP para recuperação/envio de dados ao servidor. \n\n## HTTP(Hypertext Transfer Protocol)\n\nO famoso protocolo HTTP. Quem nunca usou?.\n\nUm protocolo baseado na arquitetura cliente/servidor, amplamente utilizado no nosso dia a dia - creio que grande parte das comunicações hoje em dia, usufruem do http.\n\n### Verbos HTTP(mais utilizados - principalmente em API's)\n\nO HTTP disponha de um conjunto de verbos http, então sem muitas delongas, fica abaixo os mais comuns e utilizados hoje nas comunicações:\n\n| Verbo | descrição |\n| --- | --- |\n| GET | requisitar registros do servidor |\n| POST | cadastrar um registro no servidor |\n| PUT | atualizar algum registro no servidor |\n| DELETE | remover algum registro do servidor |\n\nNas descrições dos verbos mencionados acima, pensem em um recurso de como manipular um sensor - cadastrá-lo, requisitar, atualizar e remover - famoso **CRUD** (create, read, update, delete).\n\n## WebService para teste\n\nAntes de continuar, segue uma simples estrutura para testes de um simples webservice em nodejs.\n\n```js\nconst express = require('express')\n    , bodyParser = require('body-parser')\n    , cors = require('cors')\n    , app = express();\n\n/* Middlewares */\napp.use(bodyParser.json());\napp.use(bodyParser.urlencoded({extended: true}));\napp.use(cors());\n\nconst sensors = [\n  {\n    'id': 1234,\n    'name': 'DHT22',\n    'type': 'temperature',\n    'value': 25,\n  },\n  {\n    'id': 4321,\n    'name': 'DHT11',\n    'type': 'temperature',\n    'value': 25,\n  }\n];\n\n/* Routes */\napp.get('/sensors', (req, res) =\u003e res.json(sensors));\n\napp.get('/sensors/:id', (req, res) =\u003e {\n  const id = parseInt(req.params.id);\n  const sensor = sensors.filter((item) =\u003e item.id === id);\n\n  if (sensor.length \u003c= 0) {\n    return res.json({});\n  }\n  return res.json(sensor[0]);\n});\n\napp.post('/sensors', (req, res) =\u003e {\n  const sensor = {\n    'id': req.body.id,\n    'name': req.body.name,\n    'type': req.body.type,\n    'value': req.body.value,\n  };\n  sensors.push(sensor);\n\n  res.json(sensor);\n});\n\n/* App listen */\napp.listen(3000, () =\u003e {\n  console.log(`nodejs-backend is running`);\n  console.log(`open in http://127.0.0.1:3000/sensors`);\n});\n```\n\nO script se encontra dentro da pasta **server/nodejs**. Para rodar basta ter o nodejs instalado na maquina. Com ele instalado, voce só precisa baixar as depedências do projeto utilizando o NPM ou Yarn.\n\n## Biblioteca HTTPClient\n\nA lib HTTPClient provê de forma simples e descomplicada **realizar comunicações http** com um servidor. \n \nPossui um conjuntos de métodos simples e abstratos caso seja necessário usar algo mais complexo. A API em si, achei deveras interessante e de fácil entendimento.\n\nPara utilizar, basta incluir a biblioteca em seu sketch.\n\n```c\n#include \u003cESP8266HTTPClient.h\u003e\n```\n\ne.. para utilizar, basta criar o objeto da mesma:\n\n```\nHTTPClient http;\n```\n\nA partir deste momento, você já esta apto a realizar uma comunicação http com o servidor, será abordado em um tópico futuro, mas antes de começar, vamos dar uma explorada nos principais métodos que a biblioteca oferece.\n\n### Métodos\n\nAbaixo, segue uma lista dos metodos que utilizei no decorrer deste artigo:\n\n```c\nbool begin(String url); // metodo responsavel por começar a comunicação\n\nvoid addHeader(const String\u0026 name, const String\u0026 value, bool first = false, bool replace = true); // método para adicionar cabeçalhos ao header de sua requisicao\n\nint GET(); // responsavel por realizar uma requisição do tipo GET ao servidor\n\nint POST(String payload); // responsavel por realizar uma requisição do tipo POST ao servidor\n\nint sendRequest(const char * type, String payload); // metodo abstrado, caso queira usar outro método que a lib não suporte - DELETE, por exemplo\n\nString getString(void); // recupera a resposta da requisicao, ja convertido em string \n\nvoid end(void); // responsavel por encerrar a comunicação\n\n```\n\n## Estrutura simples de uma requisição HTTP\n\n```c\n// ############# HTTP REQUEST ################ //\n\nhttp.begin('URL DO SEU SERVICO'); // inicia a comunicacao com base na sua url\nint httpCode = http.GET(); // efetua uma requisicao do tipo get e retorna o código de status da conexao\n\nif (httpCode \u003c 0) { // caso o status for negativo, mostrará a mensagem no monitor serial\n    Serial.println(\"request error - \" + httpCode);\n    return;\n}\nif (httpCode != HTTP_CODE_OK) { // caso o status for diferente de 200, reinicia o ciclo da requisicao\n    return;\n}\nString payload = http.getString(); // passando das verificacoes acima, voce tem acesso ao corpo da mensagem retornado pelo servidor\n\nhttp.end(); // finaliza a conexao\n\nSerial.println(\"##[RESULT]## ==\u003e \" + payload); // imprimi na serial a string retornada pelo servidor\n\n```\n### Exemplo contendo todo firmware(básico) para o ESP\n\n```c\n// ############# LIBRARIES ############### //\n\n#include \u003cESP8266WiFi.h\u003e\n#include \u003cESP8266HTTPClient.h\u003e\n\n// ############# VARIABLES ############### //\n\nconst char* SSID = \"\"; // rede wifi\nconst char* PASSWORD = \"\"; // senha da rede wifi\n\nString BASE_URL = \"http://192.168.15.3:3000/\";\n\n// ############# PROTOTYPES ############### //\n\nvoid initSerial();\nvoid initWiFi();\nvoid httpRequest(String path);\n\n// ############### OBJECTS ################# //\n\nWiFiClient client;\nHTTPClient http;\n\n// ############## SETUP ################# //\n\nvoid setup() {\n  initSerial();\n  initWiFi();\n}\n\n// ############### LOOP ################# //\n\nvoid loop() {\n  Serial.println(\"[GET] /sensors - sending request...\");\n  Serial.println(\"\");\n\n  httpRequest(\"sensors\");\n\n  Serial.println(\"\");\n  delay(1000);\n\n}\n\n// ############# HTTP REQUEST ################ //\n\nvoid httpRequest(String path)\n{\n  String payload = makeRequest(path);\n\n  if (!payload) {\n    return;\n  }\n\n  Serial.println(\"##[RESULT]## ==\u003e \" + payload);\n\n}\n\nString makeRequest(String path)\n{\n  http.begin(BASE_URL + path);\n  int httpCode = http.GET();\n\n  if (httpCode \u003c 0) {\n    Serial.println(\"request error - \" + httpCode);\n    return \"\";\n\n  }\n\n  if (httpCode != HTTP_CODE_OK) {\n    return \"\";\n  }\n\n  String response =  http.getString();\n  http.end();\n\n  return response;\n}\n\n// ###################################### //\n\n// implementacao dos prototypes\n\nvoid initSerial() {\n  Serial.begin(115200);\n}\n\nvoid initWiFi() {\n  delay(10);\n  Serial.println(\"Conectando-se em: \" + String(SSID));\n\n  WiFi.begin(SSID, PASSWORD);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(100);\n    Serial.print(\".\");\n  }\n  Serial.println();\n  Serial.print(\"Conectado na Rede \" + String(SSID) + \" | IP =\u003e \");\n  Serial.println(WiFi.localIP());\n}\n```\n## Realizando requisições ao Servidor\n\nCom base no firmware acima, basicamente pouca coisa mudará em relação ao uso de outros métodos HTTP. Veja abaixo como ficaria o uso.\n\n### GET - recuperando dados do servidor\n\n```c\n  http.begin('URL');\n  int httpCode = http.GET();\n```\n\n### POST - enviando dados para o servidor\n\n```c\n  http.begin('URL');\n  http.addHeader(\"content-type\", \"application/x-www-form-urlencoded\");\n\n  String body = \"id=7890\u0026name=NTC\u0026value=10\";\n\n  int httpCode = http.POST(body);\n```\n\n## Finalizando\n\nTodos exemplos que foram testados na construção deste artigo estarão no repositório do Github, segue o link:\n\n* [GET](https://github.com/douglaszuqueto/esp8266-http-request/blob/master/esp8266/get.ino);\n* [POST](https://github.com/douglaszuqueto/esp8266-http-request/blob/master/esp8266/post.ino);\n* [GET by id - busca por ID](https://github.com/douglaszuqueto/esp8266-http-request/blob/master/esp8266/get-by-id.ino);\n* [DELETE](https://github.com/douglaszuqueto/esp8266-http-request/blob/master/esp8266/delete.ino);\n\nDeu para perceber o quão simples fica realizar requisições http a partir do esp? Eu particularmente curti bastante - eu nunca havia utilizado esta lib :P.\n\nOs próximos passos será testar mais a biblioteca e também realizar o parser do JSON retornado pelo servidor utilizando a lib **ArduinoJSON**. Assim, dando alguma utilidade de fato ao contexto de determinado projeto.\n\n## Referências\n\n* [Biblioteca ESP8266HTTPClient](https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient);\n* [Hypertext Transfer Protocol](https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol);\n\n## Está gostando dos materiais que vêm sendo produzidos?\n\nCaso tenha gostado deste e de outros materiais que mantenho, no dia 18/06/2017 abri uma campanha de financiamento recorrente com o objetivo de captar recursos para uma dedicação fulltime em projetos open source.\n \nPortanto, caso deseja me ajudar, fica aqui o [link do meu Apoia.se](https://apoia.se/douglaszuqueto). Desde já, muito obrigado :D.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdouglaszuqueto%2Fesp8266-http-request","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdouglaszuqueto%2Fesp8266-http-request","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdouglaszuqueto%2Fesp8266-http-request/lists"}