NSURLRequest 是一個(gè)獨(dú)立的獨(dú)立加載請(qǐng)求的協(xié)議和解決方案完丽,它封裝了 load URL 和 the policy,當(dāng)你發(fā)送了網(wǎng)絡(luò)請(qǐng)求時(shí)候可以使用緩存拇舀,你可以通過(guò)它 propertyForKey:inRequest: 和 setProperty:forKey:inRequest:.這兩個(gè)方法添加你的協(xié)議逻族,
- NSURLRequest
- NSMutableURLRequest
NSURLRequest:
初始化:
+ (instancetype)requestWithURL:(NSURL *)URL;
+ (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;
- (instancetype)initWithURL:(NSURL *)URL;
- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval NS_DESIGNATED_INITIALIZER;
//默認(rèn)使用NSURLRequestUseProtocolCachePolicy緩存邏輯 默認(rèn)請(qǐng)求超時(shí)時(shí)限為60s
/*
NSURLRequestCachePolicy枚舉如下:
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy){
//默認(rèn)的緩存協(xié)議
NSURLRequestUseProtocolCachePolicy = 0,
//無(wú)論有無(wú)本地緩存數(shù)據(jù) 都進(jìn)行從新請(qǐng)求
NSURLRequestReloadIgnoringLocalCacheData = 1,
//忽略本地和遠(yuǎn)程的緩存數(shù)據(jù) 未實(shí)現(xiàn)的策略
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
//無(wú)論有無(wú)緩存數(shù)據(jù) 都進(jìn)行從新請(qǐng)求
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
//先檢查緩存 如果沒(méi)有緩存再進(jìn)行請(qǐng)求
NSURLRequestReturnCacheDataElseLoad = 2,
//類似離線模式,只讀緩存 無(wú)論有無(wú)緩存都不進(jìn)行請(qǐng)求
NSURLRequestReturnCacheDataDontLoad = 3,
//未實(shí)現(xiàn)的策略
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
*/
NSURLRequest請(qǐng)求類除了在初始化時(shí)可以設(shè)定一些屬性骄崩,創(chuàng)建出來(lái)后則大部分屬性都為只讀的聘鳞,無(wú)法設(shè)置與修改。另一個(gè)類NSMutableURLRequest可以更加靈活的設(shè)置請(qǐng)求的相關(guān)屬性要拂。
NSMutableURLRequest
@property (nullable, copy) NSURL *URL; //設(shè)置請(qǐng)求的URL
@property NSURLRequestCachePolicy cachePolicy; //設(shè)置請(qǐng)求的緩存策略
@property NSTimeInterval timeoutInterval; //設(shè)置超時(shí)時(shí)間
@property (nullable, copy) NSURL *mainDocumentURL; ////設(shè)置緩存目錄
@property NSURLRequestNetworkServiceType networkServiceType //設(shè)置網(wǎng)絡(luò)服務(wù)類型
@property BOOL allowsCellularAccess //設(shè)置是否允許使用服務(wù)商蜂窩網(wǎng)
@property (copy) NSString *HTTPMethod;
@property (nullable, copy) NSData *HTTPBody;
@property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields; //通過(guò)字典設(shè)置HTTP請(qǐng)求頭的鍵值數(shù)據(jù)
@property (nullable, retain) NSInputStream *HTTPBodyStream; //設(shè)置http請(qǐng)求體的輸入流
@property BOOL HTTPShouldHandleCookies; //設(shè)置發(fā)送請(qǐng)求時(shí)是否發(fā)送cookie數(shù)據(jù)
//設(shè)置請(qǐng)求頭 header
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;
//將給定值追加到先前存在的值后面
此方法在重新請(qǐng)求的時(shí)候會(huì)再次把數(shù)據(jù)添加到hedaerField中抠璃。會(huì)導(dǎo)致同樣的參數(shù)數(shù)據(jù)有兩份,使得服務(wù)端會(huì)參數(shù)獲取錯(cuò)誤脱惰。
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
//類似字典賦值搏嗡,同樣的key、value只會(huì)存一份拉一。
實(shí)例:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
request.HTTPMethod = @"post";//默認(rèn)是 get
request.URL = url;
//設(shè)置body內(nèi)容
NSString *bodyString = @"??r1}????9:";
NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = bodyData;
ios 9 以后 HTTP請(qǐng)求錯(cuò)誤 彻况?
//在info.plist
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAppTransportSecurity</key>
<true/>