c語言作為一門常見的編程語言,也常被用于發(fā)送http請求并處理json數(shù)據(jù)。在網(wǎng)絡(luò)編程中,發(fā)送http請求是非常重要的一環(huán),而json是一種輕量級的數(shù)據(jù)交換格式,因此c語言支持發(fā)送http請求和處理json數(shù)據(jù)的能力也是很必要的。
發(fā)送http請求可以使用c語言的socket編程、curl庫等方式。在使用socket編程時,需要連接服務(wù)器并發(fā)送http請求。比如以下代碼可以發(fā)送一個GET請求,獲取百度的首頁,并將返回的結(jié)果打印出來。
#include<stdio.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> int main(){ int sock_desc; struct sockaddr_in serv_addr; char msg[] = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"; char buffer[4096]; sock_desc = socket(AF_INET , SOCK_STREAM , 0); if (sock_desc == -1){ printf("could not create socket"); } serv_addr.sin_addr.s_addr = inet_addr("220.181.57.216"); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons( 80 ); if (connect(sock_desc , (struct sockaddr *)&serv_addr , sizeof(serv_addr))< 0){ puts("connect error"); } if(send(sock_desc, msg, strlen(msg) , 0)< 0){ puts("Send failed"); return 1; } if(recv(sock_desc, buffer, 4096, 0)< 0){ puts("recv failed"); } printf("%s", buffer); close(sock_desc); return 0; }
當(dāng)我們想要處理返回的數(shù)據(jù)時,一般會使用json格式的數(shù)據(jù)。c語言中的處理json數(shù)據(jù)可以使用第三方庫,比如json-c庫、cJSON庫等等。這里我們以cJSON庫為例。比如以下代碼可以解析一個json格式的字符串,并逐個打印其中的值。
#include <cJSON.h> #include <stdio.h> int main(){ const char* json_string = "{\"name\":\"Tom\",\"age\":22,\"favorites\":[\"reading\",\"music\",\"running\"]}"; cJSON* json = cJSON_Parse(json_string); if (json == NULL){ printf("json格式錯誤\n"); return 1; } printf("name: %s\n", cJSON_GetObjectItem(json, "name")->valuestring); printf("age: %d\n", cJSON_GetObjectItem(json, "age")->valueint); cJSON* favorites_array = cJSON_GetObjectItem(json, "favorites"); printf("favorites:\n"); int favorites_array_size = cJSON_GetArraySize(favorites_array); for (int i = 0; i< favorites_array_size; i++) { printf("%s\n", cJSON_GetArrayItem(favorites_array, i)->valuestring); } cJSON_Delete(json); return 0; }