在 C 語言中,我們可以使用第三方庫或者自己手動編寫代碼來發(fā)送 POST 請求并且以 JSON 格式發(fā)送數(shù)據(jù)。下面我們來分別介紹這兩種方法。
使用第三方庫
使用第三方庫可以簡化發(fā)送 POST 請求的過程,并且避免重復(fù)造輪子。其中比較常用的庫有curl和libcurl。以下是使用curl庫的示例代碼:
#include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/api/users"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"name\": \"John\", \"age\": 30}"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, "Content-Type: application/json"); res = curl_easy_perform(curl); if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }
在上面的代碼中,我們首先使用curl_global_init()來進行全局初始化,然后使用curl_easy_init()來初始化一個請求,設(shè)置請求的URL、請求的BODY和請求的頭部信息,最后使用curl_easy_perform()方法來發(fā)送請求并且接收響應(yīng)。
自己手動編寫
除了使用curl庫之外,我們也可以自己手動編寫發(fā)送POST請求的代碼。以下是示例代碼:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define POST_DATA "{\"name\": \"John\", \"age\": 30}" #define POST_DATA_LEN strlen(POST_DATA) int main(void) { int sockfd, ret; struct sockaddr_in servaddr; char sendbuf[1024]; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd< 0) { perror("ERROR opening socket"); exit(1); } ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret< 0) { perror("ERROR connecting"); exit(1); } snprintf(sendbuf, sizeof(sendbuf), "POST /api/users HTTP/1.1\r\n" "Host: %s:%d\r\n" "Content-Type: application/json\r\n" "Content-Length: %lu\r\n\r\n" "%s" , SERVER_IP, SERVER_PORT, POST_DATA_LEN, POST_DATA); ret = send(sockfd, sendbuf, strlen(sendbuf), 0); if (ret< 0) { perror("ERROR sending request"); exit(1); } // 略過接收響應(yīng)和關(guān)閉 socket 的代碼 return 0; }