制作AWS产品广告API请求iOS

时间:2014-03-02 00:14:32

标签: ios api amazon

今天,我无法为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似乎没有任何东西(我可以找到,我可能只是一个糟糕的googler)。

我的AWS密钥中包含“/”字符。我认为这可能会搞乱计算HMAC的算法。所以我创造了新的秘密密钥,直到亚马逊为我生成了一个奇怪的字符并进行了测试。它没用......

最终我要做的是使用此信息的AWS Product Advertising 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天前工作,我什么都没改变。

2 个答案:

答案 0 :(得分:0)

我与其他第三方API有类似的体验。显然我的请求被重定向,我不得不辞职。

请务必使用此nsurlrequest委托方法签署您的请求:

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

答案 1 :(得分:0)

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