ios NSURLRequest

NSURLRequest 对象代表了一个url 加载请求,从某种程度上来说它是一个独立的协议和url体系。

一个NSURLRequest 必须包含 url 加载请求时的两个基本数据元素 :

  1. 加载时的url
  2. 实现url内容缓冲时所采用的缓冲策略。

NSURLRequest 设计的目的是通过添加提供访问自己指定协议属性方法的类别来支持附加协议。通过调用NSURLProtocol 的 propertyForKey:inRequest: and setProperty:forKey:inRequest:

注意: 下面的可设置值都是相对于NSURLMutableRequest来说的。

注意:NSURLRequest 只是包含 URL请求时的一些信息,如果想要发起URL请求必须使用NSURLSession or NSURLConnection
把请求发送到服务器。

方法:

+ (instancetype)requestWithURL:(NSURL *)theURL
     用指定的url创建一个NSURLRequest。  缓冲策略是默认的

NSURLRequestUseProtocolCachePolicy。超时是默认的60秒。

缓冲策略:

NSURLRequestUseProtocolCachePolicy = 0,

NSURLRequestReloadIgnoringLocalCacheData=1,

NSURLRequestReturnCacheDataElseLoad=2,

NSURLRequestReturnCacheDataDontLoad= 3

缓冲策略第一种最为复杂,我们先来看后几种。

第二种是忽略一切缓冲,就相当于不做任何缓冲。每次都去server请求内容。

第三种是用指定的缓冲来响应来请求,不考虑缓冲的生命周期跟过期时间,如果指定的缓冲不存在,则去服务器请求数据。

第四种用指定的缓冲来响应来请求,不考虑缓冲的生命周期跟过期时间。但是如果没有相应的缓冲也不会去服务器获取相应的数据,会认为请求失败。

第一种比较麻烦,先上一个图

1. 如果缓冲不存在,去server请求新的数据。

2. 如果缓冲存在并且不需要每一次都与源服务器进行重新激活,并且缓冲没有过期则返回 缓冲。

3.如果需要每一次都进行重新激活或者已过期则向server发一个headRequst 查看一个服务器是否发生改变,如果改变则进行新的请求,如果没有则返回缓冲。

上面的判断条件都可在NSURLRequest 的header 中进行设置。

属性值:

BOOL 值标志在收到前一个请求的响应之前是否可以继续传输数据。 YES,可以,No 不可以,默认是NO.在URLRequest 中是readOnly,在URLRequest
中可以改变。  并不是HTTPShouldUsePipeling = YES都会起作用,它还会受到http 代理配置,服务器配置等原因的影响。

mainDocumentURL Property
 (一般用于js交互和cookie)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

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 = [body dataUsingEncoding:NSUTF8StringEncoding];

 [request setHTTPBody:data];

@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。

时间: 2024-12-10 00:19:02

ios NSURLRequest的相关文章

ios NSURLRequest NSMutableURLRequest 数据请求

get 请求 #pragma mark - GET登录 - (void)getLogon { // 1. URL NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login.php?username=%@&password=%@", self.userName.text, self.userPwd.text]; NSURL *url = [NSURL URLWithString:urlStr];

IOS NSURLRequest(http请求)讲解 ---------赎罪之路

前言 很久没有写过博客了,今天终于可以抽空写.公司的项目从2016年03月15日(我第二份工作任职)开始,辛苦了3个多月终于接近尾声了,在这当中我学了非常多东西,为了遗忘我就写个博客来记录下,以防止忘记. 正文 今天要讲的主角是NSURLRequest.这里我先采用apple 官方文档解释 NSURLRequest objects represent a URL load request in a manner independent of protocol and URL scheme, NS

IOS NSURLRequest 设置 Header

工程中的请求,需要设置Header,请求令牌才访问,NSURLRequest 请求没有直接设置header 的方法,需要通过NSMutableURLRequest 来实现 一 NSURLRequest 设置 //1.创建request NSURLRequest *request = [NSURLRequest requestWithURL:URL]; //2.创建一个 NSMutableURLRequest 添加 header NSMutableURLRequest *mutableReques

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

WebRTC iOS平台的基本实现

前面介绍了如何下载编译WebRTC,现在介绍如何利用WebRTC在iOS客户端上简单实现音视频通话. 对下载编译还有问题的,请先查看:WebRTC(iOS)下载编译. 不需要下载源码只需要库文件的也可以用CocoaPods下载编译好的库:pod 'libjingle_peerconnection' 开始编写之前,我们首先要搭建一个服务器,此服务器主要用于信令交互.我们这里采用github上的开源项目:SkyRTC项目. 完整Demo下载:FLWebRTCDemo. 开始iOS客户端的实现: 1.

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

iOS开发网络篇—文件的上传

iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 4 5 @inter

iOS应用性能调优的25个建议和技巧

目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载Views 10. Cache, C

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. 详细信息,请参考:http://www.cnblogs.com/wendingding/p/3813706.html 3)本文示例代码发送的请求均为http请求,已经对info.plist文件进行配置. 如何配置,请参考: