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. (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植

    如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资.如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows ...

  2. ZendFramework-2.4 源代码 - 关于MVC - Controller层

    // 1.控制器管理器 class ServiceManager implements ServiceLocatorInterface { public function __construct(Co ...

  3. 跨域问题和django中实现跨域

    跨域问题 1.同源策略(浏览器的安全功能): 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同 2.CORS跨域资源共享 实现CORS通信的关键是服务器,只要服务器实 ...

  4. GNU中的关键字typeof

    如果你是 C++ 程序员,应该接触过 C++11 里的 decltype 操作符,它的作用是自动推导表达式的数据类型,以解决泛型编程中有些类型由模板参数决定而难以(甚至不可能)表示的问题.其实这个特性 ...

  5. BZOJ 1531: [POI2005]Bank notes

    按余数分类 单调队列优化 #include<cstdio> using namespace std; int n,m,b[205],c[205],F[20005]; struct node ...

  6. Python3.0-3.6的版本变化

    Table of Contents Python3.0 简单的变化 语法的变化 新语法 改动的语法 剩下的变化 Python3.1 Python3.2 Python3.3 Python3.4 Pyth ...

  7. 项目实战:CRM客户关系管理系统开发

    21-CRM第一节内容概要 21.1 Stark组件介绍:实现基本的增删改查+自定义复杂操作: 21.2 单例模式:最简单的单例模式: 21.3 路由系统(分发): 21.4 制作启动文件-Djang ...

  8. 精通CSS高级Web标准解决方案(6、对表单与表格应用样式)

    使用fieldset input[type="text"] { width:200px; } input:focus,textarea:focus{background:#ffc; ...

  9. sqlserver 取时间段重复或者不重复的数据

    declare @str datetime, @end datetime select @str='2013-04-05',@end='2013-04-10'select * from arp_hbs ...

  10. MySql 存储过程实例(附完整注释)(转)

    MySql 存储过程实例(附完整注释) 将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例:                                   ...