Qt学习笔记一:Qt使用network模块进行http请求时获取response中的http状态码

http请求获取response中的http状态码

最近转行学习Qt,不得不说,还是Java写得舒服。 回到正题,在使用Qt时,可能会使用network模块来进行网络操作,比如tcp、http请求,我将在下文讲述如何通过Qt进行http请求以及处理响应的相关操作。

使用QNetworkAccessManager

Qt通过QNetworkAccessManager来管理网络请求,Qt提供了QNetworkCookieJar来管理Cookie,当然你可以通过手工管理request的header来管理Cookie,不过相对麻烦。

    QNetworkAccessManager *manager = new QNetworkAccessManager;
    
    // 添加了QNetworkCookieJar
    // 可以自己写个类继承QNetworkCookieJar,调用QNetworkCookieJar的allCookies函数来获取cookie列表
    manager->setCookieJar(&cookieJar);

由于QNetworkAccessManager的请求回传使用的是异步传输,所以可以用Qt信号槽机制来进行response的获取。

    // 这里使用QEventLoop来进行循环等待
    QEventLoop *loop = new QEventLoop;
    connect(manager, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit()));
    QNetworkRequest request(QUrl("your uri"));
    QNetworkReply *reply = manager->get(request);
    loop->exec();

可以通过QNetworkReply的readAll()成员函数来获取返回的具体内容:

    QByteArray bytes = reply->readAll();
    qDebug() << bytes;

获取http状态码

在获得服务器的响应后,程序编写者可能需要获得响应的http状态码,具体步骤如下:

    // QNetworkReply
    // attribute函数返回QVariant对象,使用value()函数返回进行向下转型
    qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).value();

关于QNetworkReply::attribute

官方文档这么表述改方法:

QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const Returns the attribute associated with the code code. If the attribute has not been set, it returns an invalid QVariant (type QMetaType::UnknownType). You can expect the default values listed in QNetworkRequest::Attribute to be applied to the values returned by this function.

意思是attribute函数返回code代码对应的参数。如果参数没有被设置,函数将返回无效的QVariant对象(Invalid QVariant),你能使用QNetworkRequest::Attribute中提供的参数当错code来调用attribute函数并返回你需要的值。常用的参数有:

  1. QNetworkRequest::RedirectionTargetAttribute(返回重定向地址)
  2. QNetworkRequest::HttpStatusCodeAttribute(返回http状态码)

转载于:https://my.oschina.net/StupidZhe/blog/3065075

你可能感兴趣的:(Qt学习笔记一:Qt使用network模块进行http请求时获取response中的http状态码)