刚进这个公司,以前没接触过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. 解决Xcode升级7.0后,部分.a静态库在iOS9.0的模拟器上,link失败的问题

    简单描述一下这个问题:我们项目中使用了Google大神开发的LevelDB键值对数据库,在Xcode6,iOS8的环境下,编译好的.a静态库是可以正常使用的.但是升级后,发现在模拟器上无法link成功 ...

  2. Word2Vec在中文的应用

    google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算term之间的相似度,对term聚类等,该项目也支持phrase的自动识别,以及与t ...

  3. [原]关于在 iOS 中支持 DLNA

    目前国内的视频播放器中,支持 DLNA 播放比较好的是:腾讯视频. 刚才反编了一下他们的代码,发现使用了一个开源库, 地址:https://github.com/FuruyamaTakeshi/DLN ...

  4. [RM 状态机详解2] RMAppAttempt状态机详解

    摘要 本文详细描述RMAppAttempt状态机内的状态与其转换关系,分析的代码基于Apache社区Hadoop最新的2.3.0版本. RMAppAttempt状态机 在RM中,一个RMApp可能对于 ...

  5. 企业架构研究总结(36)——TOGAF企业连续体和工具之企业连续体构成及架构划分

    又回头看了之前文章的评论,本人也同样感慨这些文章的确像政治课本般的虚无缥缈,所以对费力看完却觉得无从下手的看官致以诚挚的歉意和理解,因为这个问题也同样困扰着笔者本人,而我能做的也只能是纸上谈兵.之前也 ...

  6. 【NET】Winform用户控件的初步封装之列表页控件

    public abstract partial class TListPager<TEntity, TRepository, TSqlStrConstruct> : UserControl ...

  7. Java 快速开发平台 WB 6.8 发布

    WebBuilder是一款开源的可视化Web应用开发和运行平台. 基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发: 高效.稳定和可扩展的特点,适合复杂企业 ...

  8. Excel 开发概述

    浅谈Excel开发:一 Excel 开发概述 做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识. ...

  9. C++ Config 配置文件类

    C++ Config 配置文件类 本文Config类的序列化和反序列化使用的jsoncpp, 因为jsoncpp提供的方法很简单易阅读.配置文件的格式自然也是json. 1 { 2 "ima ...

  10. python email ==> send 发送邮件 :) [smtplib, email 模块]

    关于Email的预备知识: 原贴地址:http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343480.html ############ ...