สวัสดีครับ ในวันนี้เราจะมาดูในส่วนของการติดต่อสื่อสารระหว่าง hardware กับส่วนอื่นๆของ project กันว่าใน exceed นี้เราจะติดต่อสื่อสารกันยังไง
Intro
ในงาน exceed ของเรานั้น เราจะแบ่งฝ่ายกันทั้งหมด 3 ฝ่ายใช่ไหมครับ คือ frontend backend และ hardware
frontend จะคอยทำการแสดงผลในส่วนของหน้าเว็บ hardware จะเป็นอุปกรณ์ต่างๆที่จะช่วยให้งานของเรานั้นสมบูรณ์ และ backend จะเป็นส่วนติดต่อกับฐานข้อมูลและเปรียบเสมือนเป็นตัวกลางรับส่งข้อมูลต่างๆระหว่าง frontend และ hardware ครับ
ในเมื่อ backend เป็นเสมือนตัวกลางคั่นระหว่าง frontend และ hardware แสดงว่าผู้ที่ hardware จะติดต่อสื่อสารด้วยหลักๆก็จะเป็น backend นั่นเอง โดยใน exceed ของเรานั้นจะใช้ REST API เป็นรูปแบบสำหรับการสื่อสารนี้ครับ
แต่ก่อนที่เราจะสื่อสารกันได้นั้นเราจะต้องนำบอร์ดของเราไปเชื่อมต่อกับ wifi เสียก่อน เพราะการสื่อสารที่เราจะทำนั้น จะทำผ่าน http request ครับ
Connect WiFi
บอร์ดของเรานั้น ไม่ได้มีคำสั่งสำหรับการเชื่อมต่อ wifi มาให้ตั้งแต่เริ่มแรก เราจึงจำเป็นต้องใช้ library ช่วย คือ WiFi.h ซึ่งน้องๆจะต้องทำการติดตั้งเพิ่มเข้าไปใน project (ในที่นี้ตัวที่เราหาแล้วจะเจอชื่อ ESPAsyncWebServer-esphome ซึ่งมี WiFi.h อยู่ข้างในแล้ว)
คำสั่งสำหรับใช้งาน
#include <Arduino.h>
#include <WiFi.h>
const char *ssid = "<Wifi name>";
const char *password = "<Wifi password>";
void Connect_Wifi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("OK! IP=");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
}
void loop() {
// put your main code here, to run repeatedly:
}
จากโค้ดเราจะทำการเชื่อมต่อ wifi ด้วยคำสั่ง WiFi.begin(ตัวแปรเก็บชื่อ wifi,ตัวแปรเก็บชื่อ password) และดูผลลัพท์จาก WiFi.status() ถ้าหากเป็น WL_CONNECTED แสดงว่าเชื่อมต่อสำเร็จแล้วนั่นเอง หากน้องๆอยากรู้ความหมายของ status อื่น สามารถดูได้ที่นี่
ซึ่งเมื่อทำการ connect สำเร็จแล้ว ใน Serial Port ของเรานั้นจะต้องขึ้น OK! IP=xx.xx.xx.xx ครับ
สำคัญ เนื่องจากภายในมหาลัยใช้ wifi แบบต้อง login อีกครั้ง ทำให้ลำบากในการใช้งานกับบอร์ดของเรา ทางที่ดีควรใช้การปล่อย wifi ผ่านมือถือแทน
REST Api
HTTP request
ในเกริ่นนำก่อนหน้านี้ พี่ได้มีการพูดถึง http request ใช่ไหมครับ น้องหลายคนอาจจะงงว่ามันคืออะไร ถ้าจะให้สรุปย่อๆ มันก็คือ การสื่อสารผ่านทาง internet ภายใต้ http รูปแบบหนึ่ง(โดยมีข้อกำหนดตาม HTTP Protocol) จากทาง client ไปยัง server ในที่นี้คือ จาก hardware ไป backend นั่นเองครับ และเมื่อ backend ตอบกลับมายัง hardware เราจะเรียกว่า http response แทนครับ ใครอยากอ่านรายละเอียดเพิ่มเติมก็สามารถดูได้ที่นี่ครับ

