网络请求

来源:互联网 发布:好用的化妆水知乎 编辑:程序博客网 时间:2024/06/07 08:28
检测网络状态
在项目中引入Reachability.h,Reachability.m文件
真机包名在bundle identifier 后面填写
选不了真机就在 general—Deployment info的Deployment Target中选择版本

请求网络:
NSURLConnection
//utf-8编码
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
//gbk(gb2312)格式编码
unsigned long encodeGBK = CFStringConverEncodingToNSStringEncoding
stringByAddingPercentEscapesUsingEncoding:encodeCBK

网络请求第三方框架:
ASIHTTPRequest  外号:“HTTP网络请求终结者”,性能最好(因为它直接基于CFNetWorking)缺点:2012年之前停止更新,所以一直存在一些隐患
AFNetWorking 2013年出现的框架,性能没有ASIHTTPRequest好(因为它基于Foundation)

处理JSON的第三方库:
SBJson,JsonKit,JsonMode
SBJson:在model外面包了一层字典
JsonMode:直接解析成model

GET请求:所有参数都暴露出来
1、客户端请求服务端的历程图


2、ios发中发起网络请求的方式(不管什么请求搜友两种GET/POST协议)
还有别的比如PUT.
注意事项:如果URL中出现中文需要对中文进行转码,转码的格式应该与服务器端的格式一致。
系统的:
NSURLConnection
NSURLSession(session是ios7.0以后才出得,如果想兼容7.0以下的版本就不能用session)

第三方的:
ASIHTTPRequest
AFNetworking
XCode7网络请求必须做的操作是:
1、在info.plist文件中加ATS权限
2、如果要跑真机的话,要设置一下bitcode
选择项目—BuildSetting——搜索bitcode把它设置为
get/post是针对请求的

3、HTTP请求常见的状态码
200:请求成功
404:找不到资源
500:服务器内部错误,该错误一般是服务端人员代码的问题也有可能是传递的请求格式不正确

4、数据解析(Json,Xml)
Json格式:
{}:字典    ————对应JSONModel中的自定义类
[]:数组—————对应JSONModel中的Array
“”:字符串  ——————对应JSONModel中的字符串类型的属性
1:数值型NSNumber———对应JSONModel中的基本数据类型的属性


Json:
JSONSerialization(性能最好,ios5.0出得),SBJson(出得比较早,它的性能比较差),JSONKit(性能比较好,相对于JSONSerialization差),JSONModel(最抽象,最近才出得,出道最晚的,性能也不好,更加面向对象,但不方便后期维护)
不方便维护的原因:json的每一层都对应一个model,只要json一改变,model需要改动很大。如果json里很多地方都出现相同的属性名,model可能会出现重命名的情况。很麻烦,解析一个属性,会建立很多类



(少)XML:NSXMLParser、TouchXML、GDataXML

缓存策略:
目的:在ios应用开发中,为了减少与服务器的交互次数,优化用户体验,加快用户的响应速度,减少对同一个url的多次请求,在无网络请求的时候也可以加载,一般都会在程序中增加缓存机制。

超时时间:指定多少秒后,中断请求和响应,并进入error方法

缓存:

//默认的缓存策略,如果服务器缓存不存在,就从服务器端取
如果缓存存在,判断服务器端是否更新,如果更新,从服务器取,如果没有更新从缓存里取

NSURLRequestUseProtocolCachePolicy = 0,    

//下面三个都是直接从服务器端取

NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

//下面三个都是从缓存里取数据。通常用于在没有网的时候

//不关心缓存是否有效(缓存有一个有效期)

    NSURLRequestReturnCacheDataElseLoad = 2,

//关心缓存的数据是否有效

    NSURLRequestReturnCacheDataDontLoad = 3,

//缓存的数据必须得到服务器的确认才能有效

    NSURLRequestReloadRevalidatingCacheData = 5

catch在沙盒中的library中

有网的情况下使用默认的缓存策略,没网的情况下从缓存中取

