刚进这个公司,以前没接触过http编程,所以这两天做了个小例子来熟悉http编程,有点晕。。。。。

  不过还是做出来了,虽然有点粗糙,总结一下这个小软件:

  主要使用QNetworkAccessManager, QNetworkRequest, QNetworkReply来实现网络交互:

  get:

QString orderAddress = QString("http://www.feiniu.com/item/%1").arg(orderID);

    QNetworkRequest request;
request.setUrl(QUrl(orderAddress));
request.setRawHeader(PCMEGNAME, "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
request.setRawHeader(CONNECTNAME, CONNECTVALUE); QNetworkReply *pReply = m_pOrderNetLogin->m_pManager->get(request); //改异步为同步处理
QEventLoop loop;
connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec(); //获取响应的信息,状态码为200表示正常
QVariant status_code = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute); //无错误返回
if(pReply->error() == QNetworkReply::NoError)
{
//下订单
placeCurrentOrder(orderID);
}
//释放
delete pReply;

  post:

QString data = QString("user=%1&pass=%2&captcha=&chkRememberMe=false&referer=%3&CSRF_TOKEN=%4&deviceId=")
.arg(account).arg(password).arg(m_pOrderNetLogin->m_referer).arg(m_pOrderNetLogin->m_csrfToken); /************设置HTTP头*****************/
QNetworkRequest request;
request.setUrl(QUrl(clogin));
request.setRawHeader(PCMEGNAME, PCMEGVALUE);
request.setRawHeader(CONNECTNAME, CONNECTVALUE);
request.setRawHeader("Content-Length", QString::number(data.size()).toLatin1());
request.setRawHeader("Referer", "https://passport.feiniu.com/gateway/login");
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); QNetworkReply *pReply = m_pOrderNetLogin->m_pManager->post(request, data.toLatin1()); //改异步为同步处理
QEventLoop loop;
connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec(); //获取响应的信息,状态码为200表示正常
QVariant status_code = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute); //无错误返回
if(pReply->error() == QNetworkReply::NoError)
{
//我的订单
QByteArray bytes = pReply->readAll();
QString result(bytes); //转化为字符串
if (result.indexOf("") != -)
{
//切换城市
this->changeStation();
//登录成功,跳转到主页
this->jumpToHome("https://member.feiniu.com/home/index");
}
} delete pReply;//删除

  由于第一次接触这方面,不知道流程对不对,先记下来,以后再看看:

    1、首先进入飞牛网的登录界面,获取referer、csrfToken两个参数,以便后面登录使用.

    2、导入账号和密码,然后登录飞牛网,登录之后跳转到我的账户页面(看网页登录就是这样跳的,后面试试不跳至我的账户,直接查找商品).

    3、根据导入的商品ID跳转至其商品页面,然后根据其信息(比如数量,衣服码)来组装信息,然后加入到购物车,很多商品就全加进去后再做其他.

    4、跳转至购物车,不确定购物车里除了我加的商品外还有其他的商品,所以先全部取消选择,然后选择我加入的商品,在这里需要获取商品订单号和金额。

    5、提交订单,首先要确定送货地址,在网站有个站点,如果和送货地址不在同一个省,提交会失败,但是网站的站点切换始终没找到怎么做,但发现是在Cookie里面体现的,所以直接修改的Cookie,Cookie只会对指定域名进行发送;

      修改Cookie(默认四川成都高新区):

QNetworkCookieJar *cookieJar  = m_pOrderNetLogin->m_pManager->cookieJar();

    QNetworkCookie dist("C_dist", "CPG5_CS000005");
dist.setDomain(".feiniu.com");
dist.setPath("/"); QNetworkCookie area("C_dist_area", "CS000005_510100_510199");
area.setDomain(".feiniu.com");
area.setPath("/"); QList<QNetworkCookie> temp = cookieJar->cookiesForUrl(QUrl("http://www.feiniu.com/"));
temp.append(dist);
temp.append(area); cookieJar->setCookiesFromUrl(temp, QUrl("http://www.feiniu.com/")); m_pOrderNetLogin->m_pManager->setCookieJar(cookieJar);

    6、确认导入的送货地址是否满足要求,和网站的省,市,区有没有区别,有区别则用户自己选择,无区别就会自己提交订单,其实还有发票什么的,没做了。。。。

问题: 1、觉得最坑的就是一直记不住QString的中文乱码解决方法,这次是vs2008 + Qt 4.8.6, win7,解决方法:

      在main.cpp中添加:QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

      并且在程序中使用到中文的地方:QString::fromLocal8Bit("订单号");

    2、http协议一点都不熟悉,一些头根本不知道什么意思,就瞎跟着写。。。。虽然没有报错。。。

    3、GMT时间,网站上是“1461658278819”这么长,但是自己转换出来少了三位,不知道为啥。

    4、数据解析,解析服务器返回的数据后,解析自己关心的数据有点不熟悉,解析算法还有待提高。

    5、当服务器返回200后,有些地方没有继续解析他返回的数据,比如提示“送货地址与所在省不同,请重试”这些信息就没法得到,所以有些时候都是直接就不管。。。(流氓啊!)

    6、做的时候没有想好怎么做,弄得封装性不这么好,后面再花时间重新整理哈。

