今天,我无法为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天前工作,我什么都没改变。
答案 0 :(得分:0)
我与其他第三方API有类似的体验。显然我的请求被重定向,我不得不辞职。
请务必使用此nsurlrequest委托方法签署您的请求:
- (NSURLRequest *)connection: (NSURLConnection *)inConnection
willSendRequest: (NSURLRequest *)inRequest
redirectResponse: (NSURLResponse *)inRedirectResponse;
答案 1 :(得分:0)
我犯了一个noob错误并且注释掉了编码body参数的代码。取消注释并设置值后,一切正常。因此,请确保对参数进行编码。