【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构

这篇具有很好参考价值的文章主要介绍了【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qtcpsocket自己构造http格式,QT,C++,qt,http,c语言,C++

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:C++专栏
  • 💥 标题:【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构
  • ❣️ 寄语:书到用时方恨少,事非经过不知难。
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正!

0 引言

  • 最近项目涉及到网络HTTP相关内容,需要处理客户端发送的POST、GET等请求。所以本文使用QT的QtNetwork模块来实现一个简单的发送POST、GET请求的客户端,然后响应POST、GET请求的服务器。
  • 本文涉及到一些HTTP的基本知识,可以参考博主之前的文章:计算机网络HTTP协议

HTTP(Hypertext Transfer Protocol)是一种应用层协议,它是建立在传输控制协议(TCP)之上的。在使用HTTP进行客户端和服务器之间的通信时,实际上是通过TCP协议来传输HTTP消息。

TCP是一种面向连接的协议,它提供了可靠的、按顺序传送的字节流,确保数据的完整性和可靠性。HTTP利用TCP的这些特性来确保请求和响应的可靠传输。

HTTP消息包括请求报文和响应报文。请求报文由客户端发送给服务器,而响应报文由服务器发送给客户端。这些报文包含了与所请求的资源或所提供的信息相关的头部(headers)和实体体(entity body)。

总体而言,HTTP建立在TCP协议的基础之上,它定义了一种规范,用于客户端和服务器之间的通信,而TCP则提供了底层的可靠数据传输机制。

1 HTTP基本知识

1.1 请求类型

HTTP(Hypertext Transfer Protocol)协议 定义了多种请求方法,也称为HTTP请求类型或HTTP动词。这些请求方法表示客户端希望对特定资源执行的操作。以下是常见的HTTP请求类型、其功能和应用场景:

  1. GET:

    • 功能: 用于从服务器获取指定资源的信息。请求的参数通常附在URL后面,通过查询字符串传递。
    • 应用场景: 用于查看网页、下载文件、获取数据等。是幂等的,不应该对服务器产生影响。(我们输入一个网址,其实就是从服务器获得一个HTML文件,然后浏览器内核再根据其将内容绘制出来)
  2. POST:

    • 功能: 用于向服务器提交数据,通常用于表单提交。请求的参数通常包含在请求体中。
    • 应用场景: 用于创建新资源、提交表单数据、上传文件等。可能对服务器产生影响。不是幂等的,多次相同的POST请求可能产生不同的结果。
  3. PUT:

    • 功能: 用于向服务器上传新资源,或者更新已存在的资源。请求的参数通常包含在请求体中。
    • 应用场景: 用于创建或更新资源。是幂等的,多次相同的PUT请求应该产生相同的结果。
  4. DELETE:

    • 功能: 用于请求服务器删除指定的资源
    • 应用场景: 用于删除指定资源。是幂等的,多次相同的DELETE请求应该产生相同的结果。
  5. PATCH:

    • 功能: 用于对资源进行部分更新。请求的参数通常包含在请求体中,表示对资源的局部修改。
    • 应用场景: 用于对资源进行局部更新,而不是替换整个资源。
  6. HEAD:

    • 功能: 类似于GET请求,但服务器只返回响应头,不返回实体主体。常用于检查资源的元信息,如是否存在、是否已经修改等。
    • 应用场景: 用于获取资源的头部信息,而不需要获取整个资源的内容。
  7. OPTIONS:

    • 功能: 用于获取目标资源支持的通信选项。客户端可以通过这个方法了解服务器支持的方法。
    • 应用场景: 用于确定服务器支持的方法,以及支持的头信息等。
  8. TRACE:

    • 功能: 用于在目标服务器上执行一个消息环回测试,客户端发送的请求会在最终的服务器上返回,用于诊断和调试。
    • 应用场景: 主要用于网络诊断,通常不会在实际应用中直接使用。

选择适当的HTTP请求类型取决于具体的操作和业务需求。每种请求类型都有其独特的功能和应用场景,使其适用于不同的情境。

1.2 HTTP请求报文格式

HTTP请求报文是客户端发送给服务器的文本信息,包含请求的各种参数和头信息。它的基本格式如下:

<Method> <Request-URI> <HTTP-Version>
<Headers>

<Optional Request Body>

