皮皮网

【格柄源码】【苹果钓鱼解锁网站源码】【如何高效阅读源码专栏】nsurlconection源码

2024-11-23 12:35:57 来源:社区开团源码

1.NSURLProtocol 详解
2.ios afnetworking原理
3.如何处理nsurlconnection获得的data
4.NSMutableURLRequest如何设置header?

nsurlconection源码

NSURLProtocol 详解

        初衷是为了让 UIWebView 可以拦截 Ajax 请求。研究了一番找到了 NSURLProtocol。

        NSURLProtocol 是属于 Foundation 框架里的 URL Loading System 的一部分,它是一个抽象类,源码格柄源码不能去实例化它,只能子类化NSURLProtocol,然后使用的时候注册子类。一个相对晦涩难解的类。

        那么如果开发者自定义的一个 NSURLProtocol 并且注册到 app 中,那么在这个自定义的 NSURLProtocol 中我们可以拦截所有的请求,进行修改,或者修改 response。

        NSHipster 上说:「或者这么说吧: NSURLProtocol 就是一个苹果允许的中间人攻击。」

        由于 NSURLProtocol 是一个抽象类,所以使用的时候必须定义一个它的子类:

        NSURLConnection 发起请求的时候,会让所有已注册的 URLProtocol 来“审批”这个请求

        注意: 如果是基于 NSURLSession 进行的请求,注册的时候需要注册到 NSURLSessionConfiguration 中:

        记得用完之后注销:

        注册成功之后,就需要我们的子类去实现抽象方法:

        用来 审批 的方法。

        前面说到「NSURLConnection 发起请求的时候,会让所有已注册的 URLProtocol 来“审批”这个请求」。这里返回NO代表放过这个请求,不作处理。返回YES,代表需要处理,则会进入后续的流程。

        注意:这里需要放过已经处理过的请求:

        这个方法用来统一处理请求 request 对象的,可以修改头信息,或者重定向。没有特殊需要,则直接return request;

        如果要在这里做重定向以及头信息的时候注意检查是否已经添加,因为这个方法可能被调用多次,也可以在后面的方法中做。

        判断网络请求是否一致,一致的话使用缓存数据。没需要就调用 super 的方法。

        子类中最重要的方法就是 -startLoading 和 -stopLoading,实现请求和取消流程。不同的自定义子类在调用这两个方法是会传入不同的内容,但共同点都是要围绕 protocol 客户端进行操作。

        可以在这里修改请求信息,重定向,DNS解析,返回自定义的测试数据。

        重点:需要标记已经处理过的 request:

        URLProtocolHandledKey 是:

        举例:直接在 startLoading 中返回测试数据:

        需要注意的是父类中有一个 client 属性。

        实现的协议 <NSURLProtocolClient> 如下:

        对于需要处理的 connection,可以在下的 NSURLConnectionDataDelegate 中进行操作:

        如果我们顺序注册 A B C 三个 Protocol,那么一个 connection 在发送的时候,处理的顺序是 C B A,而且最多只有一个 Protocol 会触发处理。

        拦截 UIWebview 的请求,会有被拒的风险。

        注意标记处理过的,具体做法在本文搜关键词 URLProtocolHandledKey 。

ios afnetworking原理

       AFNetworking主要是对NSURLSession和NSURLConnection(iOS9.0废弃)的封装,其中主要有以下类:

       1). AFHTTPRequestOperationManager:内部封装的是 NSURLConnection, 负责发送网络请求, 使用最多的一个类。(3.0废弃)

       2). AFHTTPSessionManager:内部封装是 NSURLSession, 负责发送网络请求,使用最多的一个类。

       3). AFNetworkReachabilityManager:实时监测网络状态的工具类。当前的网络环境发生改变之后,这个工具类就可以检测到。

       4). AFSecurityPolicy:网络安全的工具类, 主要是针对 HTTPS 服务。

       5). AFURLRequestSerialization:序列化工具类,基类。上传的数据转换成JSON格式

       (AFJSONRequestSerializer).使用不多。

       6). AFURLResponseSerialization:反序列化工具类;基类.使用比较多:

       7). AFJSONResponseSerializer; JSON解析器,默认的解析器.

       8). AFHTTPResponseSerializer; 万能解析器; JSON和XML之外的数据类型,直接返回二进制数据.对服务器返回的数据不做任何处理.

       9). AFXMLParserResponseSerializer; XML解析器;

如何处理nsurlconnection获得的data

       ç”¨(NSURLConnection *)connection区分,实力化NSURLConnection的成员变量,根据实力区分!

NSMutableURLRequest如何设置header?

       ç¬¬ä¸€æ­¥ï¼š

       è®©ç±»å®žçŽ°è¿™ä¸¤ä¸ªæŽ¥å£:

       NSURLConnectionDelegate,NSURLConnectionDataDelegate

       ç¬¬äºŒæ­¥ï¼š

       å®žçŽ°æŽ¥å£å¯¹åº”的方法:

       -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

        NSInteger code=[(NSHTTPURLResponse*)response statusCode];

        NSLog(@"didReceiveResponse....code=%d",code);

       }

       -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

        NSLog(@"didFailWithError...%@",[error description]);

       }

       -(void)connectionDidFinishLoading:(NSURLConnection *)connection{

        NSLog(@"connectionDidFinishLoading....");

       }

       -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

        NSString *str=[[NSString alloc]initWithData:data encoding:NSASCIIStringEncoding];

        NSLog(@"didReceiveData....data=%@",str);

       }

       ç¬¬ä¸‰æ­¥ï¼š

       è®¾ç½®NSMutableURLRequest和发起请求:

       NSString *strUrl=[NSString stringWithFormat:@" 你的地址"];

        NSURL *url=[NSURL URLWithString:strUrl];

        NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:];

        [request setHTTPMethod:@"GET"];

        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];//这个很关键,一定要设置

        [request setValue:@"字段对应的值1" forHTTPHeaderField:@"你头部的字段1"];//这里就是你自己对应的参数

        [request setValue:@"字段对应的值2" forHTTPHeaderField:@"你头部的字段2"];//这里就是你自己对应的参数

        mConn=[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:true];

        [mConn start];