在URL

2014-04-03 21 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行,並備份調用堆棧)