其中,各部分的含义如下:

  • <Method>:HTTP请求方法,例如GET、POST、PUT等。
  • <Request-URI>:请求的资源标识符,通常是一个URL。
  • <HTTP-Version>:使用的HTTP协议版本,例如HTTP/1.1。
  • <Headers>:包含多行的头部信息,每行都包含一个头字段和对应的值。
  • <Optional Request Body>:可选的请求体,用于包含请求时需要发送的数据,例如POST请求中的表单数据。

以下是一个具体的例子:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Upgrade-Insecure-Requests: 1

在这个例子中:

  • 请求方法是GET。
  • 请求的资源标识符是/index.html
  • 使用的HTTP协议版本是HTTP/1.1。
  • 请求头部包含了HostUser-AgentAccept等字段,每个字段都以<header-name>: <header-value>的形式呈现。
  • 由于GET请求通常不包含请求体,因此没有<Optional Request Body>部分。

对于包含请求体的请求,例如POST请求,请求体会紧随请求头部,并用一个空行分隔。例如:

POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 23

username=johndoe&password=123

在这个例子中,请求体包含了表单数据username=johndoe&password=123,并通过Content-Type头字段指定了数据的格式。

1.3 HTTP响应报文格式

HTTP响应报文是服务器返回给客户端的文本信息,包含了服务器对客户端请求的响应。其基本格式如下:

<HTTP-Version> <Status-Code> <Reason-Phrase>
<Headers>

<Optional Response Body>

其中,各部分的含义如下:

  • <HTTP-Version>:使用的HTTP协议版本,例如HTTP/1.1。
  • <Status-Code>:一个三位数的状态码,表示服务器对请求的处理结果。
  • <Reason-Phrase>:状态码的文本描述,描述了状态码的原因。
  • <Headers>:包含多行的头部信息,每行都包含一个头字段和对应的值。
  • <Optional Response Body>:可选的响应体,用于包含服务器返回给客户端的数据。

以下是一个具体的例子:

HTTP/1.1 200 OK
Date: Mon, 15 Nov 2023 12:00:00 GMT
Server: Apache
Content-Type: text/html
Content-Length: 1234
Connection: keep-alive

<html>
  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <h1>Welcome to my website!</h1>
  </body>
</html>

在这个例子中:

  • 使用的HTTP协议版本是HTTP/1.1。
  • 状态码是200,表示请求成功。
  • 原因短语是"OK",为状态码的文本描述。
  • 响应头部包含了DateServerContent-Type等字段。
  • 由于这是一个简单的HTML响应,响应体包含了一个HTML文档。

对于包含响应体的响应,例如HTML页面、JSON数据等,响应体会紧随响应头部,并用一个空行分隔。响应体的格式和内容取决于服务器的实际响应。

1.4 拓展:GET vs POST 请求方法

GET和POST请求在HTTP中的请求报文和响应报文中有一些区别,这主要涉及到数据的传递方式和一些特定的语义约定。


GET请求

请求报文:
  1. 参数传递: GET请求的参数通常附在URL的查询字符串中,通过?&符号进行连接,例如:http://example.com/resource?param1=value1&param2=value2
  2. 请求体: GET请求通常没有请求体,因为它用于请求资源,而不是向服务器提交数据。
响应报文
  1. 响应体: GET请求的响应体包含了服务器返回的资源数据。

POST请求

请求报文
  1. 参数传递: POST请求的参数通常包含在请求体中,而不是在URL中,特别是用于提交表单数据或上传文件等场景。
  2. 请求体: POST请求的请求体包含了客户端提交给服务器的数据。

响应报文
  1. 响应体: POST请求的响应体包含了服务器对提交的数据的处理结果。

其他注意事项

  1. 安全性: POST请求的数据包含在请求体中,相对于GET请求,POST请求具有更好的安全性,因为它不会在URL中明文传递敏感信息。
  2. 幂等性: GET请求是幂等的,多次相同的GET请求应该产生相同的结果。POST请求是非幂等的,多次相同的POST请求可能会产生不同的结果。

示例:

GET请求示例

请求报文:

GET /resource?param1=value1&param2=value2 HTTP/1.1
Host: example.com

响应报文:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<!DOCTYPE html>
<html>
  <head>
    <title>GET Response</title>
  </head>
  <body>
    <h1>This is the response to a GET request.</h1>
  </body>
