在C語言中,如果我們需要從HTTP請求中接收一個JSON格式的POST數據,我們需要使用以下幾個步驟來完成:
1. 需要使用C語言的Socket API來創建一個Server Socket。這將允許我們接收傳入的HTTP請求。
// 創建套接字. int sockfd = socket(AF_INET, SOCK_STREAM, 0);
2. 我們需要將Server Socket綁定到TCP端口上,這樣它就可以接收到傳入的HTTP請求。
// 綁定套接字. struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(8080); bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
3. 接下來,我們需要監聽傳入的HTTP請求,等待客戶端連接。
// 監聽套接字. listen(sockfd, 5); printf("\nListening...\n");
4. 一旦我們收到HTTP請求,我們需要將請求的頭文件和消息體保存到字符串中。
// 接收客戶端連接. struct sockaddr_in cli_addr; socklen_t clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen); // 讀取客戶端請求頭文件. char *header_buffer = malloc(READ_BUFFER_SIZE + 1); sscanf(request_buffer, "%s %s %s", method, path, protocol); while(1) { if((strlen(header_buffer) >3 && header_buffer[strlen(header_buffer)-4] == '\r' && header_buffer[strlen(header_buffer)-3] == '\n' && header_buffer[strlen(header_buffer)-2] == '\r' && header_buffer[strlen(header_buffer)-1] == '\n') || ((bytes_read = read(newsockfd, buffer, READ_BUFFER_SIZE))<=0)) { strcat(header_buffer, buffer); break; } strncat(header_buffer, buffer, bytes_read); } // 讀取客戶端請求體. char* body_buffer = calloc(BODY_BUFFER_SIZE + 1, 1); while(1) { if((bytes_read = read(newsockfd, buffer, READ_BUFFER_SIZE))<= 0) { break; } strncat(body_buffer, buffer, bytes_read); }
5. 最后,我們需要使用一些開源的JSON解析庫,如 cJSON 來解析接收到的JSON格式數據。
// 使用 cJSON 解析 JSON 數據. cJSON *root = cJSON_Parse(body_buffer); // 檢查接收到的 JSON 格式是否正確. if (!root || !cJSON_IsObject(root)) { response_400(newsockfd); return; } // 獲取 JSON 格式數據中的值. cJSON *action = cJSON_GetObjectItem(root, "action"); // 釋放 cJSON 對象. cJSON_Delete(root);
以上就是在C語言中如何接收POST請求的JSON數據的過程。經過這條路,我們就可以在C語言中輕松地處理來自網絡的JSON數據了。