iOS網(wǎng)絡(luò)—請求類NSURLRequest詳解

NSURLRequest
iOS網(wǎng)絡(luò)編程之四——請求類NSURLRequest使用詳解

一、NSURLRequest函數(shù)介紹

==========================================================
==========================類方法===========================
==========================================================
/*
  通過這種方式創(chuàng)建的請求對象 默認使用NSURLRequestUseProtocolCachePolicy緩存邏輯 默認請求超時時限為60s
 */
+ (instancetype)requestWithURL:(NSURL *)URL;

/*
  < readonly > 返回一個BOOL值 用于判斷是否支持安全編碼
 */
@property (class, readonly) BOOL supportsSecureCoding;

/*
  請求對象的初始化方法 創(chuàng)建時設(shè)置緩存邏輯和超時時限
  自定義:
    cachePolicy:
    timeoutInterval:
  */
+ (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;

==========================================================
=======================對象方法=============================
==========================================================
/*
  init方法進行對象的創(chuàng)建 默認使用NSURLRequestUseProtocolCachePolicy緩存邏輯 默認請求超時時限為60s
 */
- (instancetype)initWithURL:(NSURL *)URL;

/*
  init方法進行對象的創(chuàng)建
 */
- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval NS_DESIGNATED_INITIALIZER;

/*
  < readonly > 只讀屬性 獲取請求對象的URL
 */
@property (nullable, readonly, copy) NSURL *URL;

/*
  < readonly > 只讀屬性 緩存策略枚舉
 */
@property (readonly) NSURLRequestCachePolicy cachePolicy;

/*
  < readonly > 只讀屬性 獲取請求的超時時限
 */
@property (readonly) NSTimeInterval timeoutInterval;

/*
  < readonly > 主文檔地址 這個地址用來存放緩存
 */
@property (nullable, readonly, copy) NSURL *mainDocumentURL;

/*
  < readonly > 獲取網(wǎng)絡(luò)請求的服務(wù)類型
  作用:指定網(wǎng)絡(luò)傳輸類型倘感。精切指出傳輸類型放坏,可以讓系統(tǒng)快速響應(yīng),提高傳輸質(zhì)量老玛,延長電池壽命等
 */
@property (readonly) NSURLRequestNetworkServiceType networkServiceType API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0));

/*
  < readonly > 獲取是否允許使用服務(wù)商蜂窩網(wǎng)絡(luò)
 */
@property (readonly) BOOL allowsCellularAccess  API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));

拓展

==========================================================
=====================緩存策略枚舉===========================
==========================================================
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    //默認的緩存協(xié)議
    NSURLRequestUseProtocolCachePolicy = 0,

    //無論有無本地緩存數(shù)據(jù) 都進行從新請求
    NSURLRequestReloadIgnoringLocalCacheData = 1,
    //忽略本地和遠程的緩存數(shù)據(jù) 未實現(xiàn)的策略
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, 
    //無論有無緩存數(shù)據(jù) 都進行從新請求
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    //先檢查緩存 如果沒有緩存再進行請求
    NSURLRequestReturnCacheDataElseLoad = 2,
    //類似離線模式淤年,只讀緩存 無論有無緩存都不進行請求
    NSURLRequestReturnCacheDataDontLoad = 3,

    //未實現(xiàn)的策略
    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};


==========================================================
=================網(wǎng)絡(luò)請求的服務(wù)類型枚舉=======================
==========================================================
typedef NS_ENUM(NSUInteger, NSURLRequestNetworkServiceType)
{
    // 普通網(wǎng)絡(luò)傳輸,默認使用這個
    NSURLNetworkServiceTypeDefault = 0,     // Standard internet traffic
    // 網(wǎng)絡(luò)語音通信傳輸蜡豹,只能在VoIP使用
    NSURLNetworkServiceTypeVoIP = 1,        // Voice over IP control traffic
    // 影像傳輸
    NSURLNetworkServiceTypeVideo = 2,      // Video traffic
    // 網(wǎng)絡(luò)后臺傳輸麸粮,優(yōu)先級不高時可使用。對用戶不需要的網(wǎng)絡(luò)操作可使用
    NSURLNetworkServiceTypeBackground = 3, // Background traffic
    // 語音傳輸
    NSURLNetworkServiceTypeVoice = 4       // Voice data
};

