使用 libpq 庫連接數據庫

在這個項目中,我們使用了 libpq,這是 PostgreSQL 官方提供的 C 庫。它允許開發者直接連接到數據庫,執行查詢,并高效地操作結果。雖然 C 語言需要開發者更加關注內存管理和數據結構,但 libpq 提供了對數據庫通信的完全控制,避免了高級語言中常見的抽象層。這使得它非常適合需要高性能和細粒度數據庫控制的應用程序。


項目初始化:創建一個簡單的 HTTP 服務器

在項目中,我們使用了 libmicrohttpd 庫來設置一個簡單的 HTTP 服務器。以下是初始化服務器的代碼示例:

#include 
#include 
#include 
#include "headers/handler.h"

#define PORT 8080

int main() {
 printf("Starting server on port %dn", PORT);

 struct MHD_Daemon *daemon;

 daemon = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION, PORT, NULL, NULL,
 &default_handler, NULL, MHD_OPTION_END);
 if (!daemon)
 return 1;

 while (1)
 sleep(1);

 MHD_stop_daemon(daemon);

 return 0;
}

在這段代碼中,我們通過 libmicrohttpd 庫啟動了一個監聽 8080 端口的 HTTP 服務器。MHD_USE_THREAD_PER_CONNECTION 標志確保每個連接都在單獨的線程中處理。default_handler 函數用于處理所有傳入的請求,而 while 循環則保持服務器運行,直到被手動中斷。


處理 HTTP 請求的核心邏輯

以下是 default_handler 函數的實現,它負責處理 HTTP 服務器的傳入請求:

enum MHD_Result default_handler(
 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) {

 char *url_str = (char *)url;
 char *method_str = (char *)method;
 int ret;

 struct MHD_Response *response;
 HTTP_response response_api;

 log_api(url_str, method_str); // 記錄請求的 URL 和方法

 TRY {
 if (strcmp(url_str, "/") == 0) {
 response_api = (HTTP_response){
 .body = simple_message("Hello world!"),
 .status = OK
 };
 } else if (validate_route(url_str, "/users")) {
 response_api = user_router(url_str, method_str, upload_data);
 } else {
 response_api = (HTTP_response){
 .body = simple_message("Not found"),
 .status = NOT_FOUND
 };
 }
 } CATCH {
 response_api = (HTTP_response){
 .body = simple_message("Internal server error"),
 .status = INTERNAL_SERVER_ERROR
 };

 printf("Internal server error");
 }

 response = HTTP_build_response_JSON(response_api.body); // 構建 JSON 格式的 HTTP 響應

 if (!response)
 return MHD_NO;

 ret = MHD_queue_response(connection, response_api.status, response); // 將響應加入隊列
 MHD_destroy_response(response); // 釋放響應內存

 return ret; // 返回結果
}

函數解析:

  1. 記錄請求信息:函數首先通過 log_api 記錄請求的 URL 和方法。
  2. 路由處理
  3. 錯誤處理:如果在處理過程中發生錯誤,返回狀態碼 500 Internal Server Error,并在控制臺打印錯誤日志。
  4. 構建響應:使用 HTTP_build_response_JSON 函數將響應數據格式化為 JSON,并將其發送到客戶端。

項目擴展建議

通過上述代碼,您已經了解了如何使用 C 語言創建一個簡單的 REST API。接下來,您可以基于此進一步擴展功能,例如:


總結

本文展示了如何使用 C 語言創建一個簡單的 REST API,包括如何設置 HTTP 服務器、處理請求以及構建 JSON 響應等內容。雖然 C 語言在開發 REST API 時需要更多的底層操作,但它提供了極高的性能和靈活性,非常適合需要精細控制的場景。

如果您對本文內容感興趣,建議訪問 rest-api-c 存儲庫,進一步了解其實現細節,并嘗試構建自己的 REST API!


原文鏈接: https://pedrofnseca.medium.com/how-to-create-an-rest-api-using-c-9150882320d4

上一篇:

使用PHP構建簡單的REST API

下一篇:

rest api 指南:使用 python 和 flask 構建
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費