</html>

POST请求示例

请求报文:

POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

param1=value1&param2=value2

响应报文:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45

{"status": "success", "message": "POST response"}

总的来说,GET和POST请求的区别主要在于参数传递的方式、请求体的内容和请求的语义。GET适用于获取资源,而POST适用于向服务器提交数据。

2 实战

2.1 QtNetwork模块介绍

QtNetwork模块是Qt中用于网络编程的模块,提供了一系列用于处理网络通信的类和工具。以下是QtNetwork模块的一些主要功能:

  1. TCP和UDP通信: 提供QTcpSocketQUdpSocket等类,用于实现TCP和UDP协议的通信。这些类使得在Qt应用程序中创建和管理网络连接变得相对简单。

  2. HTTP客户端和服务器: 提供QNetworkAccessManager类,用于实现HTTP协议的客户端功能。它支持GET、POST等HTTP请求方法,并允许异步地发送和接收HTTP请求。

  3. 网络请求和响应处理: 提供QNetworkRequestQNetworkReply等类,用于构建和处理网络请求。这些类提供了丰富的功能,包括请求头的设置、数据的传输和响应的处理等。

  4. FTP客户端: 提供QFtp类,用于实现FTP协议的客户端功能。它允许在Qt应用程序中进行文件传输操作。

  5. 网络代理: 支持网络代理设置,可以通过QNetworkProxy类配置网络代理,以便在需要时通过代理服务器进行网络通信。

  6. 网络协议支持: QtNetwork模块支持各种网络协议,包括IPv4和IPv6,SSL/TLS等。这使得Qt应用程序能够适应多种网络环境和安全需求。

  7. 网络状态监控: 提供QNetworkConfigurationQNetworkConfigurationManager类,用于监控和管理网络配置,以便在应用程序中适应不同的网络状态。

  8. 网络缓存: 提供QNetworkDiskCache等类,用于实现网络缓存,以提高应用程序的性能并减少对网络资源的依赖。

这些功能使QtNetwork成为一个强大的网络编程工具,适用于开发涉及网络通信的各种应用,从简单的客户端到复杂的服务器应用。

2.2 编程实现HTTP客户端

根据上述描述,可以知道,使用 QTcpSocketQUdpSocketQNetworkAccessManagerQNetworkRequestQNetworkReply等类可以实现简单的HTTP客户端。

  1. (本实例只是制作了一个简单的 HTTP 客户端,并不能持久的连接 HTTP 服务器。类似于浏览器给服务器发出HTTP请求)接下来是代码:
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QUrlQuery>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建网络访问管理器
    QNetworkAccessManager manager;

    // 创建HTTP请求
    QNetworkRequest getRequest(QUrl("http://example.com"));

    // 发送GET请求
    QNetworkReply *getReply = manager.get(getRequest);

    // 处理GET请求完成的信号
    QObject::connect(getReply, &QNetworkReply::finished, [&]() {
        if (getReply->error() == QNetworkReply::NoError) {
            qDebug() << "GET Response:" << getReply->readAll();
        } else {
            qDebug() << "GET Error:" << getReply->errorString();
        }

        getReply->deleteLater();
    });

    // 进入应用程序事件循环
    return a.exec();
}

在使用 Qt 进行网络请求时,尤其是在进行异步的网络操作时,需要进入应用程序的事件循环。这是因为 Qt 的事件循环负责处理事件,而网络请求的完成(比如接收到服务器的响应)通常是通过 Qt 的信号-槽机制来处理的。

让我们来详细解释一下:

  1. 异步操作: Qt 的网络操作通常是异步的,即在发起网络请求后,程序会继续执行后续的代码而不等待请求完成。这是为了确保应用程序的界面和其他部分能够保持响应性,不被阻塞。

  2. 信号-槽机制: 当网络请求完成时,QNetworkReply 会发出 finished 信号。你在代码中使用 QObject::connect 来连接这个信号到一个槽函数,以便在请求完成时执行一些操作。

  3. 事件循环: 为了让信号-槽机制正常工作,需要进入应用程序的事件循环。调用 QCoreApplication::exec() 或者 QEventLoop::exec() 启动事件循环,使得 Qt 可以不断地检查并处理事件队列。

