Skip to main content

Communicate with REST Api

· 28 min read
P'Stamp
P'Champ

สวัสดีครับ ในวันนี้เราจะมาดูในส่วนของการติดต่อสื่อสารระหว่าง 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 อยู่ข้างในแล้ว)

คำสั่งสำหรับใช้งาน

src/main.cpp
#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 ได้ตามตารางด้านล่าง
GETPOSTPUTPATCHDELETE
Can use body ?NOYESYESYESYES

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ความหมาย
200Ok เป็นมาตรฐานของ HTTP Response นั้น Success สำหรับ GET, PUT หรือ POST
201Create เป็น Response สำหรับข้อมูลใหม่ได้ถูกสร้างขึ้น ใช้สำหรับ POST

4xx: client error

Codeความหมาย
400Bad Request บอกว่า request ที่ส่งมาโดย client นั้นไม่ถูกดำเนินการ และ Server ไม่เข้าใจว่า request เกี่ยวกับอะไร
401Unauthorized บอกว่า client ไม่ได้รับอนุญาตในการเข้าถึงข้อมูลและควรจะส่ง credential มาพร้อม request
404Not Found บ่งบอกว่า resource ที่ request มานั้น ไม่ว่างใช้งานตอนนี้

5xx: server error

Codeความหมาย
500Internal Server Error บอกว่าการ request นั้นถูกต้อง แต่ server มีความสับสนและจะบริการด้วยเงื่อนไขที่คาดการไม่ได้
503Service Unavailable บอกว่า server ใช้การไม่ได้ หรือไม่ว่างที่จะรับและดำเนินการ request โดยส่วนใหญ่แล้ว server อยู่ในช่วงบำรุงรักษา

ตัวอย่างการใช้งาน

หลังจากเราได้รู้หลักการคร่าวๆในการทำงานมาแล้ว เราจะไปทำการเขียนโค้ดกันต่อครับ โดยเราจะเขียนโค้ด ให้บอร์ดของเรานั้นติดต่อกับ api ซึ่งจะมีสิ่งที่ต้องเตรียมดังนี้

  • ทำการ connect wifi ของบอร์ดให้เรียบร้อย
  • api ที่เราใช้จะเป็น jsonplaceholder https://jsonplaceholder.typicode.com/ ซึ่งเป็น api ที่เอาไว้สำหรับทดสอบครับ

เรามาเริ่มกันที่การ connect wifi กันก่อนครับ และ ต่อจากนี้พี่จะขอไม่แสดงโค้ดตัวแปรและฟังก์ชันในส่วนของการเชื่อมต่อ wifi เพื่อให้โค้ดที่น้องๆอ่านมีน้อยลงนะครับ*

src/main.cpp
#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 -> JSON
  • deserializeJson(ตัวแปร DynamicJsonDocument,ตัวแปร JSON); คือ การแปลง JSON -> DynamicJsonDocument
  • สามารถดูรายละเอียดเพิ่มเติมได้ที่
src/main.cpp
#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/ นั่นเอง
src/main.cpp
#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 แบบ dictionary
  • const String url = baseUrl + "posts/1"; สร้าง endpoint url
  • HTTPClient http; สร้างตัวแปร http เพื่อใช้งาน http request
  • http.begin(url); เตรียมเป้าหมายการ http request ไปยัง url
  • int httpResponseCode = http.GET(); http request ไปยัง url ด้วย method GET และนำ http status code ที่ได้มาเก็บไว้ที่ httpResponseCode
  • String payload = http.getString(); นำ string JSON ที่เป็นผลลัพธ์ออกมา
  • deserializeJson(doc,payload); การแปลง string JSON -> DynamicJsonDocument
  • (const char*)doc["title"] นำ value ของ key title ออกมาแสดงผล
src/main.cpp
#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); เพื่อนำค่ามันมาให้เราใช้งานได้ง่ายได้เช่นกัน

src/main.cpp
#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 JSON
  • http.addHeader("Content-Type","application/json"); บอกลักษณะของ Content ที่เราจะส่งไปหา server
  • int httpResponseCode = http.POST(json); http request ไปยัง url ด้วย method POST และนำ http status code ที่ได้มาเก็บไว้ที่ httpResponseCode
src/main.cpp
#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
src/main.cpp
#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 แบบไหนนั่นเอง