C/Linux 使用 cJSON 构建 HTTP 服务器接收 Qt HTTP POST 请求数据
"#include "stdio.h"\n#include "stdlib.h"\n#include "string.h"\n#include "unistd.h"\n#include "sys/socket.h"\n#include "arpa/inet.h"\n#include "cjson/cJSON.h"\n\n#define PORT 8080\n\nvoid handle_post_data(int client_socket, char* post_data) {\n // 解析post data为cJSON对象\n cJSON* json = cJSON_Parse(post_data);\n if (json == NULL) {\n printf("Failed to parse JSON: %s\n", cJSON_GetErrorPtr());\n return;\n }\n\n // 读取post data中的字段\n cJSON* name = cJSON_GetObjectItemCaseSensitive(json, "name");\n cJSON* age = cJSON_GetObjectItemCaseSensitive(json, "age");\n\n // 打印post data中的字段值\n printf("Name: %s\n", name->valuestring);\n printf("Age: %d\n", age->valueint);\n\n // 释放cJSON对象\n cJSON_Delete(json);\n}\n\nint main() {\n int server_fd, client_socket;\n struct sockaddr_in server_addr, client_addr;\n int addrlen = sizeof(client_addr);\n\n // 创建socket\n server_fd = socket(AF_INET, SOCK_STREAM, 0);\n if (server_fd == -1) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // 设置服务器地址和端口\n server_addr.sin_family = AF_INET;\n server_addr.sin_addr.s_addr = INADDR_ANY;\n server_addr.sin_port = htons(PORT);\n\n // 绑定socket\n if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {\n perror("bind failed");\n exit(EXIT_FAILURE);\n }\n\n // 监听socket\n if (listen(server_fd, 3) == -1) {\n perror("listen failed");\n exit(EXIT_FAILURE);\n }\n\n printf("Server listening on port %d\n", PORT);\n\n while (1) {\n // 接收客户端连接\n client_socket = accept(server_fd, (struct sockaddr*)&client_addr, (socklen_t*)&addrlen);\n if (client_socket == -1) {\n perror("accept failed");\n exit(EXIT_FAILURE);\n }\n\n char buffer[1024] = {0};\n read(client_socket, buffer, 1024);\n\n // 提取post data\n char* post_data = strstr(buffer, "\r\n\r\n");\n if (post_data != NULL) {\n post_data += 4;\n handle_post_data(client_socket, post_data);\n }\n\n // 发送响应\n char* response = "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 12\n\nHello World!";\n write(client_socket, response, strlen(response));\n\n // 关闭客户端socket\n close(client_socket);\n }\n\n // 关闭服务器socket\n close(server_fd);\n\n return 0;\n}\n\n\n\"在这个示例中,我们使用了cJson库来解析POST请求的post data。首先,我们创建了一个socket并绑定到指定的端口。然后,我们通过循环等待客户端连接。当客户端连接成功时,我们从socket中读取数据,并提取出POST请求的post data。接下来,我们使用cJson库解析post data,并提取出其中的字段值。最后,我们发送一个简单的响应给客户端。\n\n你可以使用Qt中的QNetworkAccessManager来发送POST请求,并在请求中添加post data。以下是一个示例代码:\n\ncpp\n#include "QCoreApplication"\n#include "QNetworkAccessManager"\n#include "QNetworkRequest"\n#include "QNetworkReply"\n#include "QUrl"\n#include "QByteArray"\n\nint main(int argc, char argv[]) {\n QCoreApplication a(argc, argv);\n\n QNetworkAccessManager manager;\n QNetworkRequest request(QUrl("http://localhost:8080"));\n\n // 设置请求头\n request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");\n\n // 设置post data\n QByteArray postData;\n postData.append("name=John&age=30");\n\n // 发送POST请求\n QNetworkReply reply = manager.post(request, postData);\n\n // 接收响应\n QObject::connect(reply, &QNetworkReply::finished, & {\n if (reply->error() == QNetworkReply::NoError) {\n QByteArray response = reply->readAll();\n qDebug() << response;\n } else {\n qDebug() << "Error: " << reply->errorString();\n }\n\n // 释放QNetworkReply对象\n reply->deleteLater();\n\n // 退出应用程序\n a.quit();\n });\n\n return a.exec();\n}\n```\n"在这个示例中,我们创建了一个QNetworkAccessManager对象来发送POST请求。我们首先创建一个QNetworkRequest对象,并设置请求的URL和请求头。然后,我们创建一个QByteArray对象来存储POST请求的post data。接下来,我们使用manager的post()函数来发送POST请求,并将post data作为参数传递。最后,我们使用QNetworkReply对象来接收响应,并在finished信号中处理响应数据。\n\n请注意,在运行这个示例之前,你需要先运行上面的C语言代码来启动HTTP服务器。\n
原文地址: https://www.cveoy.top/t/topic/qjvw 著作权归作者所有。请勿转载和采集!