遇到两个博客的发送都是使用cookie来标识用户的:my.opera.com以及myspace.
请求头
请求头类:QHttpRequestHeader
设置请求方式(get/post)
QHttpRequestHeader::setRequest ("POST", "请求地址"); //post
QHttpRequestHeader::setRequest ("GET", "请求地址"); //get
请求地址可以不包含Host名称
设置请求头:
void QHttpRequestHeader::setValue(const QString & key, const QString & value)//各个变量设置
void QHttpRequestHeader::setValues ( const QList<QPair<QString, QString> > & values )//批量设置
编码
发送的内容编码有两种
multipart/form-data
application/x-www-form-urlencoded
application/x-www-form-urlencoded
使用的是URL编码,在QT中使用以下code来完成转换:
QByteArray afterData = QUrl::toPercentEncoding (befData, "&=");
befData是未转换之前的数据,函数返回的是转换后的QByteArray类型的编码。
除了大小写字母以外的所有符号都使用%n的方式表示(n为字符的两位编码)
使用QHttpRequestHeader::setValue ("content-type", "application/x-www-form-urlencoded");设置请求头
multipart/form-data
使用类似以下格式的代码进行传输:
--BlogDiary2007
Content-Disposition: form-data; name="表单控件名称"
数据
--BlogDiary2007
Content-Disposition: form-data; name="表单控件名称"
数据
--BlogDiary2007--
BlogDiary2007是各数据间的分割符,每一部分前面加上两个"--",整个表单数据完成后面再加"--"表示完成。
BlogDiary2007并不是特定的,但必须与你的请求头变量的相一致。
QHttpRequestHeader::setValue ("content-type", "multipart/form-data; boundary=BlogDiary2007");
一些用过的请求头变量
变量 值
COOKIE: COOKIE数据
HOST(此变量是必须的): 网站的HOST地址
USER_AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
不知道为何,USER_AGENT在myspace登陆时是必须的,弄得头崩额劽加上这个才弄好。只是标志客户端的版本而已呀,难道登陆myspace需要知道我用什么浏览器吗?不知道我改成BlogDiary会怎么样。
应答头
应答头类:QHttpResponseHeader
返回的值通过QHttpResponseHeader::value ("变量");获得
应答头的cookie的值为"set-cookie:cookie值",意为请求客户端设置,我登陆博客就是通过这个取得登陆身份的。
QHttp
声明:QHttp http = new QHttp ("远端服务器的Host名称");
向服务器请求数据:int QHttp::request (请求头,发送数据);//返回请求ID
返回当前的ID(接收到数据后):int QHttp::currentID ();
QHttp的请求方式类似于打印机的打印机队列一样,可以同时发送多个请求,但真正发送是按队列先后的方式发送请求。在接收到应答头后从当前ID(QHttp::currentID())知道是哪个请求返回的数据。
获得数据的长度(接收到数据后):int QHttp::bytesAvailable ();
应该与应答头的Content-Length的值一样,没验证过,但要注意的是此值可能并不是返回数据的整个大小,因为服务器可能不是一次能够发送完所有数据。
读取数据:read (读取数据缓冲, 上面bytesAvailable ()返回的大小);
获取错误:QHttp::Error QHttp::error ()
信号
请求数据后,当有数据进来后将会发送若干个信号提示服务器返回结果,使用对应Slot函数进行处理。
responseHeaderReceived (const QHttpResponseHeader& resp): 应答头已返回,可从返回的头获取应答信息
requestFinished(int id, bool error): 请求完成,error==true说明有错误发生,QHttp::error ()返回错误代码
readyRead (const QHttpResponseHeader& resp): 已有数据可读,如果数据很多,可能会发送多次信号