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請求頭
-
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];