REST Api คืออะไร ?
REST Api คือ รูปแบบการส่งข้อมูลระหว่าง Server-Client รูปแบบหนึ่งซึ่งอยู่บนข้อกำหนดของ HTTP Protocol โดยจะเป็นการสร้าง Web Service เพื่อแลกเปลี่ยนข้อมูลกันผ่าน Application
สำหรับส่วน hardware นั้นเราไม่จำเ็นต้องเขียน REST Api (หน้าที่นี้เป็นของ backend) แต่เราต้องใช้งานมันเพื่อติดต่อกับ server ไม่ว่าจะเป็นการเก็บข้อมูลลงฐานข้อมูล หรือรวมไปถึงการคุยกับฝั่ง frontend ด้วยเช่นกัน ดังนั้นเราจะเป็นต้องรู้จักมันเล็กน้อย เพื่อใช้งานมันได้อย่างถูกต้อง
Method
ในการส่ง http request ไปยัง backend นั้น เราจะมีรูปแบบการส่งอยู่หลักๆ 4 แบบ คือ GET, POST, PUT, และ DELETE ซึ่งจะทำภายใต้ Operation CURD ดังภาพ


ต่อจากนี้เราจะไปดูกันว่า แต่ละ Method นั้น เราจะใช้งานมันยังไง
GET
เป็น http request สำหรับการขอข้อมูลจากทาง server เช่น เราทำการดูรายชื่อนักเรียนทั้งหมดด้วย GET https://schoolXX.co/students เป็นต้น
ซึ่ง method นี้เราสามารถส่งค่าต่างๆไปด้วยได้ แต่จะต้องอยู่ด้วยกันกับ url สำหรับการ request โดยจะเรียกว่า param เช่น เราต้องการรายชื่อนักเรียนที่อยู่ชั้นปีที่ 6 ห้อง 12 เราก็อาจจะใช้คำสั่งเป็น GET https://schoolXX.co/students?grade=6&room=12 เป็นต้น
โดยส่วนด้านหลัง ? คือ param ซึ่งจะมีตัวแปรคือ grade = 6 และ room = 12 ถูกส่งไปนั่นเอง
เพื่อความเข้าใจที่มากขึ้นให้ไปลองเขียนโค้ด ซึ่งจะอยู่ส่วน ตัวอย่างการใช้งาน

POST
เป็น http request สำหรับการส่งข้อมูลไปยัง server เพื่อนำไปสร้างเป็นข้อมูลตัวใหม่ในฐานข้อมูล โดยข้อมูลที่ส่งโดย post นั้น เราจะใส่มันไว้ในส่วนที่เรียกว่า body ซึ่งจะมีความปลอดภัยมากกว่าการส่งข้อมูลทาง param
ภายใน body เราจะสามารถใส่ข้อมูลได้หลายประเภท เช่น JSON, XML, text เป็นต้น ซึ่งทั้งนี้การที่เราจะส่งอะไรไปนั้น เราต้องคุยกับทาง backend ว่าทางฝั่ง server นั้น รับค่า body เป็นข้อมูลรูปแบบไหน ซึ่งในส่วนใหญ่ จะรับค่าเป็น JSON
โดย JSON เป็นข้อมูลรูปแบบ text ที่มีรูปแบบที่จะเก็บข้อมูลแบบ key, value มีลักษณะเป็น '{"key1": "value1","key2": "value2"}' หรือเป็นดังภาพ

เพื่อความเข้าใจที่มากขึ้นให้ไปลองเขียนโค้ด ซึ่งจะอยู่ส่วน ตัวอย่างการใช้งาน