二镜廉、NSMutableURLRequest介紹

NSURLRequest請求類除了在初始化時可以設(shè)定一些屬性弄诲,創(chuàng)建出來后則大部分屬性都為只讀的,無法設(shè)置與修改娇唯。另一個類NSMutableURLRequest可以更加靈活的設(shè)置請求的相關(guān)屬性齐遵。NSMutableURLRequest 繼承 NSURLRequest凤巨。
/*
  設(shè)置請求的URL
*/
@property (nullable, copy) NSURL *URL;

/*
  設(shè)置請求的緩存策略
*/
@property NSURLRequestCachePolicy cachePolicy;

/*
  設(shè)置超時時間
*/
@property NSTimeInterval timeoutInterval;

/*
  設(shè)置緩存目錄
*/
@property (nullable, copy) NSURL *mainDocumentURL;

/*
  設(shè)置網(wǎng)絡(luò)服務(wù)類型
 */
@property NSURLRequestNetworkServiceType networkServiceType API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0));

/*
  設(shè)置是否允許使用服務(wù)商蜂窩網(wǎng)
 */
@property BOOL allowsCellularAccess API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));

三、NSURLRequest請求對象與HTTP/HTTPS協(xié)議相關(guān)請求的屬性設(shè)置

以下屬性的設(shè)置必須使用NSMutableURLRequest類洛搀,如果是NSURLRequest,則只可以讀佑淀,不可以修改留美。
/*
  設(shè)置HPPT請求方式 默認為 “GET”
*/
@property (copy) NSString *HTTPMethod;

/*
  通過字典設(shè)置HTTP請求頭的鍵值數(shù)據(jù)
*/
@property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields;

/*
  設(shè)置http請求頭中的字段值
*/
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;

/*
  向http請求頭中添加一個字段
*/
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

/*
  設(shè)置http請求體 用于POST請求
*/
@property (nullable, copy) NSData *HTTPBody;

/*
  設(shè)置http請求體的輸入流
*/
@property (nullable, retain) NSInputStream *HTTPBodyStream;

/*
  設(shè)置發(fā)送請求時是否發(fā)送cookie數(shù)據(jù)
*/
@property BOOL HTTPShouldHandleCookies;

/*
  設(shè)置請求時是否按順序收發(fā) 默認禁用 在某些服務(wù)器中設(shè)為YES可以提高網(wǎng)絡(luò)性能
 */
@property BOOL HTTPShouldUsePipelining API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0));

拓展 -- HTTP請求頭

關(guān)于HTTP請求頭

  • Accept-Encoding

    • 表示本地可以接收壓縮格式的數(shù)據(jù),而服務(wù)器在處理時就將大文件壓縮再發(fā)回客戶端伸刃』牙客戶端接收完成后在本地對數(shù)據(jù)進行解壓操作。
  • Content-Type

    • 表示內(nèi)容類型捧颅,一般是指客戶端存在的Content-Type景图,用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼,決定客戶端將以什么形式碉哑、什么編碼讀取這個文件挚币。即用于標識發(fā)送或接收到的數(shù)據(jù)的類型,客戶端根據(jù)該參數(shù)來決定數(shù)據(jù)的打開方式扣典。
  • Content-Length

    • 表示述HTTP消息實體的傳輸長度妆毕。消息實體長度:即Entity-length,壓縮之前的message-body的長度贮尖;
  • Authorization

    • HTTP基本認證是一種用來允許Web瀏覽器笛粘,或其他客戶端程序在請求時提供以用戶名和口令形式的憑證的登錄方式。授權(quán)機制根據(jù)服務(wù)端定的規(guī)則確定湿硝。

