【问题标题】:Objective-c URL encode Cloudstack [duplicate]Objective-c URL编码Cloudstack [重复]
【发布时间】:2014-02-19 16:58:02
【问题描述】:

我正在开发一个需要与 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"]

【问题讨论】:

    标签: objective-c api urlencode apache-cloudstack


    【解决方案1】:

    在您的情况下,问题可能是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
    

    【讨论】:

    • 看起来像一个重复的问题?
    • 真的吗?问题不就是“我如何对字符串进行 url 编码”吗?
    • 这里的问题是stringByAddingPercentEscapesUsingEncoding 没有提供所需的编码,尽管人们期望它提供。
    猜你喜欢
    • 2011-12-26
    • 2012-03-28
    • 1970-01-01
    • 2011-11-19
    • 2012-02-06
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多