IOS網絡編請求響應之URL結構

資料均來自互聯網,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。html

人魔七七:http://www.cnblogs.com/qiqibo/數據庫

對於咱們IOS開發者來講,咱們最重要的是訪問網絡的資源,數據都是服務器提供給咱們的。咱們通常會經過API訪問咱們網絡資源,通常一個資源可能對應不少URL,可是一個URL只對應一個資源不能對應不少資源。可是也有一些例外,例如當hostName引用一個模糊的主機。在URL加載IOS系統中,NSURL對象被用來管理URL對象。安全

一個URL一般由下面幾個部分組成以下圖:服務器

Image

protocol:這個協議組成部分指定應用層協議來和服務器通訊。你可能瞭解有其餘的協議好比ftp協議相對於http協議。http協議的統治地位由於pre-http協議遭到挑戰。另外一個常常用的協議是file協議,file協議是IOS的app用來在沙盒檢索數據的協議。若是你用NSURL可是沒有用到其餘的協議,默認用的就是這個協議。網絡

Credentials:Credentials:一些http服務器支持用戶憑證的URL對基自己份驗證是一個挑戰。如上圖所示這個憑證組成部分包含了用戶名密碼的身份驗證,這種格式索然不是很廣泛,考慮比其餘方式驗證更不安全。app

Hostname:這個組件包含TCP的hostname和IP地址關於主機包含它想要的資源。若是URL的協議是file那麼應該省略這些東西。一個URL針對一個獨立的資源被打破這是個例外當相對的和本地的主機名字被使用。例如你的主機名字做爲hostname,這個URL關聯本地機器而後用同一個URL能夠關聯不一樣的資源在不一樣的機器上。編碼

Port:這個URL port部分指定這個客戶端應該鏈接哪一個端口。若是忽略了,那麼客戶端將要用默認的端口爲這個協議例如http的80端口,https的443端口。最好的實踐是用這些端口值當應用運行在外網由於有些網絡代理和防火牆將阻塞非標準端口值由於安全或者隱私的緣由。url

Absolute-path:這個絕對路徑部分指定網絡資源的路徑,若是http服務器有可能有目錄樹。這個絕對路徑可能包括任意數量的路徑組件每一個組件用"/"字符分隔。一個絕對路徑可能不包含一個問號,空格,回車,或者換行符字符。有一些Rest服務用路徑部分做爲傳遞值來獨特標識一個實體存儲到數據庫的一種手段。例如,一個路徑/customer/456/address/0將要指定標識符456索引在0的地址。spa

Query:URl的最後部分是查詢字符串。這個值是從絕對路徑用?隔開的。多個參數每一個參數用&分隔。查詢字符串不能包含回車空格換行字符。代理

由於決定路徑和拼接的查詢字符串的內容是有限制的。URL一般用百分比編碼。rfc 3986指定了URL百分比編碼的具體細節IOS提供一個字符串對象的方法來執行URL編碼。下面代碼片斷顯示如何編碼。

NSString *urlString = @"http://myhost.com?query=This is a question";

NSString *encoded = [urlString

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

這個編碼的結果是:http://myhost.com?query=This%20is%20a%20question.每一個空格被替換成%20序列。這個編碼和URL編碼不同之處在於不編碼&字符。從而使URL參數無缺無損。URL編碼將要編碼&符號,問號,和其餘標點符號。若是你查詢字符串包含這些字符串。你須要實現更完全的編碼方法。目的是把這些字符轉化爲%+ASCII這種模式代替。

你能夠專門把這些符號剔除出來。

因而網上找了一個解決方案(

@ http://www.cnblogs.com/meyers/archive/2012/04/26/2471669.html

@implementation NSURL (mm)
+ (NSURL *)URLWithBaseString:(NSString *)baseString parameters:(NSDictionary *)parameters{  
    NSMutableString *urlString =[NSMutableString string];   //The URL starts with the base string[urlString appendString:baseString];  
    [urlString appendString:baseString];
    NSString *escapedString;  
    NSInteger keyIndex = 0;  
    for (id key in parameters) {  
      //First Parameter needs to be prefixed with a ? and any other parameter needs to be prefixed with an &
      if(keyIndex ==0) {
          escapedString =(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)[parameters valueForKey:key], NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);  
          [urlString appendFormat:@"?%@=%@",key,escapedString];
          [escapedString release];
      }else{  
          escapedString =(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)[parameters valueForKey:key], NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);  
          [urlString appendFormat:@"&%@=%@",key,escapedString];
          [escapedString release]; 
      }  
      keyIndex++;
    }  
    return [NSURL URLWithString:urlString];  
}
@end

例如: NSString * baseString = @"http://twitter.com/statuses/update.xml";

NSDictionary*dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"This is my status",@"status",@"meng ya", @"meyers",nil];
    NSURL * url = [NSURL URLWithBaseString:baseString parameters:dictionary];
    NSLog(@"the url : %@", url);
輸出:the url : http://twitter.com/statuses/update.xml?status=This%20is%20my%20status&meyers=meng%20ya
相關文章
相關標籤/搜索