1. Pengantar RESTful Web API
RESTful Web API adalah arsitektur yang memungkinkan aplikasi berkomunikasi melalui HTTP dengan menggunakan prinsip REST (Representational State Transfer). API ini menggunakan metode HTTP standar seperti GET, POST, PUT, DELETE untuk operasi CRUD.
RESTful API banyak digunakan untuk membangun layanan backend yang dapat diakses oleh berbagai client seperti web, mobile, dan IoT.
2. Desain RESTful API yang Baik
Desain API yang baik memudahkan penggunaan, pemeliharaan, dan skalabilitas. Berikut prinsip utama:
-
Gunakan URL yang jelas dan konsisten, misal:
/users
untuk resource user.
-
Gunakan metode HTTP sesuai operasi:
GET
untuk baca,
POST
untuk buat,
PUT
untuk update, dan
DELETE
untuk hapus.
-
Gunakan status code HTTP yang tepat, misal 200 OK, 201 Created, 404 Not Found.
-
Gunakan format data JSON untuk request dan response.
-
Sertakan dokumentasi API yang jelas.
3. Membangun RESTful API dengan C
Membangun RESTful API dengan bahasa C memerlukan pemahaman tentang socket programming dan HTTP protocol. Kita akan menggunakan library libmicrohttpd
untuk memudahkan pembuatan HTTP server.
Langkah 1: Instalasi libmicrohttpd
Pada Linux, jalankan perintah berikut:
sudo apt-get install libmicrohttpd-dev
Langkah 2: Membuat HTTP Server Sederhana
#include <microhttpd.h>
#include <string.h>
#include <stdio.h>
#define PORT 8888
int answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls) {
const char *page = "{ \"message\": \"Hello from C REST API\" }";
struct MHD_Response *response;
int ret;
response = MHD_create_response_from_buffer(strlen(page),
(void*) page,
MHD_RESPMEM_PERSISTENT);
MHD_add_response_header(response, "Content-Type", "application/json");
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
return ret;
}
int main() {
struct MHD_Daemon *daemon;
daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL,
&answer_to_connection, NULL, MHD_OPTION_END);
if (NULL == daemon) return 1;
printf("Server berjalan di http://localhost:%d\n", PORT);
getchar();
MHD_stop_daemon(daemon);
return 0;
}
Kompilasi dan jalankan program ini, lalu akses
http://localhost:8888
di browser.
4. Struktur Proyek API di C
Struktur proyek yang rapi memudahkan pengembangan dan pemeliharaan:
rest-api-c/
├── src/
│ ├── main.c
│ ├── handlers.c
│ ├── handlers.h
│ ├── utils.c
│ └── utils.h
├── include/
│ └── api.h
├── Makefile
└── README.md
Pisahkan kode handler endpoint, utilitas, dan definisi header agar modular.
5. Membuat Endpoint CRUD
Contoh membuat endpoint CRUD sederhana untuk resource "users".
Contoh handler GET semua user:
int handle_get_users(struct MHD_Connection *connection) {
const char *response_str = "[{\"id\":1,\"name\":\"Budi\"},{\"id\":2,\"name\":\"Sari\"}]";
struct MHD_Response *response;
int ret;
response = MHD_create_response_from_buffer(strlen(response_str),
(void*) response_str,
MHD_RESPMEM_PERSISTENT);
MHD_add_response_header(response, "Content-Type", "application/json");
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
return ret;
}
Contoh handler POST menambah user (sederhana):
int handle_post_user(struct MHD_Connection *connection, const char *upload_data, size_t *upload_data_size) {
// Parsing dan simpan data user baru (contoh sederhana)
const char *response_str = "{ \"message\": \"User berhasil ditambahkan\" }";
struct MHD_Response *response;
int ret;
if (*upload_data_size != 0) {
// Proses data upload_data di sini
*upload_data_size = 0;
return MHD_YES;
}
response = MHD_create_response_from_buffer(strlen(response_str),
(void*) response_str,
MHD_RESPMEM_PERSISTENT);
MHD_add_response_header(response, "Content-Type", "application/json");
ret = MHD_queue_response(connection, MHD_HTTP_CREATED, response);
MHD_destroy_response(response);
return ret;
}
6. Handling Request dan Response
Pada libmicrohttpd, Anda harus mengelola data request secara manual, termasuk parsing URL, method, dan body.
Contoh pengecekan method dan routing sederhana:
int answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls) {
if (strcmp(method, "GET") == 0 && strcmp(url, "/users") == 0) {
return handle_get_users(connection);
} else if (strcmp(method, "POST") == 0 && strcmp(url, "/users") == 0) {
return handle_post_user(connection, upload_data, upload_data_size);
}
// Tambah routing lain sesuai kebutuhan
const char *not_found = "{ \"error\": \"Not Found\" }";
struct MHD_Response *response = MHD_create_response_from_buffer(strlen(not_found),
(void*) not_found,
MHD_RESPMEM_PERSISTENT);
MHD_add_response_header(response, "Content-Type", "application/json");
int ret = MHD_queue_response(connection, MHD_HTTP_NOT_FOUND, response);
MHD_destroy_response(response);
return ret;
}
7. Konsumsi API dari Client
Setelah API berjalan, client dapat mengaksesnya menggunakan HTTP client seperti curl, Postman, atau aplikasi frontend.
Contoh menggunakan curl untuk GET:
curl -X GET http://localhost:8888/users
Contoh menggunakan curl untuk POST:
curl -X POST http://localhost:8888/users -H "Content-Type: application/json" -d '{"name":"Andi"}'
Anda juga bisa membuat aplikasi frontend menggunakan bahasa apapun untuk konsumsi API ini.
8. Testing dan Debugging API
Testing API penting untuk memastikan semua endpoint berjalan sesuai harapan.
-
Gunakan Postman untuk testing manual endpoint.
-
Gunakan curl untuk testing cepat di terminal.
-
Tambahkan logging di server untuk debugging.
-
Gunakan tools seperti Wireshark untuk analisa paket jika perlu.
9. Deployment API ke Server
Setelah API siap, deploy ke server agar dapat diakses publik.
Beberapa opsi deployment:
-
VPS atau dedicated server dengan Linux
-
Cloud provider seperti AWS EC2, DigitalOcean, Linode
-
Containerize dengan Docker dan deploy ke Kubernetes atau Docker Swarm
Contoh menjalankan program di background dengan
nohup
:
nohup ./rest-api-c &> server.log 2&&1 &