今天,我无法为aws的产品广告api提出"ItemSearch“请求。
首先,这是在2月24日星期一工作,现在是3月1日,它不起作用。我不知道是否有任何更新可能改变了AWS的工作方式。我搜索的时候什么都找不到。
我的第一个错误是:“请求已过期。时间戳日期为140301235753Z”--这意味着我为请求"140301235753Z“输入的时间超出了AWS为UTC时间存储的时间范围15分钟。我做了一些研究,最后修改了下面的代码。
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秘密访问密钥和签名方法。”这意味着我计算的API调用的签名部分在比较AWS接收到我的请求时计算的签名部分时是错误的。
我使用这个链接Amazon签名示例作为参考来检查下面的代码。
// 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];
我没有看到我的代码有任何错误。我通过google寻找一个应用程序,它可以创建我想要的字符串,以测试我的签名是否正确,但是AWS似乎没有任何东西(我可以找到,我可能只是一个糟糕的谷歌用户)。
我的AWS秘密钥匙里有个"/“字。我想这可能会扰乱计算HMAC的算法。所以我创建了新的密钥,直到amazon给我生成了一个带有奇怪字符的密钥,并对其进行了测试。这不管用..。
最终,我要做的是使用这些信息生成一个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产品广告文档搜索了文档PDF,似乎无法解决我的问题。
最令人困惑的是,我的代码在6天前就开始工作了,而我什么也没改变。
发布于 2014-03-02 00:29:53
我也有过类似的第三方API体验。很明显,我的请求被重定向了,我不得不辞职。
请确保在此nsurlrequest委托方法中签名您的请求:
- (NSURLRequest *)connection: (NSURLConnection *)inConnection
willSendRequest: (NSURLRequest *)inRequest
redirectResponse: (NSURLResponse *)inRedirectResponse;
发布于 2014-04-09 19:42:21
我犯了一个错误,把编码身体参数的代码注释掉了。在取消注释并设置值之后,所有这些操作都很好。所以一定要对你的参数进行编码。
https://stackoverflow.com/questions/22122206
复制相似问题