链接的URL编码

时间:2013-10-17 12:01:50

标签: ios

我没有得到以下网址的响应我正在加载异步。 http://ms:ms@www.arabcircleonline.com/index.php?do=/webservice/whisper/login_ms@gmail.com/password_ms/action_stirwhisper/whisperstirdata_{"feed_id":"89","say_something":"pqrst","privacy": 0}

我正在使用像

这样的网址编码
NSString *urlString1 = [[NSString alloc]initWithFormat:@"http://ms:ms@www.arabcircleonline.com/index.php?do=/webservice/whisper/login_ms@gmail.com/password_ms/action_stirwhisper/whisperstirdata_{\"feed_id\":\"%@\",\"say_something\":\"%@\",\"privacy\":%@}",feedid,[alertView textFieldAtIndex:0].text,privacy];

NSData *mydata1 = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[urlString1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];

我认为编码存在一些问题。 帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的查询组件需要“百分比转义”。此外,您的查询组件可能很特殊,因为它的结构是层次结构。也就是说,服务器需要实现自定义代码来处理这个问题。

服务器解码URL的查询组件的标准方法是使用为解码“application / x-www-form-urlencoded”请求的主体而定义的相同算法。客户端使用的相应编码算法在此处定义:

application/x-www-form-urlencoded encoding algorithm

(注意:查询组件是问号'?'之后的所有内容,直到哈希字符'#'!)

但是,根据RFC 3986,此编码算法可能会为URL的“未保留”字符集中的字符生成百分比转义,即波浪号〜字符。 “未保留”字符集中的字符不需要转义。更严格的是,由于URI比较实现的影响,RFC 3986提出了这个建议:

为保持一致性,ALPHA(%41-%5A和%61-%7A),DIGIT(%30-%39),连字符(%2D),句号(%)范围内的百分比编码八位字节URI生成者不应创建%2E),下划线(%5F)或代字号(%7E)。

因此,略微修改的实施方案(不包括波形符'~')可以产生最佳结果。

以下代码名称或参数的进行编码。请注意,参数必须用'&'分隔,名称和值必须用'='分隔。

static NSString* form_urlencode_rfc3986(NSString* s) {
    CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
    //CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");
    // Modified for urls (excluding '~'):
    CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@");

    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                             kCFAllocatorDefault,
                             (__bridge CFStringRef)s,
                             charactersToLeaveUnescaped,
                             legalURLCharactersToBeEscaped,
                             kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

实施例

根据您的示例网址,查询组件包含一个参数:

参数名称:“do”

参数值:“/ webservice / whisper / login_ms @ gmail.com / password_ms / action_stirwhisper / whisperstirdata_ {”@“”“” >

编码的查询组件将如下所示:

do=%2Fwebservice%2Fwhisper%2Flogin_ms%40gmail.com%2Fpassword_ms%2Faction_stirwhisper%2Fwhisperstirdata_%7B%22feed_id%22%3A%2289%22%2C%22say_something%22%3A%22pqrst%22%2C%22privacy%22%3A0%7D