向 iOS 发出 AWS 产品广告 API 请求

Posted

技术标签:

【中文标题】向 iOS 发出 AWS 产品广告 API 请求【英文标题】:Making AWS Product Advertising API Request iOS 【发布时间】:2014-04-03 01:14:18 【问题描述】:

今天我无法为 aws 的产品广告 API 发出“ItemSearch”请求。

首先,这在 2 月 24 日星期一有效,现在在 3 月 1 日无效。我不知道是否有任何更新可能改变了 AWS 的工作方式。搜索时找不到任何东西。

我的第一个错误是:“请求已过期。时间戳日期为 140301235753Z” 这意味着我为请求“140301235753Z”输入的时间超出了 AWS 存储的范围 15 分钟UTC 时间。我做了一些研究,最终更改了下面的代码。

NSDateFormatter *UTCFormatter = [[NSDateFormatter alloc] init];
UTCFormatter.dateFormat = @"yyMMddHHmmss'Z'";
UTCFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

NSString *timeStamp = [UTCFormatter stringFromDate:[NSDate date]];

我将@"yyMMddHHmmss'Z'" 更改为@"yyyy-MM-dd'T'HH:mm:ss'Z'"

再次重新运行请求我遇到了这个错误:“我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。” 这意味着在比较 AWS 在收到我的请求时计算的 API 调用的签名部分时,我计算的签名部分是错误的。

我已使用此链接Amazon Signature Examples 作为参考来检查下面的代码。

// create HMAC with SHA256
const char *cKey  = [secretKey cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [canonicalString cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *hashData = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];
NSString *signature = [[DTBase64Coding stringByEncodingData:hashData] stringByURLEncoding];

我的代码没有错误。我通过谷歌查看了一个可能能够创建我想要的字符串以测试我的签名是否正确的应用程序,但 AWS 似乎没有任何东西(我可以找到,我可能只是糟糕的谷歌)。

我的 AWS 密钥中有一个“/”字符。我认为这可能会弄乱计算 HMAC 的算法。所以我创建了新的密钥,直到亚马逊为我生成了一个没有奇怪字符的密钥并对其进行了测试。它没有工作....

我最终想要做的是使用此信息的 AWS 产品广告 API 请求

NSString *verb = @"GET";
NSString *hostName = @"webservices.amazon.com";
NSString *path = @"/onca/xml";

NSDictionary *params = @
                         @"Service": @"AWSECommerceService",
                         @"AWSAccessKeyId": accessKey,
                         @"Operation": @"ItemSearch",
                         @"ResponseGroup": @"Large",
                         @"SearchIndex": @"Books",
                         @"Title": bookTitle,
                         @"AssociateTag" : trackingID
                         ;

我已将敏感/动态信息替换为变量。

我在AWS Product Advertising Documentation 搜索了文档 PDF,但似乎无法找出我的问题。

最莫名其妙的是,我的代码在 6 天前还在工作,而我什么也没做。

【问题讨论】:

嘿A'sa,你找到解决问题的方法了吗,我也面临同样的问题...... 我犯了一个小错误,并注释掉了编码正文参数的代码。如果您遇到类似的问题,我会验证您的网址是否正确并且正文是否具有正确的参数:3 【参考方案1】:

我在使用另一个第三方 API 时也有过类似的经历。显然我的请求被重定向了,我不得不放弃我的请求。

请务必在此 nsurlrequest 委托方法中签署您的请求:

- (NSURLRequest *)connection: (NSURLConnection *)inConnection
             willSendRequest: (NSURLRequest *)inRequest
            redirectResponse: (NSURLResponse *)inRedirectResponse;

【讨论】:

我从这个 URL 检索 XML 的方法是通过 NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL] 封装在 NSXMLParser 中的; xmlParser.delegate = self;【参考方案2】:

我犯了一个菜鸟错误,并注释掉了编码正文参数的代码。取消注释并设置值后一切正常。因此,请确保对参数进行编码。

【讨论】:

以上是关于向 iOS 发出 AWS 产品广告 API 请求的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 物理 iOS 设备无法向我的本地 asp.net 服务器发出 api 请求

亚马逊产品广告API ItemSearch返回空

Python3 AWS Lambda-向需要VPN的域发出发布请求

AWS 身份验证和日志记录

亚马逊产品广告 api 获取带有优惠的产品

对亚马逊产品广告 API 的 Java REST 请求失败