在代码中,调用 return a.exec(); 启动了事件循环。这样,当 GET 请求完成并发出 finished 信号时,相关的槽函数将会被执行。如果没有进入事件循环,这个槽函数将不会被触发,因为事件循环负责调度信号的处理。

简而言之,进入应用程序的事件循环是确保异步操作和信号-槽机制正常工作的关键步骤。如果你的应用程序没有事件循环,它将无法及时响应和处理异步操作的完成事件。

  1. 示例2:使用TCP Socket制作一个 HTTP 客户端
    基本功能:连接服务器、发送请求报文、接受响应报文

.h文件代码:

// httpclient.h
#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <QTcpSocket>
#include <QObject>

class HttpClient : public QObject
{
    Q_OBJECT

public:
	// 构造函数
    explicit HttpClient(QObject *parent = nullptr);

public slots:
	// 连接服务器
    void connectToServer();

private slots:
	// 读取服务器响应报文槽函数
    void readServerResponse();

private:
	// 服务器Socket
    QTcpSocket *tcpSocket;
};

#endif // HTTPCLIENT_H

.cpp文件代码:

// httpclient.cpp
#include "httpclient.h"

HttpClient::HttpClient(QObject *parent)
    : QObject(parent)
{
    tcpSocket = new QTcpSocket(this);

    connect(tcpSocket, &QTcpSocket::connected, this, &HttpClient::readServerResponse);
}

void HttpClient::connectToServer()
{
    tcpSocket->connectToHost("127.0.0.1", 8080);
}

void HttpClient::readServerResponse()
{
    QByteArray response = tcpSocket->readAll();
    qDebug() << "Received response:\n" << response;

    tcpSocket->close();
}

2.3 编程实现HTTP服务器

QNetworkAccessManager 主要用于客户端,用于处理发起 HTTP 请求。对于服务器端,通常需要使用 QTcpServerQTcpSocket 等类来监听连接并处理请求。在下面的例子中,我将演示如何使用 QTcpServer 处理简单的 HTTP GETPOST 请求。

下面的是使用 QT 的 Tcp Socket 实现的 HTTP 服务器功能,HTTP 协议是基于 Tcp 协议实现的,所以 HTTP 通信的本质还是 C/S 之间进行 Tcp Socket 通信。通过字节流的方式发送和接受数据。无非就是 HTTP 发送的是 HTTP 格式的请求报文响应报文。所以在 Tcp 层次也就是网络层次接受到的是报文的字节流数据。HTTP服务器只需要对接受到的请求报文进行解析即可。

因为请求报文的格式是统一的规范大家都遵守,所以读取传输数据的第一行数据的第一个字符串即可知道使用的请求方法是GETPOST等。然后根据不同的请求方法,写好不同的处理函数即可。并写好对应格式的响应报文即可。
当然我们也可以使用

#ifndef MYHTTPSERVER_H
#define MYHTTPSERVER_H

#include <QTcpServer>
#include <QTcpSocket>
#include <QUrlQuery>
#include <QDebug>

class MyHTTPServer : public QTcpServer
{
    Q_OBJECT

public:
    MyHTTPServer(QObject *parent = nullptr) : QTcpServer(parent) {}

protected:
    //--------------------------------------
    // 说明:这是 QTcpServer 类的虚函数,当有新的连接到达时,会被调用。
    // 日期:2023-11-15
    // 作者:海码007
    //--------------------------------------
    void incomingConnection(qintptr socketDescriptor) override
    {
        QTcpSocket *socket = new QTcpSocket(this);
        socket->setSocketDescriptor(socketDescriptor);

        // 读取客户端请求
        connect(socket, &QTcpSocket::readyRead, [&]() {
            QByteArray requestData = socket->readAll();
            processRequest(requestData, socket);

            // 关闭连接
            socket->disconnectFromHost();
        });

        // 处理连接断开
        connect(socket, &QTcpSocket::disconnected, [&]() {
            socket->deleteLater();
        });
    }

private:
    //--------------------------------------
    // 说明:这个函数用于解析 HTTP 请求,分析请求的方法和路径,并调用相应的处理函数。
    // 日期:2023-11-15
    // 作者:海码007
    //--------------------------------------
    void processRequest(const QByteArray &requestData, QTcpSocket *socket)
    {
        // 解析请求
        QString requestString = QString::fromUtf8(requestData);
        QStringList requestLines = requestString.split("\r\n");

        // 解析第一行,获取请求方法和路径
        QString firstLine = requestLines.first();
        QStringList parts = firstLine.split(" ");
        QString method = parts.value(0);
        QString path = parts.value(1);

        // 处理 GET 请求
        if (method == "GET")
        {
            handleGetRequest(path, socket);
        }
        // 处理 POST 请求
        else if (method == "POST")
        {
            handlePostRequest(path, requestData, socket);
        }
    }