PUT
เป็น http request สำหรับการส่งข้อมูลไปยัง server เพื่อนำไป update ข้อมูลที่มีในฐานข้อมูลให้เป็นข้อมูลใหม่ โดยข้อมูลที่ส่งโดย put นั้น เราจะใส่มันไว้ในส่วนที่เรียกว่า body ซึ่งจะมีลักษณะคล้ายคลึงกับการส่งข้อมูลแบบ post
แต่การส่งข้อมูลแบบ put เราจะต้องส่งทั้งข้อมูลทั้งหมดของตัวที่จะเปลี่ยนไปด้วยไม่ว่าเราจะ update ข้อมูลนั้นหรือไม่ก็ตาม เพราะการ put เป็นการ update ค่าทับลงไปในตัวเก่า ซึ่งถ้าเราลืมส่งข้อมูลบางส่วนที่เราไม่ได้ update ของตัวเก่าไปด้วย ข้อมูลส่วนนั้นจะหายไปหลังจาก update แล้วนั่นเอง แต่ทั้งนี้ก็ขึ้นอยู่กับการเขียนโค้ดของฝั่ง backend ด้วยเช่นกัน ซึ่งอาจจะป้องกันการกระทำแบบนี้เอาไว้แล้วก็เป็นได้
จากที่กล่าวมานั้น เราจะมีอีก method ที่คล้ายคลึงกับ put ซึ่ง method นี้ สามารถส่งค่าข้อมูลไปเพียงแค่บางส่วนก็เพียงพอสำหรับการ update โดย method นี้ มีชื่อว่า method PATCH
สรุป
PUT - ใช้สำหรับ update ข้อมูลทั้งหมดทุก field ( อัพเดททั้ง doc หรือทั้ง record จากข้อมูลเก่าให้เป็นข้อมูลชุดที่ส่งมาอัพเดทแทน )
PATCH - ใช้สำหรับ update ข้อมูลเฉพาะ field ที่เราส่งไป ( ถ้า field ไหนเราไม่ได้ส่งไปให้ คือใช้ค่าเดิม )
เพื่อความเข้าใจที่มากขึ้นให้ไปลองเขียนโค้ด ซึ่งจะอยู่ส่วน ตัวอย่างการใช้งาน
DELETE
เป็น http request สำหรับการลบข้อมูล โดยข้อมูลที่อยากลบเราจะส่งไปบอก server ผ่านทาง body หรือ param ก็ได้ ทั้งนี้ขึ้นอยู่กับว่าทาง backend ออกแบบไว้อย่างไร
โดยการ delete เป็นสิ่งที่ควรระมัดระวังในการใช้งาน เพราะมันคือการลบข้อมูลให้หายไปจากฐานข้อมูลเลยนั่นเอง
เพื่อความเข้าใจที่มากขึ้นให้ไปลองเขียนโค้ด ซึ่งจะอยู่ส่วน ตัวอย่างการใช้งาน
สรุป
- เราสามารถสรุปลักษณะของข้อมูลที่เราสามารถส่งไปได้ในแต่ละ method ได้ตามตารางด้านล่าง
| GET | POST | PUT | PATCH | DELETE | |
|---|---|---|---|---|---|
| Can use body ? | NO | YES | YES | YES | YES |
HTTP Response & HTTP Status
เมื่อเรา http request ไปนั้น ย่อมมีการตอบกลับจากฝั่ง server ด้วย http response และอาจจะมีข้อมูลต่างๆติดมาด้วยก็ได้เช่นกัน เช่น อาจจะมี JSON หรือ plain text กลับมา เป็นต้น ซึ่งทั้งนี้เราต้องคุยกับ backend ว่าเราจะได้รับค่าเป็นอะไร เพื่อเขียนโค้ดให้ถูกต้อง
แต่เราจะทราบได้อย่างไรว่า ผลการตอบกลับนั้นเป็นเช่นไร มันสำเร็จไหม หรือมันส่งไปถึงไหม หรือเราส่งข้อมูลไปผิดหรือไม่ ทั้งนี้เราสามารถดูผลลัพธ์ได้ทาง HTTP Status Code ซึ่งเป็นตัวเลขที่กำหนดมาเพื่อให้เข้าใจโดยทั่วกันว่า เลขนั้นๆแทนผลลัพธ์เช่นไร
โดย HTTP Status Code หลักๆที่เราน่าจะได้ใช้กันใน exceed ครั้งนี้ มีดังนี้
2xx: successful (สำเร็จ) หมายความว่าการ request นั้นได้รับแล้วและกระทำตาม method สำเร็จโดย Server
| Code | ความหมาย |
|---|---|
| 200 | Ok เป็นมาตรฐานของ HTTP Response นั้น Success สำหรับ GET, PUT หรือ POST |
| 201 | Create เป็น Response สำหรับข้อมูลใหม่ได้ถูกสร้างขึ้น ใช้สำหรับ POST |
4xx: client error
| Code | ความหมาย |
|---|---|
| 400 | Bad Request บอกว่า request ที่ส่งมาโดย client นั้นไม่ถูกดำเนินการ และ Server ไม่เข้าใจว่า request เกี่ยวกับอะไร |
| 401 | Unauthorized บอกว่า client ไม่ได้รับอนุญาตในการเข้าถึงข้อมูลและควรจะส่ง credential มาพร้อม request |
| 404 | Not Found บ่งบอกว่า resource ที่ request มานั้น ไม่ว่างใช้งานตอนนี้ |
5xx: server error
| Code | ความหมาย |
|---|---|
| 500 | Internal Server Error บอกว่าการ request นั้นถูกต้อง แต่ server มีความสับสนและจะบริการด้วยเงื่อนไขที่คาดการไม่ได้ |
| 503 | Service Unavailable บอกว่า server ใช้การไม่ได้ หรือไม่ว่างที่จะรับและดำเนินการ request โดยส่วนใหญ่แล้ว server อยู่ในช่วงบำรุงรักษา |
ตัวอย่างการใช้งาน
หลังจากเราได้รู้หลักการคร่าวๆในการทำงานมาแล้ว เราจะไปทำการเขียนโค้ดกันต่อครับ โดยเราจะเขียนโค้ด ให้บอร์ดของเรานั้นติดต่อกับ api ซึ่งจะมีสิ่งที่ต้องเตรียมดังนี้
- ทำการ connect wifi ของบอร์ดให้เรียบร้อย
- api ที่เราใช้จะเป็น jsonplaceholder
https://jsonplaceholder.typicode.com/ซึ่งเป็น api ที่เอาไว้สำหรับทดสอบครับ
เรามาเริ่มกันที่การ connect wifi กันก่อนครับ และ ต่อจากนี้พี่จะขอไม่แสดงโค้ดตัวแปรและฟังก์ชันในส่วนของการเชื่อมต่อ wifi เพื่อให้โค้ดที่น้องๆอ่านมีน้อยลงนะครับ*
#include <Arduino.h>
#include <WiFi.h>
const char *ssid = "<Wifi name>";
const char *password = "<Wifi password>";
void Connect_Wifi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("OK! IP=");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
}
void loop() {
}
JSON
ต่อมาเราจะต้องเตรียมเล็กน้อยสำหรับการจัดการกับ JSON เพราะว่า JSON นั้นเป็นตัวแปร string ที่ภายในเป็นรูปแบบ key value ซึ่งมีความคล้ายคลึงกับพวกตัวแปร dictionary ใน python ซึ่งถ้าหากเราสามารถแปลงไปแปลงกลับระหว่าง JSON กับตัวแปรที่คล้ายๆ dictionary ได้ ก็จะสามารถจัดการการใช้งานของมันได้ง่ายกว่านั่นเอง
แต่เนื่องจากใน ภาษา c ไม่มีตัวแปรชนิด dictionary ติดมาให้ เราจึงต้องไปใช้ตัวแปรรูปแบบ DynamicJsonDocument ซึ่งอยู่ใน ArduinoJson.h แทนนั่นเอง
เราจึงต้องเพิ่ม library ชื่อ ArduinoJson.h เพื่อมาช่วยในเรื่องนี้ ซึ่งน้องจะต้อง download เพิ่มเข้าไปเอง
และจะมีคำสั่งที่เราจะใช้หลักๆ คือ
DynamicJsonDocumentใช้สำหรับการประกาศตัวแปรที่จะรองรับข้อมูล JSON ให้เราใช้งานมันได้สะดวกขึ้นserializeJson(ตัวแปร DynamicJsonDocument,ตัวแปร JSON);คือ การแปลง DynamicJsonDocument -> JSONdeserializeJson(ตัวแปร DynamicJsonDocument,ตัวแปร JSON);คือ การแปลง JSON -> DynamicJsonDocument- สามารถดูรายละเอียดเพิ่มเติมได้ที่
#include <Arduino.h>
#include <WiFi.h>
#include <ArduinoJson.h>
void Connect_Wifi();
void setup() {
Serial.begin(115200);
Connect_Wifi();
}
void loop() {
}
HTTP
ต่อมาการที่บอร์ดเราจะส่ง http request ออกไปได้นั้น เราจะต้องใช้ library ช่วย คือ HttpClient.h ครับ ซึ่งโดยปกติจะติดมากับ project เราอยู่แล้วไม่ต้อง download library เพิ่มครับ
ทีนี้เรามาเริ่มส่วนสำคัญกันเลยครับ
- ก่อนอื่น เราจะประกาศ String baseUrl เอาไว้เป็นเหมือน path ปลายทาง เพื่อที่เราจะนำ baseUrl ไปต่อเติมเป็น endpoint ต่างๆของ api ที่เราจะส่งไปหาต่อไป
- ในที่นี้ baseUrl ก็คือ
https://jsonplaceholder.typicode.com/นั่นเอง
#include <Arduino.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
const String baseUrl = "https://jsonplaceholder.typicode.com/";
void Connect_Wifi();
void setup() {
Serial.begin(115200);
Connect_Wifi();
}
void loop() {
}
GET
เราจะมาลองใช้ get เพื่อดู post หมายเลข 1 จาก jsonplaceholder มาครับ โดยจะใช้เป็น GET https://jsonplaceholder.typicode.com/posts/1 ซึ่งจะมีผลลัพธ์ตามนี้
และโค้ดที่เราจะเขียนจะมีลักษณะประมาณด้านล่าง
DynamicJsonDocument doc(2048);ประกาศตัวแปรชื่อ doc ขนาด 2048 byte เพื่อรองรับการใช้งาน JSON แบบ dictionaryconst String url = baseUrl + "posts/1";สร้าง endpoint urlHTTPClient http;สร้างตัวแปร http เพื่อใช้งาน http requesthttp.begin(url);เตรียมเป้าหมายการ http request ไปยัง urlint httpResponseCode = http.GET();http request ไปยัง url ด้วย method GET และนำ http status code ที่ได้มาเก็บไว้ที่ httpResponseCodeString payload = http.getString();นำ string JSON ที่เป็นผลลัพธ์ออกมาdeserializeJson(doc,payload);การแปลง string JSON -> DynamicJsonDocument(const char*)doc["title"]นำ value ของ key title ออกมาแสดงผล
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const String baseUrl = "https://jsonplaceholder.typicode.com/";
void Connect_Wifi();
void GET_post(){
DynamicJsonDocument doc(2048);
const String url = baseUrl + "posts/1";
HTTPClient http;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode >= 200 && httpResponseCode < 300) {
Serial.print("HTTP ");
Serial.println(httpResponseCode);
String payload = http.getString();
deserializeJson(doc,payload);
Serial.println();
Serial.println((const char*)doc["title"]);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
GET_post();
}
void loop() {
}
ซึ่งถ้าทำงานถูกต้อง จะต้องขึ้นประมาณนี้ครับ
Connecting to WiFi....OK! IP=10.10.0.2
HTTP 200
sunt aut facere repellat provident occaecati excepturi optio reprehenderit
ต่อมาเราจะมาลองใช้ get เพื่อดู comment ของ post หมายเลข 1 จาก jsonplaceholder กันครับ โดยจะใช้เป็น GET https://jsonplaceholder.typicode.com/comments?postId=1 ซึ่งจะมีผลลัพธ์ตามนี้
โดยโค้ดเราก็แทบไม่ต่างกับก่อนหน้า เพียงแค่เพิ่ม param เข้าไปใส่ url เพียงเท่านั้น (สามารถเขียนได้หลายแบบ ตัวอย่างที่เขียนไว้เป็นการส่งค่า postid ที่เราต้องการเข้ามาในฟังก์ชัน) และจะสังเกตได้ว่า output ที่ได้กลับมานั้น เป็น String JSON ที่เป็นเหมือน array of dictionary ซึ่งเราก็สามารถใช้ deserializeJson(doc,payload); เพื่อนำค่ามันมาให้เราใช้งานได้ง่ายได้เช่นกัน
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const String baseUrl = "https://jsonplaceholder.typicode.com/";
void Connect_Wifi();
void GET_comments(String postid ){
DynamicJsonDocument doc(2048);
const String url = baseUrl + "comments?postId=" + postid;
HTTPClient http;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode >= 200 && httpResponseCode < 300) {
Serial.print("HTTP ");
Serial.println(httpResponseCode);
String payload = http.getString();
deserializeJson(doc,payload);
Serial.println();
Serial.println((const char*)doc[1]["email"]);
Serial.println((const char*)doc[1]["body"]);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
GET_comments("1");
}
void loop() {
}
ซึ่งถ้าทำงานถูกต้อง จะต้องขึ้นประมาณนี้ครับ
Connecting to WiFi....OK! IP=10.10.0.2
HTTP 200
Jayne_Kuhic@sydney.com
est natus enim nihil est dolore omnis voluptatem numquam
et omnis occaecati quod ullam at
voluptatem error expedita pariatur
nihil sint nostrum voluptatem reiciendis et
POST
เราจะมาลองใช้ post เพื่อส่งข้อมูลไปสร้างเป็น post ใหม่ของ jsonplaceholder (แต่มันจะส่งผลลัพธ์มาเพียงแค่ http request สำเร็จไหม โดยไม่ได้มีการไปเพิ่มใน database จริงๆ) โดยเราจะใช้เป็น POST https://jsonplaceholder.typicode.com/posts
และโค้ดที่เราจะเขียนจะมีลักษณะประมาณด้านล่าง
serializeJson(doc,json);การแปลง DynamicJsonDocument -> string JSONhttp.addHeader("Content-Type","application/json");บอกลักษณะของ Content ที่เราจะส่งไปหา serverint httpResponseCode = http.POST(json);http request ไปยัง url ด้วย method POST และนำ http status code ที่ได้มาเก็บไว้ที่ httpResponseCode
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const String baseUrl = "https://jsonplaceholder.typicode.com/";
void Connect_Wifi();
void POST_post(){
String json;
DynamicJsonDocument doc(2048);
doc["userId"] = 1;
doc["title"] = "Exceed AHHHHHH";
doc["body"] = "THIS IS BODY";
serializeJson(doc,json);
const String url = baseUrl + "posts";
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type","application/json");
int httpResponseCode = http.POST(json);
if (httpResponseCode >= 200 && httpResponseCode < 300) {
Serial.print("HTTP ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
POST_post();
}
void loop() {
}
ซึ่งถ้าทำงานถูกต้อง จะต้องขึ้นประมาณนี้ครับ
Connecting to WiFi.....OK! IP=10.10.0.2
HTTP 201
PUT
เราจะมาลองใช้ post เพื่อส่งข้อมูลไปแก้ไข post หมายเลข 1 กันครับ (แต่มันจะส่งผลลัพธ์มาเพียงแค่ http request สำเร็จไหม โดยไม่ได้มีแก้ค่าใน database จริงๆ) โดยเราจะใช้เป็น PUT https://jsonplaceholder.typicode.com/posts/1 และใช้โค้ดที่แทบไม่แตกต่างจาก POST เลย ดังด้านล่างนี้
int httpResponseCode = http.POST(json);http request ไปยัง url ด้วย method PUT และนำ http status code ที่ได้มาเก็บไว้ที่ httpResponseCode
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const String baseUrl = "https://jsonplaceholder.typicode.com/";
void Connect_Wifi();
void PUT_post(){
String json;
DynamicJsonDocument doc(2048);
doc["userId"] = 1;
doc["title"] = "Exceed AHHHHHH 22";
doc["body"] = "THIS IS BODY XXX";
doc["id"] = 1;
serializeJson(doc,json);
const String url = baseUrl + "posts/1";
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type","application/json");
int httpResponseCode = http.PUT(json);
if (httpResponseCode >= 200 && httpResponseCode < 300) {
Serial.print("HTTP ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
}
void setup() {
Serial.begin(115200);
Connect_Wifi();
PUT_post();
}
void loop() {
}
ซึ่งถ้าทำงานถูกต้อง จะต้องขึ้นประมาณนี้ครับ
Connecting to WiFi.....OK! IP=10.10.0.2
HTTP 200
เราจะเห็นว่ามีการเติมส่วนของ id เข้าไป เพื่อให้ครบทุก field ที่จำเป็นในการ update ข้อมูลแบบ PUT แต่ถ้าลองเอาออกไป ก็ได้ HTTP 200 ด้วยเช่นกัน ทั้งนี้คำถามที่ว่าเราควรส่งไปแบบไหน เราควรสอบถามทางฝั่ง backend อีกทีนึงนั่นเอง
DELETE
HttpClient.h นั้นไม่มี method delete อ้างอิงจากอันนี้ ถ้าหากต้องการจะใช้ เราสามารถใช้การ post หรือ put แทนได้ โดยต้องคุยกับ backend ให้ดีว่าจะใช้ endpoint แบบไหนนั่นเอง

