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. 微信在浏览器打开前的提示页面Android与IOS判断

    直接在网上扒一个页面,分分钟搞定!  先看一下效果 这是用微信开发工具打开的样式,直接上完整代码 <!DOCTYPE html> <html lang="en"& ...

  2. 【JS】实时监控页面,input框数值自动求和

    需求: 有一个页面需要将input框填入的各个费用自动相加,添加到“合计费用”里. 解决方案: 使用jquery的blur实践,每个费用的Input框检测到失去焦点时,将所有的input框数值相加求和 ...

  3. java util - json转换工具 gson

    需要 gson-2.7.jar 包 package cn.java.gson; import com.google.gson.JsonElement; import com.google.gson.J ...

  4. JZOJ 4725. 质数序列

    Description 由于去NOI的火车“堵”了数不清时间,小Z和小D打完ETG,闲着无聊开始看今年的JSOI省选题,并尝试着修改题目:对于一个长度为L ≥ 2的序列,X:x1,x2,...,xL ...

  5. 循环(while、for)

    写重复的代码是程序员最不耻的行为,那么如何做到不用写重复代码又能让程序重复一段代码多次呢,循环语句就派上用场拉…… 一.while 循环 # while 语法结构 while 条件: 执行代码.... ...

  6. Python3中的列表用法,看这一篇就够了

    类似C语言中的列表用法 ---------------------------------------------------------------------------------------- ...

  7. 【Akroma, Angel of Fury】完成svn环境搭建

    昨天的那篇博文恰恰是实验室所干的事儿 但是那是一种很投机取巧的方式完成的多project管理方式 来看看我建立环境的方法 首先,找一个比较闲的公用服务器(为什么不用自己的?有公共资源不用,你傻啊?), ...

  8. Codeforces Round #462 (Div. 2) A Compatible Pair

    A. A Compatible Pair time limit per test1 second memory limit per test256 megabytes Problem Descript ...

  9. easyui的layout

    1.浏览器自适应(即浏览器改变大小,里面的表格大小也会随之改变)要设置两个参数 (1)一般都要在body上设置class=“easyui-layout”: <body class="e ...

  10. Spring进阶-怎样集成定时调度Quartz

    在一些项目里面比如进销存系统,对一些过期图片的定时清理或者库存不足发出预警提示,就需要用到定时调度技术. 每当经过一段时间,程序会自动执行,就是定时调度.如果要使用定时调度,则必须保证程序始终运行才行 ...