    //--------------------------------------
    // 说明:处理 HTTP GET 请求的具体逻辑。
    // 日期:2023-11-15
    // 作者:海码007
    //--------------------------------------
    void handleGetRequest(const QString &path, QTcpSocket *socket)
    {
        QTextStream responseStream(socket);
        responseStream.setAutoDetectUnicode(true);

        // 构造HTTP响应
        responseStream << "HTTP/1.1 200 OK\r\n"
                       << "Content-Type: text/html\r\n"
                       << "Connection: close\r\n"
                       << "\r\n"
                       << "<html><body><h1>Hello, World! (GET)</h1></body></html>";

        // 刷新并等待数据发送完毕
        socket->flush();
        socket->waitForBytesWritten();
    }

    //--------------------------------------
    // 说明:处理 HTTP POST 请求的具体逻辑。
    // 日期:2023-11-15
    // 作者:海码007
    //--------------------------------------
    void handlePostRequest(const QString &path, const QByteArray &requestData, QTcpSocket *socket)
    {
        // 解析 POST 数据
        QUrlQuery postData(requestData);
        QString value = postData.queryItemValue("key");

        QTextStream responseStream(socket);
        responseStream.setAutoDetectUnicode(true);

        // 构造HTTP响应
        responseStream << "HTTP/1.1 200 OK\r\n"
                       << "Content-Type: text/html\r\n"
                       << "Connection: close\r\n"
                       << "\r\n"
                       << "<html><body><h1>Hello, " << value << "! (POST)</h1></body></html>";

        // 刷新并等待数据发送完毕
        socket->flush();
        socket->waitForBytesWritten();
    }
};

#endif // MYHTTPSERVER_H


扩展:另一个简单示例
.h文件示例:

// httpserver.h
#ifndef HTTPSERVER_H
#define HTTPSERVER_H

#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>

class HttpServer : public QTcpServer
{
    Q_OBJECT

public:
	// 构造函数
    explicit HttpServer(QObject *parent = nullptr);

protected:
	// 当有客户端连接到本服务器时执行的函数,这个函数是父类的函数,需要重写
    void incomingConnection(qintptr socketDescriptor) override;

private slots:
	// 读取客户端发送的请求报文
    void readClient();

private:
	// 给客户端发送响应报文
    void sendResponse(QTcpSocket *clientSocket, const QByteArray &response);
};

#endif // HTTPSERVER_H

cpp文件示例:文章来源地址https://www.toymoban.com/news/detail-775624.html

// httpserver.cpp
#include "httpserver.h"

HttpServer::HttpServer(QObject *parent)
    : QTcpServer(parent)
{
}

void HttpServer::incomingConnection(qintptr socketDescriptor)
{
	// 创建一个 connect Socekt 用于存储客户端和服务器的IP和端口,是个四元组数据
    QTcpSocket *clientSocket = new QTcpSocket(this);
    clientSocket->setSocketDescriptor(socketDescriptor);

	// 新建一个信号槽连接,当 connect Socket 准备好数据读取时的信号,与读取槽函数连接
    connect(clientSocket, &QTcpSocket::readyRead, this, &HttpServer::readClient);
}

// 读取客户端请求报文的槽函数
void HttpServer::readClient()
{
	// sender()函数返回的指针是信号发送者的指针
    QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender());
    if (!clientSocket)
        return;

	// 发送的请求报文存储在 connect Socket 中直接读取即可。数据是以字节流的方式传输,如果要正确打印,需要进行解码
    QByteArray requestData = clientSocket->readAll();
    qDebug() << "Received request:\n" << requestData;

    // 构造HTTP响应
    QByteArray response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, World!";
    // 通过 connect Socket给客户端发送响应报文
    sendResponse(clientSocket, response);

    clientSocket->close();
}

