REST API merupakan salah satu metode komunikasi yang paling banyak digunakan dalam pengembangan aplikasi modern. Dengan REST API, ESP32 dapat bertindak sebagai server yang menerima permintaan (request) dari aplikasi lain, kemudian mengirimkan respons (response) dalam format JSON (JavaScript Object Notation). Format ini ringan, mudah diproses, dan didukung oleh hampir semua bahasa pemrograman serta platform, mulai dari aplikasi web hingga aplikasi mobile. Library mWebSockets menyediakan contoh program WebServerJson yang menunjukkan cara membangun REST API sederhana pada ESP32. Contoh ini mencakup proses menerima permintaan GET dan POST, membaca data JSON yang dikirim oleh klien, serta mengembalikan respons JSON lengkap dengan kode status HTTP yang sesuai. Melalui contoh ini, Anda dapat memahami dasar pembuatan REST API pada ESP32 yang nantinya dapat dikembangkan untuk berbagai kebutuhan, seperti sistem monitoring, Internet of Things (IoT), otomasi rumah, maupun komunikasi dengan aplikasi web.
Fitur WebServerJson
Contoh WebServerJson memiliki beberapa fitur utama sebagai berikut:
- Membuat REST API Endpoint pada ESP32.
- Menangani permintaan GET dan POST.
- Menerima serta memproses data dalam format JSON.
- Mengirimkan respons JSON dengan kode status HTTP yang sesuai.
- Menampilkan pesan kesalahan (error) dalam format JSON jika terjadi kesalahan pada permintaan.
- Mendukung Cross-Origin Resource Sharing (CORS) sehingga API dapat diakses oleh aplikasi dari domain yang berbeda.
Perangkat Keras yang Dibutuhkan
- Modul ESP32 ESP-WROOM-32 Dev Board 38 Pin
- Kabel USB
Menginstal Library mWebSockets
Sebelum menjalankan contoh program, pastikan library mWebSockets telah terpasang pada Arduino IDE. Ikuti langkah-langkah berikut:
1. Hubungkan board ESP32 ke komputer menggunakan kabel USB.
2. Jalankan Arduino IDE.
3. Pilih jenis board ESP32 melalui menu Tools → Board, kemudian pilih port COM yang sesuai melalui Tools → Port.
4. Buka Library Manager dengan mengklik ikon Library Manager pada panel sebelah kiri Arduino IDE.
5. Cari library Web Server for ESP32 yang dikembangkan oleh DIYables (mWebSockets).
6. Klik tombol Install, kemudian tunggu hingga proses instalasi selesai.
Membuka Contoh Program WebServerJson
Setelah library berhasil diinstal, buka contoh program bawaan dengan langkah berikut:
File → Examples → DIYables EP32 WebServer → WebServerJson
Sketch tersebut sudah berisi implementasi REST API sederhana yang dapat langsung dijalankan pada ESP32.
Mengenal Endpoint REST API
Contoh program ini menyediakan sebuah endpoint utama yang dapat diakses menggunakan metode GET maupun POST.
1. Endpoint GET /api/data
Endpoint ini digunakan untuk mengambil informasi dari ESP32. Ketika browser atau aplikasi mengirimkan permintaan menggunakan metode GET, ESP32 akan mengembalikan respons JSON yang berisi status, pesan, serta nilai timestamp.
Respons:
{
"status": "success",
"message": "GET request received",
"timestamp": 12345
}
Nilai timestamp berasal dari fungsi millis(), yaitu jumlah waktu dalam satuan milidetik sejak ESP32 mulai menjalankan program. Nilai ini sering digunakan untuk mengetahui lama waktu sistem telah aktif (uptime).
2. Endpoint POST /api/data
Selain menerima permintaan GET, endpoint yang sama juga dapat menerima data menggunakan metode POST. Pada metode ini, klien mengirimkan data dalam format JSON melalui body request. ESP32 kemudian membaca data tersebut, memprosesnya, lalu mengembalikan respons JSON yang berisi informasi bahwa data telah berhasil diterima. Contoh request yang dikirim:
{
"key": "your_value"
}
Contoh response yang diterima:
{
"status": "success",
"message": "Data received",
"received_key": "your_value"
}
Pada contoh di atas, nilai key yang dikirim oleh klien akan dibaca oleh ESP32, kemudian dikembalikan kembali pada bagian received_key sebagai tanda bahwa data berhasil diproses.
Konfigurasi Jaringan WiFi
Sebelum mengunggah program ke ESP32, ubah terlebih dahulu informasi jaringan WiFi pada file WebServerJson.ino. Masukkan SSID dan password sesuai dengan jaringan WiFi yang akan digunakan oleh ESP32.
const char WIFI_SSID[] = "YOUR_WIFI_SSID";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
Pastikan jaringan WiFi yang digunakan memiliki koneksi yang stabil karena seluruh komunikasi REST API dilakukan melalui jaringan tersebut.
Mengunggah Program ke ESP32
Setelah konfigurasi WiFi selesai dilakukan, unggah sketch ke board ESP32 menggunakan Arduino IDE. Langkah-langkahnya sebagai berikut:
1. Hubungkan ESP32 ke komputer menggunakan kabel USB.
2. Pastikan board dan port COM telah dipilih dengan benar.
3. Klik tombol Upload pada Arduino IDE.
4. Tunggu hingga proses kompilasi dan upload selesai.
5. Buka Serial Monitor dengan baud rate 9600.
6. Tunggu hingga ESP32 berhasil terhubung ke jaringan WiFi.
7. Setelah koneksi berhasil, Serial Monitor akan menampilkan alamat IP ESP32.
Alamat IP tersebut akan digunakan sebagai alamat server REST API yang nantinya diakses melalui browser, Postman, cURL, maupun aplikasi lainnya. Jika alamat IP tidak muncul, tekan tombol EN atau Reset pada board ESP32, kemudian tunggu hingga proses koneksi WiFi selesai.
Menguji REST API ESP32 Menggunakan cURL
Setelah ESP32 berhasil terhubung ke jaringan WiFi dan alamat IP telah muncul pada Serial Monitor, langkah berikutnya adalah menguji apakah REST API telah berfungsi dengan baik. Salah satu cara termudah untuk mengujinya adalah menggunakan cURL. cURL merupakan utilitas berbasis command line yang dapat digunakan untuk mengirim berbagai jenis permintaan HTTP, seperti GET, POST, PUT, maupun DELETE.
Catatan: Ganti your-esp32-ip pada setiap contoh berikut dengan alamat IP ESP32 yang ditampilkan pada Serial Monitor.
1. Menguji Endpoint GET
Pengujian pertama dilakukan menggunakan metode GET untuk mengambil data dari endpoint /api/data. Jalankan perintah berikut:
curl -X GET http://your-esp32-ip/api/data
Nilai timestamp yang ditampilkan merupakan hasil dari fungsi millis(), yaitu jumlah waktu dalam satuan milidetik sejak ESP32 mulai menjalankan program.
2. Menguji Endpoint POST dengan Data JSON
Selain menerima permintaan GET, endpoint yang sama juga dapat menerima data JSON menggunakan metode POST. Jalankan perintah berikut:
curl -X POST http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{\"key\": \"test_value\"}"
Perintah tersebut mengirimkan objek JSON yang berisi pasangan key dan value ke ESP32. Respons tersebut menunjukkan bahwa data berhasil diterima, kemudian nilai yang dikirim akan ditampilkan kembali pada bagian received_key.
3. Menguji POST dengan Nilai yang Berbeda
Untuk memastikan server dapat memproses data lain, ubah nilai key menjadi nilai yang berbeda.
curl -X POST http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{\"key\": \"hello_world\"}"
Jika nilai received_key berubah sesuai data yang dikirim, berarti proses parsing JSON berjalan dengan benar.
4. Menguji JSON yang Tidak Valid
REST API juga harus mampu mendeteksi kesalahan format data yang dikirim oleh klien. Cobalah mengirim data JSON yang tidak sesuai dengan sintaks JSON.
curl -X POST http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{invalid json}"
ESP32 akan mengembalikan pesan kesalahan yang menunjukkan bahwa format JSON tidak dapat diproses.
5. Menguji Permintaan POST Tanpa Body JSON
Selain format JSON yang salah, Anda juga perlu menguji kondisi ketika permintaan POST dikirim tanpa menyertakan body JSON. Gunakan perintah berikut:
curl -X POST http://your-esp32-ip/api/data
Pada kondisi ini, server akan mengembalikan respons kesalahan karena tidak ada data JSON yang diterima.
6. Menguji Metode HTTP yang Tidak Didukung
Endpoint /api/data hanya mendukung metode GET dan POST. Oleh karena itu, jika klien menggunakan metode HTTP lain, server akan mengembalikan pesan kesalahan. Sebagai contoh, jalankan perintah berikut:
curl -X PUT http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{\"key\": \"test\"}"
Server akan mengembalikan kode status 405 Method Not Allowed, yang menunjukkan bahwa metode HTTP tersebut tidak didukung oleh endpoint.
7. Menguji Endpoint yang Tidak Tersedia
Selain metode HTTP, Anda juga perlu memastikan server dapat menangani permintaan menuju endpoint yang tidak tersedia. Gunakan perintah berikut:
curl -X GET http://your-esp32-ip/api/nonexistent
Server akan mengembalikan halaman 404 Not Found, yang menandakan bahwa endpoint yang diminta tidak ditemukan.
Menguji REST API Menggunakan Postman
Selain menggunakan cURL, REST API juga dapat diuji melalui Postman. Aplikasi ini menyediakan antarmuka grafis (Graphical User Interface) sehingga proses pengujian menjadi lebih mudah tanpa perlu mengetik perintah pada terminal.
1. Pengujian Endpoint GET
Ikuti langkah-langkah berikut.
- Buka aplikasi Postman.
- Buat Request baru dengan metode GET.
- Masukkan URL berikut:
http://your-esp32-ip/api/data
- Klik tombol Send.
Jika berhasil, Postman akan menampilkan respons JSON yang berisi informasi status, message, dan timestamp.
Pastikan seluruh data tersebut muncul sesuai dengan respons yang dikirim oleh ESP32.
2. Pengujian Endpoint POST
Selanjutnya, lakukan pengujian menggunakan metode POST.
- Buat Request baru dengan metode POST.
- Masukkan URL berikut:
http://your-esp32-ip/api/data
- Buka tab Headers, kemudian tambahkan header berikut:
- Buka tab Body.
- Pilih raw, kemudian ubah format menjadi JSON.
- Masukkan data berikut:
{
"key": "test_value"
}
- Klik tombol Send.
Jika konfigurasi sudah benar, Postman akan menampilkan respons JSON yang berisi nilai received_key sesuai dengan data yang dikirim.
Menguji Respons Kesalahan (Error Response)
Selain memastikan API dapat menerima permintaan yang benar, Anda juga perlu menguji bagaimana server menangani permintaan yang tidak valid. Pengujian ini penting untuk memastikan aplikasi mampu memberikan informasi kesalahan yang jelas kepada pengguna maupun aplikasi klien.
1. POST Tanpa Data JSON
Jalankan perintah berikut:
curl -X POST http://your-esp32-ip/api/data
Respons yang diharapkan.
{
"status": "error",
"message": "No JSON data received"
}
Respons tersebut menunjukkan bahwa server tidak menemukan data JSON pada body permintaan.
2. Format JSON Tidak Valid
Jalankan perintah berikut:
curl -X POST http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{invalid json}"
Respons yang diharapkan.
{
"status": "error",
"message": "Invalid JSON"
}
Kesalahan ini muncul ketika struktur JSON yang dikirim tidak sesuai dengan aturan sintaks JSON.
3. Field key Tidak Dikirim
Server juga dapat menerima JSON yang tidak memiliki field key.
Sebagai contoh:
curl -X POST http://your-esp32-ip/api/data -H "Content-Type: application/json" -d "{\"other_field\": \"value\"}"
Pada sketch contoh, field key akan menggunakan nilai bawaan (default value) yaitu:
doc["key"] | "none"
Artinya, jika field key tidak ditemukan, server akan menggunakan nilai "none" sehingga proses tetap dapat dilanjutkan tanpa menyebabkan program mengalami error.
4. Metode HTTP Tidak Didukung
Jalankan perintah berikut:
curl -X DELETE http://your-esp32-ip/api/data
Respons yang diharapkan.
{
"status": "error",
"message": "Method not allowed"
}
Respons tersebut menunjukkan bahwa endpoint hanya menerima metode HTTP tertentu, sedangkan metode DELETE tidak termasuk metode yang didukung.
Memahami Struktur Kode WebServerJson
Setelah berhasil menjalankan REST API, langkah berikutnya adalah memahami bagaimana program tersebut bekerja. Dengan memahami struktur kode, Anda akan lebih mudah menambahkan endpoint baru, memproses data JSON yang lebih kompleks, maupun mengintegrasikan ESP32 dengan aplikasi lain.
1. Mendaftarkan Endpoint REST API
Setiap endpoint yang akan diakses oleh klien harus terlebih dahulu didaftarkan pada web server. Contoh berikut menunjukkan proses pendaftaran endpoint /api/data.
// Configure API routes
server.addRoute("/api/data", handleApiData);
Kode di atas memiliki dua parameter utama, yaitu:
- /api/data merupakan URL endpoint yang akan diakses oleh klien.
- handleApiData merupakan fungsi handler yang akan dijalankan setiap kali endpoint tersebut menerima permintaan HTTP.
Dengan mekanisme ini, setiap permintaan menuju /api/data akan diproses oleh fungsi handleApiData().
2. Memahami Fungsi Handler
Pada library mWebSockets, setiap endpoint memiliki sebuah fungsi handler yang bertugas menerima dan memproses permintaan dari klien. Bentuk dasar fungsi handler adalah sebagai berikut:
void handleApiData(WiFiClient& client,
const String& method,
const String& request,
const QueryParams& params,
const String& jsonData)
{
// Handler implementation
}
Setiap parameter memiliki fungsi yang berbeda.
Melalui parameter-parameter tersebut, ESP32 dapat menentukan jenis permintaan yang diterima, membaca data yang dikirim, kemudian menghasilkan respons yang sesuai.
3. Mendeteksi Metode HTTP dan Memproses JSON
Setelah permintaan diterima oleh fungsi handler, program akan memeriksa metode HTTP yang digunakan. Jika metode yang diterima adalah GET, server akan mengirimkan informasi yang diminta tanpa membaca body permintaan. Sebaliknya, jika metode yang digunakan adalah POST, server akan membaca isi body request, melakukan parsing data JSON, kemudian memproses informasi tersebut sebelum mengirimkan respons kembali kepada klien. Proses pemeriksaan metode HTTP, parsing JSON, serta pembuatan respons dilakukan pada bagian kode berikut:
void handleApiData(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
Serial.print("[API] ");
Serial.print(method);
Serial.print(" request received");
if (method == "POST") {
if (jsonData.length() == 0) {
Serial.println("Error: No JSON data received");
client.println("HTTP/1.1 400 Bad Request");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
client.print("{\"status\": \"error\",\"message\": \"No JSON data received\"}");
return;
}
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, jsonData);
if (!error) {
const char* key = doc["key"] | "none";
String response = JSON_RESPONSE;
response.replace("%KEY%", key);
server.sendResponse(client, response.c_str(), "application/json");
} else {
client.println("HTTP/1.1 400 Bad Request");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
client.print("{\"status\": \"error\",\"message\": \"Invalid JSON\"}");
}
} else if (method == "GET") {
String response = JSON_GET_RESPONSE;
response.replace("%TIMESTAMP%", String(millis()));
server.sendResponse(client, response.c_str(), "application/json");
} else {
client.println("HTTP/1.1 405 Method Not Allowed");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
client.print("{\"status\":\"error\",\"message\":\"Method not allowed\"}");
}
}
Pada tahap ini biasanya digunakan library ArduinoJson untuk mengubah data JSON menjadi objek yang dapat dibaca dan diolah oleh program ESP32.
Contoh Integrasi dengan JavaScript
REST API yang dibuat pada ESP32 dapat diakses langsung dari aplikasi web menggunakan JavaScript.
Melalui JavaScript, browser dapat mengirim permintaan HTTP ke ESP32 menggunakan Fetch API, kemudian menampilkan respons JSON yang diterima. Contoh implementasinya adalah sebagai berikut:
// Control LED
async function controlLED(action) {
try {
const response = await fetch('http://your-esp32-ip/api/led', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ action: action })
});
const result = await response.json();
console.log('LED control result:', result);
} catch (error) {
console.error('Error:', error);
}
}
// Get sensor data
async function getSensorData() {
try {
const response = await fetch('http://your-esp32-ip/api/sensor');
const data = await response.json();
console.log('Sensor data:', data);
} catch (error) {
console.error('Error:', error);
}
}
Pendekatan ini sangat cocok digunakan untuk membuat dashboard monitoring, panel kontrol perangkat IoT, maupun aplikasi web berbasis browser yang berkomunikasi langsung dengan ESP32.
Contoh Integrasi dengan Python
Selain JavaScript, REST API ESP32 juga dapat diakses menggunakan Python. Salah satu library yang paling banyak digunakan adalah requests, karena mampu mengirim permintaan HTTP dengan sintaks yang sederhana. Contoh berikut memperlihatkan bagaimana mengirim permintaan POST untuk mengontrol perangkat, kemudian menggunakan GET untuk membaca status perangkat.
import requests
import json
# LED Control
def control_led(action):
url = "http://your-esp32-ip/api/led"
data = {"action": action}
response = requests.post(url, json=data)
return response.json()
# Get Status
def get_status():
url = "http://your-esp32-ip/api/status"
response = requests.get(url)
return response.json()
# Penggunaan
result = control_led("on")
print(result)
status = get_status()
print(status)
Pada contoh di atas:
- Fungsi control_led() digunakan untuk mengirim perintah ke ESP32 menggunakan metode POST.
- Fungsi get_status() digunakan untuk mengambil status perangkat melalui metode GET.
- Library requests secara otomatis mengubah objek Python menjadi JSON ketika parameter json= digunakan.
Contoh seperti ini banyak digunakan pada aplikasi desktop, sistem monitoring, maupun server backend yang perlu berkomunikasi dengan ESP32 melalui REST API.
Memahami HTTP Status Code
REST API menggunakan HTTP Status Code untuk menunjukkan apakah suatu permintaan berhasil diproses atau mengalami kesalahan. Berikut beberapa kode status yang digunakan pada contoh WebServerJson.
Memahami kode status HTTP akan mempermudah proses debugging, karena klien dapat mengetahui penyebab kegagalan hanya dari respons yang diterima.
Memahami Format Respons Error
Selain mengembalikan kode status HTTP, server juga mengirimkan pesan kesalahan dalam format JSON. Cara ini memudahkan aplikasi klien untuk membaca penyebab error secara otomatis.
1. Tidak Ada Data JSON yang Diterima
Jika permintaan POST dikirim tanpa body JSON, server akan mengembalikan respons berikut:
{
"status": "error",
"message": "No JSON data received"
}
Respons tersebut menunjukkan bahwa server tidak menemukan data JSON pada body permintaan.
2. Format JSON Tidak Valid
Jika sintaks JSON yang dikirim tidak sesuai dengan aturan JSON, server akan menghasilkan respons berikut:
{
"status": "error",
"message": "Invalid JSON"
}
Kesalahan ini umumnya terjadi karena terdapat tanda kurung, tanda kutip, atau format penulisan JSON yang tidak lengkap.
3. Metode HTTP Tidak Didukung
Jika klien menggunakan metode HTTP yang tidak didukung, misalnya PUT, DELETE, atau PATCH, server akan mengirimkan respons berikut:
{
"status": "error",
"message": "Method not allowed"
}
Pesan tersebut menunjukkan bahwa endpoint hanya menerima metode HTTP tertentu sesuai dengan implementasi pada program.
4. Endpoint Tidak Ditemukan
Jika klien mengakses URL yang tidak tersedia pada server, ESP32 akan menampilkan halaman 404 Not Found.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>404 Not Found</title>
</head>
<body>
<h1>404 - Page Not Found</h1>
<p>Method: [HTTP_METHOD]</p>
<p>Sorry, we couldn't find that page!</p>
<a href="/">Return to Home</a>
</body>
</html>
Halaman tersebut akan dikirim ketika endpoint yang diminta belum didaftarkan pada web server atau URL yang diakses salah.
Mengembangkan REST API Sesuai Kebutuhan
Contoh WebServerJson dapat dijadikan sebagai dasar untuk membangun REST API yang lebih kompleks. Setelah memahami cara kerja endpoint dan fungsi handler, Anda dapat menambahkan endpoint baru untuk mengontrol perangkat, membaca sensor, maupun mengirimkan berbagai informasi dari ESP32.
1. Menambahkan Endpoint Baru
Untuk menambahkan endpoint baru, langkah pertama adalah membuat fungsi handler yang akan menangani permintaan HTTP dari klien. Sebagai contoh, Anda dapat membuat endpoint baru untuk mengontrol LED, membaca status sensor, atau mengaktifkan relay. Implementasi fungsi handler dapat dibuat seperti berikut:
// Create additional handler for a new endpoint
void handleApiStatus(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
if (method == "GET") {
String json = "{\"status\":\"online\",\"uptime\":" + String(millis() / 1000) + "}";
server.sendResponse(client, json.c_str(), "application/json");
} else {
client.println("HTTP/1.1 405 Method Not Allowed");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
client.print("{\"status\":\"error\",\"message\":\"Method not allowed\"}");
}
}
// Register the new route in setup()
server.addRoute("/api/status", handleApiStatus);
Setelah fungsi handler selesai dibuat, daftarkan endpoint tersebut ke web server menggunakan fungsi addRoute() sehingga endpoint dapat diakses oleh klien. Dengan cara ini, Anda dapat menambahkan beberapa endpoint sekaligus, misalnya:
- /api/led
- /api/status
- /api/relay
- /api/sensor
Masing-masing endpoint dapat memiliki fungsi yang berbeda sesuai kebutuhan aplikasi.
2. Membuat Template Respons JSON
Pada aplikasi yang memiliki banyak endpoint, sebaiknya gunakan format respons JSON yang konsisten. Hal ini akan mempermudah aplikasi klien dalam membaca data yang diterima. Sebagai contoh, seluruh endpoint dapat menggunakan struktur respons seperti berikut:
{
"status": "success",
"message": "...",
"data": {
...
}
}
Dengan format tersebut, setiap respons memiliki susunan yang sama sehingga proses pengolahan data pada aplikasi web maupun aplikasi mobile menjadi lebih sederhana. Contoh implementasi template respons dapat dilihat pada bagian berikut:
const char JSON_RESPONSE[] PROGMEM = R"rawliteral(
{
"status": "success",
"message": "Data received",
"received_key": "%KEY%"
}
)rawliteral";
// Usage in handler
String response = JSON_RESPONSE;
response.replace("%KEY%", extractedValue);
server.sendResponse(client, response.c_str(), "application/json");
Pemecahan Masalah (Troubleshooting)
Selama proses pengembangan REST API, terdapat beberapa kendala yang sering ditemui. Berikut beberapa penyebab beserta solusi yang dapat dilakukan:
1. ESP32 Tidak Dapat Diakses Melalui Endpoint API
Jika endpoint REST API tidak dapat diakses dari browser, Postman, maupun cURL, lakukan beberapa pemeriksaan berikut:
- Pastikan ESP32 telah berhasil terhubung ke jaringan WiFi dengan memeriksa informasi pada Serial Monitor.
- Pastikan komputer atau perangkat klien berada pada jaringan WiFi yang sama dengan ESP32.
- Gunakan alamat IP yang benar sesuai dengan yang ditampilkan pada Serial Monitor.
- Jika ESP32 melakukan restart, periksa kembali alamat IP yang digunakan karena alamat tersebut dapat berubah jika tidak menggunakan IP statis (Static IP).
- Pastikan firewall atau konfigurasi jaringan tidak memblokir komunikasi antara klien dan ESP32.
2. Muncul Pesan "Invalid JSON"
Jika server mengembalikan pesan "Invalid JSON", berarti data yang diterima tidak dapat diproses karena formatnya tidak sesuai dengan aturan JSON. Beberapa hal yang perlu diperiksa antara lain:
- Pastikan header Content-Type diatur menjadi application/json.
- Periksa kembali struktur JSON yang dikirim, termasuk penggunaan tanda kurung, tanda kutip, dan tanda koma.
- Pastikan karakter khusus telah ditulis atau di-escape dengan benar jika diperlukan.
- Hindari mengirim payload JSON yang melebihi kapasitas maksimum yang didukung oleh program (sekitar 200 byte pada contoh ini).
3. Permintaan POST Selalu Menghasilkan Pesan "No JSON Data Received"
Jika server selalu menampilkan pesan "No JSON data received", kemungkinan body permintaan belum dikirim atau tidak terbaca oleh server. Untuk mengatasinya, lakukan pemeriksaan berikut:
- Pastikan metode HTTP yang digunakan adalah POST.
- Pastikan data JSON dikirim melalui body request, bukan melalui URL.
- Periksa apakah nilai Content-Length sesuai dengan ukuran data yang dikirim.
- Cobalah menggunakan payload sederhana seperti berikut untuk memastikan endpoint berfungsi dengan baik.
{
"key": "test"
}
Jika payload sederhana dapat diproses, berarti masalah kemungkinan berasal dari format JSON yang dikirim sebelumnya.
4. ESP32 Mengalami Hang atau Tidak Merespons
REST API yang memproses data JSON secara terus-menerus dapat meningkatkan penggunaan memori pada ESP32. Jika memori hampir habis, perangkat dapat menjadi lambat, hang, bahkan melakukan restart secara otomatis. Beberapa langkah yang dapat dilakukan untuk mengurangi penggunaan memori adalah sebagai berikut:
- Pantau penggunaan memori selama program berjalan.
- Hindari membuat objek JSON yang berukuran terlalu besar jika tidak diperlukan.
- Gunakan DynamicJsonDocument jika ukuran data JSON bersifat dinamis dan berubah-ubah.
- Pastikan tidak terjadi kebocoran memori (memory leak) pada fungsi handler yang dibuat sendiri.
- Hapus objek atau variabel yang sudah tidak digunakan agar memori dapat dimanfaatkan kembali.
Tips Mengoptimalkan Performa REST API pada ESP32
Selain memastikan program berjalan dengan benar, performa REST API juga perlu diperhatikan agar ESP32 mampu menangani permintaan HTTP secara lebih efisien.
1. Mengoptimalkan Pemrosesan JSON
Proses parsing JSON merupakan salah satu bagian yang paling banyak menggunakan memori. Oleh karena itu, usahakan hanya membaca data yang benar-benar diperlukan. Contoh implementasinya dapat dilihat pada bagian berikut:
// Use appropriate document size for your data
StaticJsonDocument<200> doc; // For small JSON objects
StaticJsonDocument<1024> doc; // For larger JSON objects
// Reuse string objects to reduce memory allocation
String response;
response.reserve(256); // Pre-allocate space
response = JSON_RESPONSE;
response.replace("%KEY%", value);
Beberapa tips yang dapat diterapkan antara lain:
- Hindari membuat objek JSON yang terlalu besar.
- Gunakan kapasitas JsonDocument sesuai ukuran payload yang diproses.
- Kurangi proses parsing berulang jika data yang diterima tidak berubah.
- Gunakan struktur JSON yang sederhana agar waktu pemrosesan menjadi lebih cepat.
2. Mengirim Respons Secara Efisien
Selain proses parsing, pembuatan respons JSON juga memengaruhi performa aplikasi. Contoh implementasi dapat dilihat pada bagian berikut:
// Send responses directly for simple cases
client.print(F("{\"status\":\"ok\",\"value\":"));
client.print(sensorValue);
client.print(F("}"));
// Use PROGMEM for large static responses
const char LARGE_RESPONSE[] PROGMEM = R"({
"status": "success",
"data": { ... }
})";
Agar proses pengiriman data lebih efisien, perhatikan beberapa hal berikut:
- Hindari mengirim data yang tidak diperlukan pada setiap respons.
- Gunakan format JSON yang ringkas sehingga ukuran payload menjadi lebih kecil.
- Manfaatkan kembali template respons JSON yang sama pada seluruh endpoint untuk mengurangi kompleksitas kode.
- Batasi ukuran respons agar waktu transmisi melalui jaringan menjadi lebih cepat.
Baca juga: Membuat Web Server ESP32 dengan WebSocket untuk Komunikasi Real-Time
Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.
- Diskusi umum dan tanya jawab praktik: https://t.me/edukasielektronika
- Kendala spesifik dan kasus tertentu: http://bit.ly/Chatarduino






0 Komentar