Qt5模拟curl进行HTTP的head请求, curl -I <url> :

 #include <QtCore>
#include <QNetworkReply>
#include <QNetworkAccessManager> int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv); QUrl url("http://sw.bos.baidu.com/sw-search-sp/software/d4e97ccd4bd9f/jdk-8u144-windows-i586_8.0.1440.1.exe");
auto request = QNetworkRequest(url);
//request.setRawHeader("Host", "www.baidu.com");
request.setRawHeader("User-Agent", "curl/7.55.1");
//request.setRawHeader("Accept", "*/*");
//request.setRawHeader("Connection", "keep-alive");
request.setRawHeader("Accept-Encoding", "*");
//qDebug() << request.rawHeaderList(); auto manager = new QNetworkAccessManager;
manager->head(request); QEventLoop loop;
QObject::connect(manager, &QNetworkAccessManager::finished, &loop,
[&](QNetworkReply* reply) {
qDebug() << reply->rawHeaderList();
qDebug() << reply->header(QNetworkRequest::ContentLengthHeader).toInt();
for (auto ele : reply->rawHeaderPairs()) qDebug() << ele.first << ":" << ele.second;
reply->deleteLater();
loop.exit();
});
loop.exec();
return ;
}

输出结果:

("Server", "Date", "Content-Type", "Content-Length", "Connection", "ETag", "Last-Modified", "Expires", "Age", "Accept-Ranges", "Content-MD5", "x-bce-debug-id", "x-bce-request-id", "Ohc-Response-Time")

"Server" : "JSP3/2.0.14"
"Date" : "Fri, 13 Oct 2017 07:01:18 GMT"
"Content-Type" : "application/octet-stream"
"Content-Length" : ""
"Connection" : "close"
"ETag" : "\"8f189a37b323d81c0f0e013cf3070c93\""
"Last-Modified" : "Thu, 27 Jul 2017 07:09:28 GMT"
"Expires" : "Fri, 13 Oct 2017 07:40:11 GMT"
"Age" : ""
"Accept-Ranges" : "bytes"
"Content-MD5" : "jxiaN7Mj2BwPDgE88wcMkw=="
"x-bce-debug-id" : "MTAuMTk0LjIzNC40ODpUaHUsIDI3IEp1bCAyMDE3IDE1OjE5OjU2IENTVDoxMTk2OTEwMzI0"
"x-bce-request-id" : "9e484498-6dbd-4a98-9bf7-39cb5f47ff7c"
"Ohc-Response-Time" : "1 0 0 0 0 0"
Press any key to continue . . .

封装成 WebRequest 函数:

 QString WebRequest(QString url, int& status_code, QString method,
QByteArray postData,QList<QNetworkReply::RawHeaderPair>* reply_pairs, int time_out)
{
QNetworkAccessManager networkManager;
QNetworkRequest request; request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::UserAgentHeader,
UserAgent);
request.setRawHeader("Accept","*/*");
request.setRawHeader("Accept-Encoding", "*"); QNetworkReply* reply;
if(method == "get")
{
reply = networkManager.get(request);
}
else if(method == "post")
{
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
reply = networkManager.post(request, postData);
}
else
{
qDebug() << "method not support.";
return QString("");
} QTimer timer;
timer.setSingleShot(true); QEventLoop loop;
QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
if (time_out <= )
{
time_out = ;
}
timer.start(time_out); // 3 secs. timeout
loop.exec(); if (timer.isActive()) {
timer.stop();
if (reply->error() > ) {
qDebug() << "error";// handle error
}
else {
status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (status_code >= && status_code < )
{
// Success
if (reply_pairs)
{
*reply_pairs = reply->rawHeaderPairs();
}
return QString(reply->readAll());
}
}
}
else {
// timeout
QObject::disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
reply->abort();
return QString("");
}
}

Qt5网络请求使用及WebRequest函数的更多相关文章

  1. pythone函数基础(13)发送网络请求

    需要导入urllib模块,request模块发送网络请求有两种方法 第一种方法# from urllib.request import urlopen# from urllib.parse impor ...

  2. 微信小程序 功能函数 openid本地和网络请求

    本地-------------------------------------------------------------------------------------------------- ...

  3. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  4. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  5. 【Swift】Alamofile网络请求数据更新TableView的坑

    写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的 ...

  6. iOS开发——post异步网络请求封装

    IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...

  7. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  8. ReactiveCocoa代码实践之-RAC网络请求重构

    前言 RAC相比以往的开发模式主要有以下优点:提供了统一的消息传递机制:提供了多种奇妙且高效的信号操作方法:配合MVVM设计模式和RAC宏绑定减少多端依赖. RAC的理论知识非常深厚,包含有FRP,高 ...

  9. android 网络请求Ⅰ

    本章讲述在android开发中,常用的网络请求操作.网络请求利用android基本的HttpURLConnection连接URL和开源网络请求包AsyncHttpClient.本次网络请求以调取天气接 ...

随机推荐

  1. DeepFaceLab报错, Could not create cudnn handle 解决方法!

    DeepFaceLab 虽然没有可视化界面,但是在众多换脸软件中,是安装最方便,更新最快,整体性能最佳的一个.这个软件对于系统依赖很低,也就是不需要装各种各样的“插件”. 但是即便如此,由于版本的不断 ...

  2. DeepFaceLab报错,OOM如何解决?

    DeepFaceLab出错,虽然错误提示好几个屏幕,但是无非两种情况,一种是驱动没装好,一种是显存配置不够.上一篇文章说了驱动的问题,这一篇就说说配置不够的问题. 这个问题的表现形式,往往是各种OOM ...

  3. JZOJ 2136. 【GDKOI2004】汉诺塔

    2136. [GDKOI2004]汉诺塔 (Standard IO) Time Limits: 3000 ms  Memory Limits: 128000 KB  Detailed Limits   ...

  4. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  5. Codeforces Round #459 (Div. 2):B. Radio Station

    B. Radio Station time limit per test2 seconds memory limit per test256 megabytes Problem Dsecription ...

  6. adb offline解决办法

    假如你连接手机之后,adb devices找不到设备,或者找到了设备,但是device ID后总是offline的状态,那估计就是驱动有问题. 强烈建议1.安装豌豆荚,它可以自己主动修复手机驱动,一般 ...

  7. android shape.xml 文件使用

    设置背景色可以通过在res/drawable里定义一个xml,如下: <?xml version="1.0" encoding="utf-8"?> ...

  8. cf936c Lock Puzzle

    ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...

  9. 线段树&树状数组模板

    树状数组: #include <bits/stdc++.h> using namespace std; ; struct binit { int a[MAXN], n; void modi ...

  10. 移动web前端开发小结

    注意:Chrome模拟手机的显示的界面是有误差的,强烈建议一定要在真机测试自己的移动端页面(以移动端页面为准). 1.页面高度渲染错误,页面的高度是否包含了导航,(华为手机就是偏偏有底部菜单) 设置窗 ...