void HttpServer::sendResponse(QTcpSocket *clientSocket, const QByteArray &response)
{
    clientSocket->write(response);
}

到了这里,关于【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 使用HTTP请求网络API并接收返回的JSON格式的数据

    引入网络模块: mainwindow.h: mainwindow.cpp:

    2024年02月13日
    浏览(37)
  • QT之Http请求

    今天我们介绍一下QT的http请求,这里有post和get两种方式 一、post请求方式:参数分为网址和具体请求值两个部分,有时候还需要设置头信息,看具体情况定 二、get请求方式:参数和网址拼接到一起请求 三、主要区别: get用于请求获取数据,post向指定的资源创建修改数据 g

    2024年02月15日
    浏览(33)
  • Python使用POST方法发送HTTP请求的15个示例(基于requests)

    以下是使用 requests 库调用HTTP接口进行POST请求的15个示例: 发送简单的POST请求: 发送JSON格式的POST请求: 发送XML格式的POST请求: 发送文件的POST请求:

    2024年02月10日
    浏览(36)
  • python 模块requests 发送 HTTP 请求

    一、简介 requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作 二、安装 三、方法 requsts.requst(method, url,headers,cookies,proxies,timeout) method:请求方式;字符串类型 url:请求的地址;字符串类型 params:查询参数,g

    2024年02月11日
    浏览(33)
  • QT-发送HTTP请求/QNetworkAccessManager

    注意,如果想使用本文相关的类,需要在项目的 .pro 文件加入网络模块,也就是需要加入下面一行代码 本文使用QT发送一个媒体类型为application/json的post请求,步骤如下: 1.首先创建一个QNetworkAccessManager类,并设置url和请求参数 2.发送请求,发送之后会返回一个QNetworkReply对象

    2024年02月02日
    浏览(27)
  • Nodejs基础6之HTTP模块的获取请求行和请求头、获取请求体、获取请求路径和查询字符串、http请求练习、设置HTTP响应报文、http响应练习

    含义 语法 重点掌握 请求方法 request.method * 请求版本 request.httpVersion 请求路径 request.url * URL 路径 require(‘url’).parse(request.url).pathname * URL 查询字符串 require(‘url’).parse(request.url, true).query * 请求头 request.headers * 请求体 request.on(‘data’, function(chunk){}),request.on(‘end’, functio

    2024年02月20日
    浏览(35)
  • QT进行http请求(post/get)

    在刚接触QT时第一个任务就是进行http请求,现在才开始记录,可能会有遗漏的点。 一、post请求 在.pro文件中 在.h文件中添加对应的头文件 在.cpp中 二、get请求 .pro和.h文件和post请求一样,在.cpp中

    2024年02月11日
    浏览(38)
  • Qt实现HTTP的Get/Post请求

    借助Qt的NetWork模块,可以轻松的实现HTTP的Get/Post请求,而不需要再次引用像libcurl这样的第三方库。 当然,Qt的NetWork模块提供的功能远远不只是HTTP方面的。 另外,使用Qt网络模块还需要引用Qt5Network.lib库。 先构造一个QNetworkAccessManager对象,QNetworkAccessManager对象提供了发送QNe

    2024年02月07日
    浏览(39)
  • QT实现客户端服务器HTTP(get请求、post请求)

    服务器代码如下: QtHttpForS.h QtHttpForS.cpp main.cpp QtHttpForS.ui 客户端代码: QtHttpForC.h QtHttpForC.cpp mian.cpp QtHttpForC.ui 程序运行效果: GET请求: POST请求: POST请求使用postman测试: 注意: 可以发现,在使用postman进行POST请求发送时,服务器接收到的请求头与QTSocket的POST请求的请求头

    2023年04月22日
    浏览(49)
  • Node.js-http模块服务端请求与响应操作,请求报文与响应报文

    简单案例创建HTTP服务端: 端口号被占用: 1.关闭当前正在运行监听端口的服务 2.修改其他的端口号 获取请求方式类型 获取请求的 url 地址 通过实例化 URl 对象获取路径与查询字符串 获取 http 协议的版本号 获取 http 的请求头 响应报文组成: 1.响应行 :包含:HTTP 版本号、响

    2024年02月14日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包