2011-03-23 67 views
10

我在我的iPhone應用程序中做一個HTTP POST,我發送給服務器的參數之一是一個URL。問題是,當我從NSURL轉換爲NSURLRequest時,字符串http://www.slashdot.org變爲http:/www.slashdot.org(其中一個正斜線缺失)失去/當從NSURL轉換爲NSURLRequest

有沒有辦法解決這個問題?

這裏是我使用的代碼:我使用的NSLog,看看它失去了「/」,它是在第四行

NSString *host = @"example.host.com"; 
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *jsonString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 

感謝花時間閱讀!

+0

我發現創建一個從的NSString的NSURL當斜線丟失,不當從NSURL到NSURLRequest時。你可以看到如果你NSLog([url description])。 – Oscar 2013-02-26 07:35:48

回答

12

在將它們替換爲字符串之前,您不是百分比轉義查詢值。我只做了一些測試,發現如果我將urlToPublish設置爲「http://example.com」,那麼NSURL會將其轉換爲「http:/example.com」。

這是因爲查詢值包含特殊字符,這意味着您需要添加百分號轉義。至少你可以使用平庸的-[NSString stringByAddingPercentEscapesUsingEncoding:]NSASCIIStringEncoding。更好的辦法是使用不同的(並且更完整的)逃避機制,比如我建議的那個機制in this post


在這種情況下,stringByAddingPercentEscapesUsingEncoding:不起作用,因爲它是一個非常糟糕的方法。它適用於包括模型,這意味着你必須告訴它你想要百分比編碼的字符。 (引擎蓋下,它只是調用CFURLCreateStringByAddingPercentEscapes())這個函數基本上要求你提供一個字符串,表示它允許百分比編碼的每個字符(正如我理解的函數)。你真正想要的是一個獨家模型:除了[這一小組字符]之外的所有內容。我上面鏈接的功能是這樣的,你會這樣使用它:

NSString *urlToPublish = [@"http://stackoverflow.com" URLEscapedString_ch]; 
NSString *host = @"example.host.com"; 
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString]; 

然後它會正確地建立你的URL。


這裏的另一種方式,你可以做到這一點(做正確)。轉到my github page和下載「DDURLBuilder.h」和「DDURLBuilder.m」,然後建立你的URL是這樣的:

NSString *localEmail = @"[email protected]"; 
NSString *urlToPublish = @"http://stackoverflow.com" 

DDURLBuilder *b = [DDURLBuilder URLBuilderWithURL:nil]; 
[b setScheme:@"http"]; 
[b setHost:@"example.host.com"]; 
[b setPath:@"SetLeaderUrl.json"]; 
[b addQueryValue:localEmail forKey:@"leader_email"]; 
[b addQueryValue:urlToPublish forKey:@"url"]; 

NSURL *url = [b URL]; 
+0

我試過這個,沒有去,仍然有問題 – Lance 2011-03-24 17:00:12

+0

@Lance,正如我所說,'stringByAddingPercentEscapesUsingEncoding:'是平庸的,在這種情況下,不起作用。編輯答案。 – 2011-03-24 17:05:06

+0

謝謝戴夫:)我想從另一篇文章實現你的方法,並且我把這個頭文件中的方法聲明如下: - (NSString *)URLEncodedString_ch; 但是當我嘗試在我的.m文件中調用該方法時,就像它擁有它,但它表示編碼而不是轉義,它給了我一個警告,表示它可能不會響應。我究竟做錯了什麼? – Lance 2011-03-24 17:38:54

-2

編輯1 描述我得到的問題。但是在我的輸出中錯過了它。 (因此向下投票:-() 所以刪除了我忍了作爲一個答案代碼。

* 編輯2

,而是與這裏我的意見是一些代碼蘋果使用獲得的NSURLRequest ,

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"] 
        cachePolicy:NSURLRequestUseProtocolCachePolicy 
       timeoutInterval:60.0];  

@戴夫德隆:我在蘋果的通知「URL Loading System Program Guide」的例子中創建連接並請求不使用任何轉義。它使用的URL是從NSURL URLWithString:

+0

@markhunte問題不是轉義'@「example.host.com」',問題是轉義'http:// example.com'。您*確實*有OP報告的問題。看看你的日誌輸出。它有''url = http:/example.com「'而不是''url = http://example.com」'(這是OP期望的,但是錯誤的)。它*應該*是'「url = http%3A%2F%2Fexample.com」' – 2011-03-24 01:47:41

+0

@ Dave DeLong,是的,你是對的。我的不好,尷尬地說,我沒有看清我自己的產出。所以這個問題實際上是在你爲NSURL使用initWithScheme:host:path的時候。 – markhunte 2011-03-24 07:05:04

+0

@markhunte是的,這是一個問題,我仍然沒有找到解決方案,我試過使用stringByReplacingOccurrencesOfString:@:「//」withString @「/ \ /」 或@「%2F %2F「,這些工作都沒有。...... – Lance 2011-03-24 17:01:41

-4

我固定它,這是我必須做的:

NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
urlString = [NSString stringWithFormat:@"%@%@%@",scheme,host,urlString]; 
NSURL *url = [[NSURL alloc] initWithString:urlString]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
+7

-1000000否否否否否。這是絕對錯誤的。你只能編碼**鍵和查詢字符串**的值,而不是整個路徑。您以這種方式創建非法網址,而且它仍然有效的事實是一個令人高興的巧合,但它很可能在未來破裂。 **做對,或根本不做。** – 2011-03-24 17:30:13