在URL

2014-04-03 16 views
0

iOS的特殊字符我试图让API调用:在URL

api.app.com/foo/search/Öhm 

,其中欧姆为搜索词。问题是这个URL导致了一个错误的URL异常,而正常的字符工作正常。我尝试过

[searchText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

但是这会产生很多%符号。 api预计Öhm。任何解决这个问题的方法?我正在使用restkit。

完整的错误:

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x16e719d0 {NSUnderlyingError=0x16d70d10 "bad URL", NSLocalizedDescription=bad URL} 2014-04-03 18:26:55.404 My App[6844:3807] E restkit.network:RKObjectRequestOperation.m:243 GET '(null)' (0/0 objects) [request=0.0084s mapping=0.0000s total=0.0769s]: Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x16e719d0 {NSUnderlyingError=0x16d70d10 "bad URL", NSLocalizedDescription=bad URL}

的TERMIN是(空),而不是欧姆。

代码:

[[ApiSearchManager sharedManager] search:^(NSArray *result){ 
    //handle success 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    //handle fail - it fails for Öhm 
} query:searchTerm]; 

,并在较低的水平:

- (void) search:(void (^)(NSArray *))success failure:(void (^)(RKObjectRequestOperation *, NSError *))failure query:(NSString *)query{ 

    [self getObjectsAtPath:[NSString stringWithFormat:@"foo/search/%@", query] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     if (success) { 
      success(mappingResult.array); 
     } 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     if (failure) { 
      failure(operation, error); 
     } 
    }]; 
} 
+1

你能否显示导致“不良网址异常”的代码? – matt

+0

我跑了'NSString * s = @“http://api.app.com/foo/search/Öhm”; NSURL * url = [NSURL URLWithString:s];'我没有得到任何异常。 – matt

+0

@matt它在restkit中,而restkit在内部使用asihttprequest。 –

回答

3

的%迹象逃逸,那的URL应该如何进行传输。在服务器端,URL被解释(未转义),并且服务器端代码将按照您的意图看到特殊字符。例如,看到带有%20的网址是很常见的。 ASCII字符20(十六进制)是一个空格,所以服务器端代码可以获取URL(经过适当解码),然后查看其中的空格。

+1

我同意,但他说API期望UTF8字符。正如你所知道的那样,关于URL的规则已经改变了,所以UTF8现在是合法的。 – matt

+0

@RobP百分号是*转义*字符(所有字符都是*编码*)。 –

+4

URL支持UTF-8 - 如果您根据RFC 3490将UTF-8转换为ASCII或从ASCII转换为ASCII。这意味着它们不支持UTF-8。 – gnasher729

1

日志本节:

GET '(null)' (0/0 objects) [request=0.0084s mapping=0.0000s total=0.0769s]: 

意味着你做一个GET,该请求URL是nil(这将是坏的),所以获得状态代码,因为没有请求实际发送,它花了一点时间,等等

所以,URL加载系统无法创建一个有效的URL来发出您的请求。

我会猜测你唯一可以做到这一点的方法是在RKObjectManager中没有正确配置baseURL。检查一下。 (尽管我会希望提前失败 - 所以你可能会减少调试RKObjectRequestOperation.m,第243行,并备份调用堆栈)