四薪前、舉個栗子

4.1、普通的Post請求

// 把bodyString轉(zhuǎn)換為NSData數(shù)據(jù)  
NSData *bodyData = [[bodyString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]dataUsingEncoding:NSUTF8StringEncoding];
// 獲取到服務(wù)器的url地址  
NSURL *serverUrl = [[NSURL URLWithString:RequestUrl] URLByAppendingPathComponent:urlStr];

// 請求這個地址关斜, timeoutInterval:10 設(shè)置為10s超時:請求時間超過10s會被認為連接不上示括,連接超時  
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:serverUrl  
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData  
                                                   timeoutInterval:10];
// POST請求  
[request setHTTPMethod:@"POST"];
// body 數(shù)據(jù)  
[request setHTTPBody:bodyData];
// 請求頭  
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
// 或者  --  設(shè)置請求頭,用POST請求蚤吹,給服務(wù)器發(fā)送JSON數(shù)據(jù)
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"111318d2-b5a5-1998-be2a-30607d1591ca" forHTTPHeaderField:@"appid"]; 

// 同步發(fā)送request例诀,成功后會得到服務(wù)器返回的數(shù)據(jù)
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  

4.2、特殊請求:NSURLRequest設(shè)置自定義請求頭

iOS開發(fā)之如何在NSURLRequest中設(shè)置自定義header請求頭

 // 設(shè)置url裁着,這里是百度API查詢天氣的一個接口  
    NSString *strURL =[[NSString alloc]  
                       initWithFormat:@"http://apis.baidu.com/heweather/weather/free?city=%@",  @"guangzhou"];  
      
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
      
    NSURL *url = [NSURL URLWithString:strURL];  
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];  
  
    //添加header  
    NSMutableURLRequest *mutableRequest = [request mutableCopy];    //拷貝request  
    [mutableRequest addValue:@"你的apikey" forHTTPHeaderField:@"apikey"];  
    request = [mutableRequest copy];        //拷貝回去  
    /**********************************************/  
  
    NSLog(@"%@", request.allHTTPHeaderFields);  //打印出header驗證      
    NSURLConnection *connection = [[NSURLConnection alloc]  
                                   initWithRequest:request  
                                   delegate:self];  

基本上完結(jié) !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末繁涂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子二驰,更是在濱河造成了極大的恐慌扔罪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桶雀,死亡現(xiàn)場離奇詭異矿酵,居然都是意外死亡唬复,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門全肮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敞咧,“玉大人,你說我怎么就攤上這事辜腺⌒萁ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵评疗,是天一觀的道長测砂。 經(jīng)常有香客問我,道長百匆,這世上最難降的妖魔是什么砌些? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮加匈,結(jié)果婚禮上存璃,老公的妹妹穿的比我還像新娘。我一直安慰自己矩动,他們只是感情好有巧,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悲没,像睡著了一般篮迎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上示姿,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天甜橱,我揣著相機與錄音,去河邊找鬼栈戳。 笑死岂傲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的子檀。 我是一名探鬼主播镊掖,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褂痰!你這毒婦竟也來了亩进?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤缩歪,失蹤者是張志新(化名)和其女友劉穎归薛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡主籍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年习贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千元。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡苫昌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幸海,到底是詐尸還是另有隱情蜡歹,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布涕烧,位于F島的核電站,受9級特大地震影響汗洒,放射性物質(zhì)發(fā)生泄漏议纯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一溢谤、第九天 我趴在偏房一處隱蔽的房頂上張望瞻凤。 院中可真熱鬧,春花似錦世杀、人聲如沸阀参。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛛壳。三九已至,卻和暖如春所刀,著一層夾襖步出監(jiān)牢的瞬間衙荐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工浮创, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忧吟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓斩披,卻偏偏與公主長得像溜族,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垦沉,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容