ESP8266 - HTTP 요청 | ESP8266 - HTTP Request
이 튜토리얼은 ESP8266을 사용하여 웹 서버, API 또는 웹 서비스에 HTTP 요청을 하는 방법을 안내합니다. 구체적으로, 다음을 배우게 됩니다:
- ESP8266을 사용하여 HTTP 요청(GET 및 POST)을 하는 방법
- 센서 데이터를 HTTP 요청에 포함하는 방법
준비물
1 | × | ESP8266 NodeMCU | Amazon | |
1 | × | Micro USB Cable | Amazon | |
1 | × | Breadboard | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Optional) DC Power Jack | 쿠팡 | Amazon | |
1 | × | (Optional) Screw Terminal Expansion Board for ESP8266 | 쿠팡 | Amazon |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
웹 클라이언트와 웹 서버의 기본 개념
웹의 몇 가지 기본 개념에는 웹 주소(URL), 호스트 이름, 경로 이름, 쿼리 문자열, HTTP 요청 등이 있습니다. 이에 대해 자세히 알고 싶다면 HTTP 튜토리얼에서 배울 수 있습니다.
HTTP 요청하는 방법
라이브러리 포함하세요
#include <WiFi.h>
#include <HTTPClient.h>
WiFi SSID와 비밀번호를 선언하세요.
const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 변경하세요
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 변경하세요
- 호스트 이름, 경로 이름, 쿼리 문자열을 선언하세요.
String HOST_NAME = "http://YOUR_DOMAIN.com"; // 변경하세요
String PATH_NAME = "/products/arduino"; // 변경하세요
//String PATH_NAME = "/products/arduino.php"; // 변경하세요
String queryString = "temperature=26&humidity=70"; // 선택적입니다
HTTP 클라이언트 객체를 선언하십시오.
cpp
HTTPClient http;
서버에 연결되어 있고, HTTP 요청을 전송한다면. 예를 들자면, HTTP GET
cpp
http.begin(HOST_NAME + PATH_NAME); //HTTP
int httpCode = http.GET();
웹 서버에서 응답 데이터를 읽어라.
// httpCode가 오류 시 음수가 됨
if (httpCode > 0) {
// 서버에서 파일을 찾음
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
} else {
// HTTP 헤더가 전송되었고 서버 응답 헤더가 처리되었음
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
HTTP 요청에 데이터를 포함하는 방법
우리는 HTTP 요청에 데이터를 포함함으로써 데이터를 웹 서버로 보낼 수 있습니다. 데이터 형식은 HTTP 요청 방식에 따라 달라집니다:
- HTTP GET 요청에 대해
- 데이터는 경로 이름의 쿼리 문자열에서만 전송될 수 있습니다.
- HTTP POST 요청
- 데이터는 쿼리 문자열 형식뿐만 아니라 Json, XML, 이미지 등과 같은 다른 형식으로도 전송될 수 있습니다.
- 데이터는 HTTP 요청 본문에 담깁니다.
HTTP GET과 POST 모두에서 쿼리 문자열 형식으로 데이터를 보내는 방법을 배워봅시다
쿼리 문자열 만들기
int temp = // 센서로부터
int humi = // 센서로부터
String queryString = String("temperature=") + String(temp) + String("&humidity=") + String(humi);
HTTP GET: 경로 이름에 쿼리 문자열을 추가하세요
cpp
http.begin(HOST_NAME + PATH_NAME + "?" + queryString);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.GET();
HTTP POST: HTTP 본문에 쿼리 문자열을 넣습니다.
cpp
http.begin(HOST_NAME + PATH_NAME);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST(queryString);
GET 및 POST 모두에서 웹 서버의 응답 데이터를 읽습니다.
// httpCode는 에러가 발생하면 음수가 됩니다.
if (httpCode > 0) {
// 서버에서 파일을 찾았습니다.
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
} else {
// HTTP 헤더가 전송되었고 서버 응답 헤더가 처리되었습니다.
Serial.printf("[HTTP] GET/POST... code: %d\n", httpCode);
}
} else {
Serial.printf("[HTTP] GET/POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
HTTP 요청을 만들기 위한 완전한 ESP8266 코드
아래는 HTTP GET/POST 요청을 만들기 위한 완전한 ESP8266 코드입니다.
/*
* 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp8266/esp8266-http-request
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 변경하세요
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 변경하세요
String HOST_NAME = "http://YOUR_DOMAIN.com"; // 변경하세요
String PATH_NAME = "/products/arduino.php"; // 변경하세요
WiFiClient client; // WiFiClient 객체 생성
HTTPClient http;
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
http.begin(client, HOST_NAME + PATH_NAME); //HTTP
int httpCode = http.GET();
// httpCode가 음수면 오류가 발생한 것입니다
if (httpCode > 0) {
// 서버에서 파일을 찾았습니다
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
} else {
// HTTP 헤더가 전송되었고 서버 응답 헤더가 처리되었습니다
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void loop() {
// 여기에 필요한 경우 루프 코드를 작성하세요
}
ESP8266을 이용한 HTTP GET 요청 및 데이터 전송을 위한 완전한 코드
/*
* 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp8266/esp8266-http-request
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 변경하세요
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 변경하세요
String HOST_NAME = "http://YOUR_DOMAIN.com"; // 변경하세요
String PATH_NAME = "/products/arduino"; // 변경하세요
//String PATH_NAME = "/products/arduino.php"; // 변경하세요
String queryString = "temperature=26&humidity=70";
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
WiFiClient client; // WiFiClient 객체 생성
HTTPClient http;
http.begin(client, HOST_NAME + PATH_NAME + "?" + queryString);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.GET();
// httpCode는 오류시 음수가 됨
if (httpCode > 0) {
// 서버에서 파일을 찾음
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
} else {
// HTTP 헤더가 보내졌으며 서버 응답 헤더가 처리됨
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void loop() {
// 여기에 필요한 경우 루프 코드를 작성하세요
}
데이터를 가진 HTTP POST 요청을 만들기 위한 완전한 ESP8266 코드
/*
* 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp8266/esp8266-http-request
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 변경하세요
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 변경하세요
String HOST_NAME = "http://YOUR_DOMAIN.com"; // 변경하세요
String PATH_NAME = "/products/arduino"; // 변경하세요
//String PATH_NAME = "/products/arduino.php"; // 변경하세요
String queryString = "temperature=26&humidity=70";
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
WiFiClient client; // WiFiClient 객체 생성
HTTPClient http;
http.begin(client, HOST_NAME + PATH_NAME);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST(queryString);
// httpCode는 오류시 음수가 됩니다.
if (httpCode > 0) {
// 서버에 파일이 있을 경우
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
} else {
// HTTP 헤더가 전송되었으며 서버 응답 헤더가 처리되었습니다
Serial.printf("[HTTP] POST... code: %d\n", httpCode);
}
} else {
Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void loop() {
// 여기에 필요한 경우 루프 코드를 작성하세요
}