在http编程的门口----飞牛网自动下单,查单的更多相关文章

  1. 型牌男装施春蕾:分拆让马云对淘宝定位更清晰--互联网 -- CCTIME飞象网

    型牌男装施春蕾:分拆让马云对淘宝定位更清晰--互联网 -- CCTIME飞象网 型牌男装施春蕾:分拆让马云对淘宝定位更清晰          2011年6月17日 13:16  CCTIME飞象网   ...

  2. 《Python游戏编程快速上手》|百度网盘免费下载|Python基础编程

    <Python游戏编程快速上手>|百度网盘免费下载| 提取码:luy6 Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. 本书通过编写一个个 ...

  3. 牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间

    [题解] 我想到了两种解法. 一种是扫描线+线段树+单调栈. 另一种方法是O(n)的,比较巧妙. 考虑每个数在哪些区间可以作为最小数.最长的区间就是它向左右走,直到有数字比它小,这个可以用单调栈维护. ...

  4. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  5. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  6. JavaScript编程那些事(牛客网 LeetCode)

    计算给定数组 arr 中所有元素的总和 本人提供常规方法 function sum(arr) { var len = arr.length; var sum = 0; if(len == 0){ su ...

  7. javaSE基础知识(走向编程的门口)— 更新完毕

    前言:玩儿编程最重要的一点:不要怕麻烦,感觉是在浪费时间: 能动手绝不哔哔:只要脑袋不傻,编程都是"一看就会,一练就废",开始学的时候,就算再基础的东西都建议手敲一遍 要有囫囵吞枣 ...

  8. Qt高级编程 高清PDF+源|网盘下载地址附提取码|

    书籍作者:Mark Summerfield(马克 . 萨默菲尔德)(英)   书籍译者:闫锋欣内容简介:本书是一本阐述Qt高级编程技术的书籍.本书以工程实践为主旨,是对Qt现有的700多个类和上百万字 ...

  9. 牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划

    [题解] 题意其实就是把n个物品分成4个集合,其中三个集合不可以为空(只属于A.只属于B.AB的交),一个集合空或者非空都可以(不属于A也不属于B),问有多少种方案. 考虑容斥,4个集合都不为空的方案 ...

随机推荐

  1. logistic回归 c++ 实现

    logistic回归是统计学习中经典的分类方法,他属于对数线性模型.本博文主要给出logistic的c++实现,具体理论请读者自行google. 本文用到的数据集来自于一个医学网站,具体出处不记得了( ...

  2. 浅谈DevExpress<二>:设计一个完整界面(1)

    昨天谈了界面的换肤问题,今天拿一个简单的界面来介绍一下怎么设计一个五脏俱全的界面,总体效果如下图(种类的图片随便找的^^):

  3. Django数据库迁移

    如果你用过Django的数据库就会发现一个比较令人纠结的地方:数据库更改. 我们知道添加或者删除一个models.Model 需要在数据库里相应的操作,这需要我们进入数据库命令行手动添加或删除,因为s ...

  4. 苹果推送通知服务Push Notification探究总结(序)

    刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...

  5. 【转】Objc的底层并发API

    本文由webfrogs译自objc.io,原文作者Daniel Eggert.转载请注明出处! 小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台, ...

  6. NuGet安装及简单使用

    通过Visual Studio安装NuGet 直接下载并安装NuGet 一.通过Visual Studio安装NuGet 打开Visual Studio扩展管理器 2.选择联机库,并在搜索中写入NuG ...

  7. PHP中的赋值-引用or传值?

    直接上代码: <?php $num1 = 1; $num2 = $num1; $num1 = 2; echo $num2 . "\n"; $arr1 = array(1, 2 ...

  8. MVC TO LINQ

    // // GET: /Home/ TestTryEntities Db = new TestTryEntities(); public ActionResult Index() { return V ...

  9. MyEclipse8.5整合Git

    下载Eclipse的git插件--EGit.官网地址: 点击打开链接 截止目前最新版本为3.5,历史版本如下: Release Version Release Date p2 repository U ...

  10. VB的写法,关于版本写入注册表

    VB的写法,关于版本写入注册表   '软件都有一个关于我们的菜单,单单实现这个功能并不难,困难的是能够将这些信息写入注册表中,这样每次只要弹出这样的窗口,就从注册表里去搜索.这样是不是极大的节省了资源 ...