NSURLRequest 是一个独立的独立加载请求的协议和解决方案,它封装了 load URL 和 the policy,当你发送了网络请求时候可以使用缓存,你可以通过它 propertyForKey:inRequest: 和 setProperty:forKey:inRequest:.这两个方法添加你的协议,
- 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;
//默认使用NSURLRequestUseProtocolCachePolicy缓存逻辑 默认请求超时时限为60s
/*
NSURLRequestCachePolicy枚举如下:
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy){
//默认的缓存协议
NSURLRequestUseProtocolCachePolicy = 0,
//无论有无本地缓存数据 都进行从新请求
NSURLRequestReloadIgnoringLocalCacheData = 1,
//忽略本地和远程的缓存数据 未实现的策略
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
//无论有无缓存数据 都进行从新请求
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
//先检查缓存 如果没有缓存再进行请求
NSURLRequestReturnCacheDataElseLoad = 2,
//类似离线模式,只读缓存 无论有无缓存都不进行请求
NSURLRequestReturnCacheDataDontLoad = 3,
//未实现的策略
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
*/
NSURLRequest请求类除了在初始化时可以设定一些属性,创建出来后则大部分属性都为只读的,无法设置与修改。另一个类NSMutableURLRequest可以更加灵活的设置请求的相关属性。
NSMutableURLRequest
@property (nullable, copy) NSURL *URL; //设置请求的URL
@property NSURLRequestCachePolicy cachePolicy; //设置请求的缓存策略
@property NSTimeInterval timeoutInterval; //设置超时时间
@property (nullable, copy) NSURL *mainDocumentURL; ////设置缓存目录
@property NSURLRequestNetworkServiceType networkServiceType //设置网络服务类型
@property BOOL allowsCellularAccess //设置是否允许使用服务商蜂窝网
@property (copy) NSString *HTTPMethod;
@property (nullable, copy) NSData *HTTPBody;
@property (nullable, copy) NSDictionary *allHTTPHeaderFields; //通过字典设置HTTP请求头的键值数据
@property (nullable, retain) NSInputStream *HTTPBodyStream; //设置http请求体的输入流
@property BOOL HTTPShouldHandleCookies; //设置发送请求时是否发送cookie数据
//设置请求头 header
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;
//将给定值追加到先前存在的值后面
此方法在重新请求的时候会再次把数据添加到hedaerField中。会导致同样的参数数据有两份,使得服务端会参数获取错误。
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
//类似字典赋值,同样的key、value只会存一份。
实例:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
request.HTTPMethod = @"post";//默认是 get
request.URL = url;
//设置body内容
NSString *bodyString = @"¼�r¹}����9:";
NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = bodyData;
ios 9 以后 HTTP请求错误 ?
//在info.plist
NSAllowsArbitraryLoads
NSAppTransportSecurity
参考:
https://my.oschina.net/u/2340880/blog/620225