【发布时间】:2019-06-16 00:57:48
【问题描述】:
我正在 Qt 中编写一个从 Bricklink API(乐高数据库)检索信息的类。它使用 QOAuth1 类进行身份验证,使用 QNetworkReply 捕获来自 HTTP GET 请求的响应。这很好用,除非正在检索的数据太大。
在下面的示例中,我请求了一个特定的库存(乐高积木列表)。当我请求 category_id 142 时,我得到了一个包含 50 个零件的漂亮列表。但是 category_id 485 包含 75 个元素并且什么都不返回。甚至没有错误。
void Category::getInventory()
{
QUrl url("https://api.bricklink.com/api/store/v1/inventories");
QVariantMap parameters;
parameters.insert("category_id", "485"); // 75 elements not OK
// parameters.insert("category_id", "142"); // 50 elements OK
QNetworkReply *reply = bricklink.get(url, parameters);
connect(reply, &QNetworkReply::finished, this, &Category::parseJson);
}
void Category::parseJson()
{
QJsonParseError parseError;
auto reply = qobject_cast<QNetworkReply*>(sender());
if (reply->error()) {
qDebug() << reply->errorString();
return;
}
const auto data = reply->readAll();
const auto document = QJsonDocument::fromJson(data, &parseError);
if (parseError.error) {
qCritical() << "Category::getCategory. Error at:" << parseError.offset
<< parseError.errorString();
return;
} else {
QString strReply = static_cast<QString>(data);
qDebug() << strReply;
}
}
我不知道是什么原因造成的。可以发送的数据是否有最大限制?还是某种超时?也许需要分块捕获更大的数据?
当然,API 可能不会发送更大的数据集。作为测试,我在 node.js 解决方案上进行了同样的尝试,并且可以看到 API 确实适用于更大的集合。
知道我可以做些什么来找出这个问题的原因吗?
【问题讨论】:
-
我已经检查了
reply->size(),即使我没有从reply->readAll()获得任何数据,但我确实确认失败请求的大小更大。所以它肯定与readAll()命令有关。我快到了... ;-)
标签: c++ qt qt5 qnetworkaccessmanager qnetworkreply