我正在开发一个需要与API(CloudStack)通信的IOS应用程序。 API要求每个请求都已签名。
我需要对参数进行URL编码并创建HMAC SHA1哈希。一切正常,直到我传递一个包含加号或冒号的参数。
所以我猜我的应用程序的URL编码部分无法正常工作。我搜索了几个网站并尝试了提供的解决方案,但没有任何结果。
其中一个API规范是所有空间都需要编码为“%20”而不是“+”。
目前我正在使用以下代码对网址进行网址编码:
-(NSString *)urlenc:(NSString *)val
{
NSString *result = [(NSString *)val stringByReplacingOccurrencesOfString:@"+" withString:@" "];
result = [result stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
return result;
}
我这样调用方法:
[self urlenc@"2014-01-20T14:02:48+0100"]
答案 0 :(得分:0)
在您的情况下,问题可能是stringByAddingPercentEscapesUsingEncoding
不编码的“+”和“:”字符。
您需要使用支持更多字符的编码器,有关更完整的信息,请参阅this SO answer。
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
编码了14个字符:
`#%^ {} [] | \“<>加上空格字符作为转义百分比。
以下是示例代码(iOS7及更高版本,否则请参阅this SO answer):
您可能需要更改已编码的字符。
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