0

我正在开发一个需要与 API (CloudStack) 通信的 IOS 应用程序。API 要求对每个请求进行签名。

我需要对参数进行 URL 编码并创建 HMAC SHA1 哈希。一切正常,直到我传递一个包含加号或冒号的参数。

所以我猜是我的应用程序的 URL 编码部分不能正常工作。我搜索了几个站点并尝试了提供的解决方案,但没有任何结果。

API 规范之一是所有空格都需要编码为“%20”而不是“+”。

API 签名指南:http ://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.1.0/html/Developers_Guide/signing-api-requests.html

目前我正在使用以下代码对 URL 进行 URL 编码:

-(NSString *)urlenc:(NSString *)val
{    
    NSString *result = [(NSString *)val stringByReplacingOccurrencesOfString:@"+" withString:@" "];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
    return result;
}

我这样调用方法: [self urlenc@"2014-01-20T14:02:48+0100"]

4

1 回答 1

0

在您的情况下,问题可能是stringByAddingPercentEscapesUsingEncoding不编码的“+”和“:”字符。

您需要使用支持更多字符的编码器,请参阅此 SO 答案以获取更完整的信息。

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding编码 14 个字符:

`#%^{}[]|\"<> 加上空格字符作为百分比转义。

这是示例代码(iOS7 及更高版本,否则请参阅此 SO 答案):
您可能需要更改编码的字符。

NSString *testString = @"2014-01-20T14:02:48+0100";
NSString *encodedString1 = [testString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"encodedString1: %@", encodedString1);

NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]\" ";
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
NSString *encodedString2 = [testString stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
NSLog(@"encodedString2: %@", encodedString2);

NSLog 输出:

encodedString1: 2014-01-20T14:02:48+0100
encodedString2: 2014-01-20T14%3A02%3A48%2B0100
于 2014-01-28T12:03:50.750 回答