我们怎样才能解析使用Qt / C ++的HTTP响应报头字段?(How can we parse H

2019-09-17 18:30发布

我写的软件,使用Qt / KDE库。 目的是解析HTTP响应报头字段插入一个结构的不同字段。 到目前为止,HTTP响应报头中包含一个QString的。

它看起来是这样的:

"HTTP/1.1 302 Found
date: Tue, 05 Jun 2012 07:40:16 GMT
server: Apache/2.2.22 (Linux/SUSE)
x-prefix: 49.244.80.0/21
x-as: 23752
x-mirrorbrain-mirror: mirror.averse.net
x-mirrorbrain-realm: region
link: <http://download.services.openoffice.org/files/du.list.meta4>; rel=describedby; type="application/metalink4+xml"
link: <http://download.services.openoffice.org/files/du.list.torrent>; rel=describedby; type="application/x-bittorrent"
link: <http://mirror.averse.net/openoffice/du.list>; rel=duplicate; pri=1; geo=sg
link: <http://ftp.isu.edu.tw/pub/OpenOffice/du.list>; rel=duplicate; pri=2; geo=tw
link: <http://ftp.twaren.net/OpenOffice/du.list>; rel=duplicate; pri=3; geo=tw
link: <http://mirror.yongbok.net/openoffice/du.list>; rel=duplicate; pri=4; geo=kr
link: <http://ftp.kaist.ac.kr/openoffice/du.list>; rel=duplicate; pri=5; geo=kr
digest: MD5=b+zfBEizuD8eXZUTWJ47xg==
digest: SHA=A5zw6PkywlhiPlFfjca+gqIGLHA=
digest: SHA-256=HOrd0MMBzS8Ctljpe4PauwStijsnBKaa3gXO4L30eiA=
location: http://mirror.averse.net/openoffice/du.list
content-length: 329
connection: close
content-type: text/html; charset=iso-8859-1" 

除了自定义字段有可能是在头几回应更多的领域。 我想出的唯一可能途径是手动搜索,如“链接”的领域,“消化”等,并创建一个领域keys.However一个QMAP,​​我想必须有一个更好的方式来做到这一点。 我会感激你,如果你能帮助我。

Answer 1:

HTTP报头最初应当在一个QByteArray (因为它是在ASCII,不UTF-16),但该方法将与一个相同QString

  • 由线分割标题行,
  • 在冒号分开的每一行,
  • 修剪任何空白空间(常规空格和'\r'存储它们之前字符)2个生成的字符串周围。
QByteArray httpHeaders = ...;
QMap<QByteArray, QByteArray> headers;

// Discard the first line
httpHeaders = httpHeaders.mid(httpHeaders.indexOf('\n') + 1).trimmed();

foreach(QByteArray line, httpHeaders.split('\n')) {
    int colon = line.indexOf(':');
    QByteArray headerName = line.left(colon).trimmed();
    QByteArray headerValue = line.mid(colon + 1).trimmed();

    headers.insertMulti(headerName, headerValue);
}


文章来源: How can we parse HTTP response header fields using Qt/C++?