在我們的日常開發(fā)中,經(jīng)常需要使用C語(yǔ)言發(fā)送JSON請(qǐng)求。JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,而C語(yǔ)言是一種底層語(yǔ)言,與網(wǎng)絡(luò)請(qǐng)求相關(guān)的操作需要打包請(qǐng)求和解析返回?cái)?shù)據(jù),這些對(duì)C語(yǔ)言開發(fā)者是常見的手工任務(wù)。
C語(yǔ)言是一種基于過(guò)程的語(yǔ)言,因此我們可以使用C語(yǔ)言發(fā)送HTTP請(qǐng)求來(lái)處理JSON數(shù)據(jù)。要完成特定的HTTP請(qǐng)求,我們需要打開一個(gè)套接字連接,并開啟,將數(shù)據(jù)發(fā)送到服務(wù)器以及處理服務(wù)器返回的數(shù)據(jù)。
#include#include #include #include #include #include #define SERVER_ADDR "httpbin.org" // 服務(wù)器域名 #define SERVER_PORT 80 // 服務(wù)器端口 char const* c_post_message = "{\"foo\": \"bar\"}"; int main(int argc, char**argv) { struct sockaddr_in server; int socket_desc; // 創(chuàng)建套接字 socket_desc=socket(AF_INET, SOCK_STREAM, 0); if (socket_desc == -1) { printf("無(wú)法創(chuàng)建套接字"); return 1; } // 連接服務(wù)器 server.sin_addr.s_addr = inet_addr(SERVER_ADDR); server.sin_family = AF_INET; server.sin_port = htons(SERVER_PORT); if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server))< 0) { printf("連接失敗"); return 1; } // 發(fā)送請(qǐng)求 char *message; message = malloc(strlen(c_post_message)+100); sprintf(message, "POST /post HTTP/1.1\r\nHost: %s\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s", SERVER_ADDR, strlen(c_post_message), c_post_message); if(send(socket_desc, message, strlen(message), 0)< 0) { printf("發(fā)送失敗"); return 1; } // 讀取服務(wù)器響應(yīng) char buffer[5000] = {0}; if(recv(socket_desc, buffer, 5000, 0)< 0) { printf("接收失敗"); return 1; } printf("%s", buffer); // 清理套接字 close(socket_desc); return 0; }
在上述實(shí)現(xiàn)中,我們使用了基于TCP協(xié)議的套接字編程模型。這使得我們可以打開套接字并建立一個(gè)與服務(wù)器的連接。我們還使用malloc()方法來(lái)動(dòng)態(tài)分配請(qǐng)求消息所需的內(nèi)存空間,然后我們將請(qǐng)求消息打包成一個(gè)字符串,并通過(guò)send()函數(shù)來(lái)發(fā)送到服務(wù)器。
最后,我們使用recv()函數(shù)來(lái)接收服務(wù)器響應(yīng),并在控制臺(tái)輸出響應(yīng)結(jié)果。這樣我們就成功地使用C語(yǔ)言向服務(wù)器發(fā)送了JSON請(qǐng)求。