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