使用URL编码字符串时,iPhone上的OADataFetcher出现问题

时间:2010-03-02 13:14:59

标签: iphone oauth urlencode

我在iPhone Twitter应用中使用OAuth / xAuth,并且包含特殊字符的密码存在问题。例如“密码&”。首先,我正在转换&通过以下方式进入%26:

NSString *encodedPassword = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                 NULL,
                                                                                 (CFStringRef)thePassword,
                                                                                 NULL,
                                                                                 (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                 kCFStringEncodingUTF8 );

将其编码为“密码%26”。然后我将其设置为OAMutableURLRequest的参数:

    [request setParameters:[NSArray arrayWithObjects:
                        [OARequestParameter requestParameterWithName:@"x_auth_mode" value:@"client_auth"],
                        [OARequestParameter requestParameterWithName:@"x_auth_username" value:encodedUsername],
                        [OARequestParameter requestParameterWithName:@"x_auth_password" value:encodedPassword],
                        nil]];

使用OADataFetcher发送请求后,我收到NSUrlError:

  

错误域= NSURLErrorDomain代码= -1012 UserInfo = 0x4823e00“操作无法完成。(NSURLErrorDomain错误-1012。)”

我在这里做错了什么?如果我离开&在密码中,它崩溃了我的代码(setParamaters数组丢失了)。有没有人在使用OAuth之前遇到过这个问题?

如果我有一个字母数字密码,一切正常......感谢任何指导!

2 个答案:

答案 0 :(得分:0)

OAuthRequestParameter已经对名称和值进行了编码;它可能是&特别是造成问题。您是否尝试过使用不同的非标准字符?可能需要修改OAuth库本身。

答案 1 :(得分:0)

问题是标准OAuth libary使用buggy stringByAddingPercentEscapesUsingEncoding来编码用户名和密码。

我的解决方案是创建一个类别来覆盖OARequestParameter

中的以下方法
 - (NSString *)URLEncodedName 
{
 return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}

- (NSString *)URLEncodedValue 
{
    return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}

即:

将以下内容放在项目中:

//the .h file
#import "OARequestParameter.h"

@interface OARequestParameter (YourApp)

@end

并使用以下方法覆盖错误方法:

#import "OARequestParameter+YourApp.h"


@implementation OARequestParameter (YourApp)

-(NSString*)encode:(NSString*)unencodedString
{
 NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                       NULL,
                       (CFStringRef)unencodedString,
                       NULL,
                       (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                       kCFStringEncodingUTF8 );
 return [encodedString autorelease]; 
}

- (NSString *)URLEncodedName 
{
 //return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
 return [self encode:self.name];
}

- (NSString *)URLEncodedValue 
{
    //return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
 return [self encode:self.value];
}

@end