c++ - 我们如何使用 Qt/C++ 解析 HTTP 响应头字段?

标签 c++ qt parsing http-headers kde-plasma

我正在编写一个使用 Qt/KDE 库的软件。目标是将 HTTP header 响应字段解析为结构的不同字段。到目前为止,HTTP header 响应包含在 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" 

除了自定义字段之外, header 响应中可能还有几个字段。 我想到的唯一可能的方法是手动搜索“链接”、“摘要”等字段,并创建一个以这些字段为键的 QMap。但是,我想一定有更好的方法来做到这一点。如果你能帮助我,我将不胜感激。

最佳答案

HTTP header 最初应该在 QByteArray 中(因为它是 ASCII,而不是 UTF-16),但是方法与 QString 相同:

  • 逐行拆分标题,
  • 在冒号字符处拆分每一行,
  • 在存储 2 个结果字符串周围的所有空格(常规空格和 '\r' 字符)。
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);
}

关于c++ - 我们如何使用 Qt/C++ 解析 HTTP 响应头字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10893525/

相关文章:

c++ - 在 QModelIndex 中存储两种不同的类型

c++ - 使用 Qt 读取、写入和搜索文本文件

java - 错误地解析日期

c++ - 在 C++11 中,如何打印给定 Unicode 代码的字符?

c++ - 删除范围外的变量

Windows + Qt 以及如何在没有 OpenCV 的情况下捕获网络摄像头提要

java - 如何在Java中解析JSON

javascript - 生成 JSON 对象

c++ - string.compare 什么时候停止比较? (标准)

c++ - 在 winuser.h 中调用 GetDesktopWindow() 函数,而不是在 MFC OnButtonClick 函数中调用 CWnd::GetDesktopWindow()