通过Qt(mac - OSX)进行的AWS查询没有得到任何结果

AWS query through Qt (mac - OSX) is not getting any result

本文关键字:查询 AWS 结果 任何 mac Qt OSX 通过      更新时间:2023-10-16

我目前正在尝试创建一个C++程序来跟踪一堆ASIN的价格。我正在使用Qt(版本5.5)的C++,通过Xcode(5.1.1)在mac OSX上进行编译。编译时,它正在运行,但没有给出输出。我收到以下警告消息(出于隐私原因,我将AccessKey&AssociateTag加密为"

///")
*QUrl("http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=///////////////&AssociateTag=/////////////&ItemId=B00181T20O&Operation=ItemLookup&ResponseGroup=OfferSummary&Service=AWSECommerceService&Signature=1K69SLmTkZ9hZwwt5ualR4uDRwY%3D&SignatureMethod=HmacSHA1&Timestamp=2017-01-04T10%3A21%3A46Z")
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
qt.network.ssl: Error receiving trust for a CA certificate
"<?xml version="1.0"?>n<ItemLookupErrorResponse 
xmlns="http://ecs.amazonaws.com/doc/2005-10-05/"><Error>
<Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated 
does not match the signature you provided. Check your AWS Secret Access Key and 
signing method. Consult the service documentation for details.</Message></Error>
<RequestId>f4626242-a110-43f1-9b56-b8a696b3f299</RequestId>
</ItemLookupErrorResponse>"
RET:
("", "")*

为了再次测试它,我在浏览器中复制了URL(警告消息的前几行),我也得到了同样的错误:"我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

谁能给我一个提示,网址有什么问题?提前感谢!

这是

代码中最相关的部分。我怀疑我无法嵌入.zip文件

AWSQueryRequest::AWSQueryRequest(QObject *parent) :
    QObject(parent)
{
    m_netManager = new QNetworkAccessManager(this);
}
QString AWSQueryRequest::hmacSha1(QByteArray key, QByteArray baseString)
{
    int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard
    if (key.length() > blockSize)
    {
        // if key is longer than block size (64), reduce key length with SHA-1 compression
        key = QCryptographicHash::hash(key, QCryptographicHash::Sha1);
    }
    QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6"
    QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "quot;
    // ascii characters 0x36 ("6") and 0x5c ("quot;) are selected because they have large
    // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance)
    for (int i = 0; i < key.length(); i++)
    {
        innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length
        outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length
    }
    // result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64
    QByteArray total = outerPadding;
    QByteArray part = innerPadding;
    part.append(baseString);
    total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1));
    QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1);
    return hashed.toBase64();
}
QByteArray AWSQueryRequest::getTimeStamp()
{
    QDateTime dateTime = QDateTime::currentDateTimeUtc();
    return dateTime.toString(Qt::ISODate).toUtf8();
}
QByteArray AWSQueryRequest::createSignature(const QMap<QString,QString> & queryItems)
{
    QUrl url(END_POINT);
    QString stringToSign = "GETn";
    stringToSign.append(url.host() + "n");
    stringToSign.append(url.path() + "n");
    QList<QString> keys = queryItems.keys();
    for( int i=0; i < keys.count() ; ++i )
    {
        stringToSign.append(keys[i]+"="+queryItems[keys[i]]);
        if( i != keys.count() -1  )
            stringToSign.append("&");
    }
    QString signature = hmacSha1(AWS_PASS, stringToSign.toUtf8());
    return QUrl::toPercentEncoding(signature);
}
#if 0
QByteArray AWSQueryRequest::createSignature(const QList< QPair<QString,QString> > & queryItems)
{
    QUrl url(END_POINT);
    QString stringToSign = "GETn";
    stringToSign.append(url.host() + "n");
    stringToSign.append(url.path() + "n");
    for (int i=0; i<queryItems.count(); ++i)
    {
        QPair<QString,QString> pairValue = queryItems[i];
        stringToSign.append(pairValue.first+"="+pairValue.second);
        if( i != queryItems.count() -1)
            stringToSign.append("&");
    }
    QString signature = hmacSha1(AWS_PASS, stringToSign.toUtf8());
    return QUrl::toPercentEncoding(signature);
}
#endif
QUrl AWSQueryRequest::createUrl( const QMap< QString,QString >& queryItems )
{
    QUrl url(END_POINT);
    QUrlQuery query;
    QMapIterator<QString, QString> it(queryItems);
    while (it.hasNext())
    {
        it.next();
        query.addQueryItem(it.key().toUtf8(), it.value().toUtf8());
    }
    url.setQuery(query);
    return url;
}