网络请求
NSURLConnection:(同步、异步block 和delegate(适用于大数据))
请求大数据会用:[NSURLConnection connectionWithRequest:request delegate:self]因为它会每次进行拼接
请求大数据包括下载文件。ios9 NSURLConnection
后过时

NSURLSession:ios7推出,ios9普及。替代NSURLConnection
get请求有中文需要转码,post不需要转码
NSURLConnection代理的作用:能坚挺到每次接受多少数据

服务器,后台:
1>本地服务器(测试服务器,开发服务器、内网服务器),开发、测试的时候适用该服务器
2>线上服务器(正式服务器,外网服务器),发布上线时适用该服务器,这种线上服务器一般会拥有一个域名(用域名转到IP)
JAVA的拂去器开发一般使用下面几个框架:
1>Spring MVC(现在主流的框架)
2>SSH:Struct,Spring,Hibernate(以前的三大框架)

NULLable 是ios9新出的,表示可以为空

NSURLSession
任务种类:
1>NSURLSessionDataTask:普通任务(GET/POST)
2>NSURLSessionDownloadTask:下载任务
3>NSURLSessionUploadTask:上传任务
聚合数据接口不支持post

现在最低的版本是6.0

SBJson解析:
首先下载SBJSon在项目中导入SBJSon中的JSON,SBJSon在MRC环境下的需要修改的是:Biuld Phases —Compile Sources,双击每个文件填写 -fno-objc-arc
在程序中导入下面文件:
 #import “SBJsonParser.h”//SBJsonParser用于读取

SBJsonParser *sbjp = [[SBJsonParser alloc]init];

  NSDictionary *resultDic = [sbjp objectWithString:str];


设置缓存策略,超时


谷歌浏览器有拦截的功能
找到开发者工具—network—选中请求参数(例如:query?key..)— 可以在旁边发现Response Header 。Content-Type
例如:Content-Type:application/json charset=utf8是告诉服务器解析json

使用AFNewtWorking在解析接口的时候可能会出现这样的错误:


这是因为服务端把解析格式(Content-Type
)写成text/htmlAFNetWorking不能解析。
解决方法:需要告诉AFN解析的类型是XML类型,因为AFN默认是application /json,需要告诉它是text/html
sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@“text/html“];
请求中将data转成string不成功,就是字符串格式的问题。
AFN默认支持的编码格式是utf-8
如果服务器返回的是 Content-Type:text/html

解决 后台数据有可能改变,而不能把数据存储到本地数据库中的问题:
后台机制:
版本号 long long 1++;
当后台数据改变的时候,版本号会++

前端:每次启动应用去检测版本号(获取服务器的),本地(手机沙盒)会保存一份版本号,拿本地的版本号与检测打牌的版本号对比,当不一致的时候就更新数据库,一样的时候就从数据库取数据。
这样减少了网络请求的数据量,减少了流量。达到了优化的目的。

什么时候需要使用缓存策略:
增、删、改不需要缓存
什么时候呀需要给用户展示数据:一般查询接口返回的数据需要展示给用户看,一般需要使用展示缓存策略。
缓存策略是为了更好地用户体验,使得用户更少的请求网络,当没有网的时候展示缓存中的数据
url中出现中文需要转码。出现中问的情况:有用户输入的时候、url中本身有中文的时候、在未来很有可能出现中文的参数,中文符号等都是需要转码的情况。如果不转吗url会是nil

转码的函数:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]
如果stringByAddingPercentEscapesUsingEncoding不能选,那么就需要降低版本


但是使用AFNeworking不需要转码,因为它内部已经给你转好码了。

下拉刷新报错可能的原因:
可能是网速比较慢,刷新的时候,数据源(数组)的数据与tableView以为的数据不同步。删除了数据源里的数据,但tableView没有更新。只要tableview一动,就会数组越界。

解决办法:添加:[tableView reload];

缓存:有网区网络,没网取缓存(三目运算符):


0 0