首页 > 代码库 > ios NSURLRequest
ios NSURLRequest
NSURLRequest 对象代表了一个url 加载请求,从某种程度上来说它是一个独立的协议和url体系。
一个NSURLRequest 必须包含 url 加载请求时的两个基本数据元素 :
- 加载时的url
- 实现url内容缓冲时所采用的缓冲策略。
- HTTPShouldUsePipelining
mainDocumentURL
Property (一般用于js交互和cookie)if ( [request.mainDocumentURL.relativePath isEqualToString:@"xx"] ) {
//页面跳转代码
return false;
}
allHTTPHeaderFields 返回request的header
[request setValue:@"application/x-apple-plist" forHTTPHeaderField:@"Content-type"]; [request setValue:@"no-cache" forHTTPHeaderField:@"cache-control"]; [request setValue:@"zh-cn,zh;q=0.5" forHTTPHeaderField:@"Accept-Language" ]; [request setValue:@"text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8" forHTTPHeaderField:@"Accept"];
Accept = "text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8";
"Accept-Language" = "zh-cn,zh;q=0.5";
"Cache-Control" = "no-cache";
"Content-Type" = "application/x-apple-plist";
- (void)setValue:(NSString *)value
forHTTPHeaderField:(NSString *)field 设置request的header
- (void)addValue:(NSString *)value
forHTTPHeaderField:(NSString *)field 上面的setValue每次都设置一个新的值,而addValue可以在原来已存在的值是增加新的值
NSMutableString *body = [[NSMutableString alloc] initWithCapacity:0]; [body appendString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; [body appendString:@"<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"]; NSData *data = http://www.mamicode.com/[body dataUsingEncoding:NSUTF8StringEncoding];>@property(copy) NSData *setHTTPBody
@property(copy) NSData *HTTPBody
设置获取 HTTPBody. 如果我们使用POST的时候参数就在这个body中。
@property(retain) NSInputStream *HTTPBodyStream
接受者的HTTP主体流,如果没有被设置的话就是nil。返回的流仅供检验,所有对这个流的操作都是不安全的。
接收者的请求主体将会是这个输入流。在POST请求中,整个流对象内容都会被当作主体来发送。输入流不应该不打开,接收者会作为代理来接收输入流。
NSURLRequest的setHTTPBodyStream接受的是一个NSInputStream*参数,那我们要自定义inputStream的话,创建一个NSInputStream的子类传给它是不是就可以了?实际上不行,这样做后用NSURLRequest发出请求会导致crash,提示[xx _scheduleInCFRunLoop:forMode:]: unrecognized selector。
这是因为NSURLRequest实际上接受的不是NSInputStream对象,而是CoreFoundation的CFReadStreamRef对象,因为CFReadStreamRef和NSInputStream是toll-free bridged,可以自由转换,但CFReadStreamRef会用到CFStreamScheduleWithRunLoop这个方法,当它调用到这个方法时,object-c的toll-free bridging机制会调用object-c对象NSInputStream的相应函数,这里就调用到了_scheduleInCFRunLoop:forMode:,若不实现这个方法就会crash。
ios NSURLRequest