您的位置:首页 > 其它

GET-POST请求,数据的持久化

2015-08-19 18:59 351 查看
- (IBAction)synGET:(id)sender {

NSLog(@"GET同步请求");

NSString *strURL=@"http://api.map.baidu.com/place/v2/search?query=银行®ion=大连&output=json&ak=6E823f587c95f0148c19993539b99295";

//一个正常的URL地址是不允许有中文的,只能数字,有6个英文字母的大小写,和一些特殊的符号比如&,%等,如果遇到带中文的URL,首先把它进行编码.

NSString *strEncode=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSLog(@"%@",strEncode);

//接下来.URL符合要求之后,就开始进行网络请求,网络请求分为三步

//1.根据已经编好的URL,创建一个NSURL

NSURL *url=[NSURL URLWithString:strEncode];

//2.发送一个请求

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

//3.妇女会我们要的一个数据,一个NSData对象

//第一个参数:刚刚创建的请求

//第二个参数:返回一个响应

//第三个参数:错误信息

NSURLResponse *response=nil;

NSError *error=nil;

NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

//对返回回来的数据,data进行json解析

//把所有的银名打印出来

NSMutableDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSMutableArray *arr=[NSMutableArray array];

arr=dic[@"results"];

for (NSMutableDictionary *dic in arr) {

NSLog(@"%@",dic[@"name"]);}}

- (IBAction)synPOST:(id)sender {

NSLog(@"POST请求");

NSString *strURL=@"http://ipadbjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";

NSURL *uil=[NSURL URLWithString:strURL];

NSMutableURLRequest *reques=[NSMutableURLRequest requestWithURL:uil];

//接下来是POST请求独有的部分

//把请求的方式首先设置成POST请求,默认是GET

[reques setHTTPMethod:@"POST"];

//接下来需要把请求的内容放到request的body中

NSString*bodyStr=

@"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213";

//需要把请求部分的字符串变成NSData类型的对象

NSData *bodyData=[bodyStr dataUsingEncoding:NSUTF8StringEncoding];

//把bodyData放到request中

[reques setHTTPBody:bodyData];

NSData *data=[NSURLConnection sendSynchronousRequest:reques returningResponse:nil error:nil];

//json

NSMutableDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil ];

NSLog(@"%@",dic);

NSMutableArray *arr=[NSMutableArray array];

arr=dic[@"news"];

for (NSMutableDictionary *dic in arr) {

NSLog(@"%@",dic[@"cname"]);

}}

-(IBAction)asynGET:(id)sender {

NSLog(@"GET异步请求");

NSString *strURL=@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";

NSURL *url=[NSURL URLWithString:strURL];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

//前两步和之前还是一模一样,第三步出现变化,通过代理的方式进行异步操作

[NSURLConnection connectionWithRequest:request delegate:self];}

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

//只要接受到服务器放回的相应信息,就会走这个方法,我们在这个方法里需要接受数据的容器data进行初始化设置

self.data=[NSMutableData data];}

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

//只要返回数据就会走这个协议方法

//append是累加的意思

[self.data appendData:data];}

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

//到这,整个请求已经结束,需要把返回的data对imageView的image进行赋值

self.imageView.image=[UIImage imageWithData:self.data];}

#warning 同步和异步GET请求在步骤上完全相同,只是在第三步同步使用的是sendSyn的方法,异步使用的是代理的方法,异步是基于同步进行操作

-(IBAction)asynPOST:(id)sender {

NSLog(@"POST异步");

NSString *strURl=@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";

//1.创建NSURL

NSURL *url=[NSURL URLWithString:strURl];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

NSString *bodyData=@"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213";

NSData *data=[bodyData dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPBody:data];

//网络请求在子线程里进行请求,请求下来的数据需要通过控件作为载体体现出来,需要把数据在主线程里显示,第二个参数就是指定把数据返回到那个线程
mainQueue是主线程

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {//参数的data就是我们请求下来的数据,接下来数据的解析就在block中进行操作

//在block中进行josn解析

NSMutableDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

//NSLog(@"%@",dic);

NSMutableArray *arr=[NSMutableArray array];

arr=dic[@"news"];

for (NSMutableDictionary *dic in arr) {

NSLog(@"%@",dic[@"summary"]);

}}];

}

-(IBAction)blockGET:(id)sender {

NSLog(@"GET异步通过block的方式");

NSString *str=@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";

NSURL *url=[NSURL URLWithString:str];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {self.imageView.image=[UIImage imageWithData:data];

}];

}

#warning 总结一下网络请求的步骤:1.根据网址的字符串,创建一个NSURL对象 2.根据这个url对象,创建一个请求,3,发送请求,然后获取请求对象,同步和异步的区别就是在请求的方法选用有差别,其他都一样

//#warning POST就是比GET请求多一个,需要给request添加一个body

///////////////////////////////////数据的持久化////////////////////////////////////////

//苹果手机为了保证数据上的绝对安全设计了沙盒文件,每一个应用程序都配备了自己的沙盒文件,每一次运行,文件夹的名字都会变成一个没有任何规律的字符串

//第一个参数:当前要前往哪一个文件夹,前往documents文件用NSDocumentDirectory,64行那个,还可以前往caches文件夹,对应68行.

//第二个参数:访问的文件夹类型.

//第三个参数:绝对路径(YES),相对路径(NO).

//绝对路径是给系统来使用,系统可以根据当前的路径找到文件夹,我们在操作文件的时候都是用绝对路径.

//相对路径只是会把要前往的文件夹显示,其他部分都是~,告诉程序员要去那个文件夹.

NSArray *sandbox=NSSearchPathForDirectoriesInDomains(NSCachesDirectory , NSUserDomainMask, YES);

NSLog(@"%@",sandbox[0]);

//沙盒里一共有三个文件

//1.是Documents文件:主要是用来存储用户的想要存储的一些信息,比如收藏的信息或者自己设置的一些内容,所以我们做收藏功能就是往这个文件夹里面写文件.

//2.library文件夹是方便程序开发者使用的,主要操作它里面的两个文件夹,caches和Preferences

//caches:用来保存缓存文件,SDWebImage会把图片加到缓存文件中,所以清除缓存功能就是把这个文件夹删除

//Preferences一般来保存程序员设置的信息,比如NSUserDefaults就会把数据保存在这个文件夹里

//3.tmp文件:一般存放临时内容

//之前在沙盒里还有一个.app文件,在新的版本里已经被移走了

//把简单对象写入到本地,简单对象指的是NSString,NSArray等

//1.先通过数组获取沙盒路径

NSArray *sendBox= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

//从数组里获取沙盒路径

NSString *sendBoxPath=sendBox[0];

//要给写入的文件拼接一个路径,拼接方式有两种

NSString *documentPath=[sendBoxPath stringByAppendingString:@"/小王子.txt"];

NSLog(@"%@",documentPath);

NSString *documentPath1=[sendBoxPath stringByAppendingPathComponent:@"小王子.txt"];

NSLog(@"%@",documentPath1);

//将字符串写入本地

NSString *str=@"隔壁老顾总耍剑,金丝大家";

//第一个参数:文件要保存的路径

//第二个参数:对文件进行保护,YES

//第三个参数:编码

//第四个参数:错误信息

[str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

//如果路径下有对应文件,则会把原来文件覆盖,如果没有则创建一个新文件

/把沙盒文件读出来

NSString *temStr=[NSString stringWithContentsOfFile:documentPath encoding:NSUTF8StringEncoding error:nil];

NSLog(@"%@",temStr);

//把数组写入到本地

NSArray *arr=@[@"1",@"2",@"3",@"4",@"5"];

//通过数组获取沙盒地址NSDocumentDirectory

NSArray *sendBox=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

//用字符串保存沙盒路径

NSString *sendBoxPath=sendBox[0];

//给要写入的文件拼接路径

NSString *str=[sendBoxPath stringByAppendingString:@"/jj.txt"];

//把数组写入到本地

[arr writeToFile:str atomically:YES];

NSLog(@"%@",str);

NSArray *a=[NSArray arrayWithContentsOfFile:str];

NSLog(@"%@",a);

NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"1",@"2",@"3",@"4" ,nil];

NSArray *sendBox=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *sendPath=sendBox[0];

NSString *str=[sendPath stringByAppendingString:@"/ii.txt"];

[dic writeToFile:str atomically:YES];

NSLog(@"%@",str);

NSDictionary *d=[NSDictionary dictionaryWithContentsOfFile:str];

NSLog(@"%@",d);

//复杂对象写入到本地,主要指我们自己创建的对象写入到本地,

Student *stu=[Student studentWithname:@"小王子" sex:@"男" age:23 hobby:@"呵呵"];

//1.通过数组获取沙盒路径

NSArray *sendBox=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

NSString *sendBoxstr=sendBox[0];

//3.拼接文件夹路径,这个文件的扩展名是任意的

NSString *str=[sendBoxstr stringByAppendingString:@"/复杂.plist"];

//对对象进行归档操作

//第一个参数:要实现归档的对象

//第二个参数:路经

NSMutableArray *arr=[NSMutableArray array];

[arr addObject:stu];

[NSKeyedArchiver archiveRootObject:arr toFile:str];

NSLog(@"%@",str);

//进行反归档操作

Student *newStu=[NSKeyedUnarchiver unarchiveObjectWithFile:str];

NSLog(@"%@",newStu.name);

NSMutableArray *arr1=[NSKeyedUnarchiver unarchiveObjectWithFile:str];

NSLog(@"%@",arr1);

#warning 总结:数据持久化的步骤

1.指定前往哪一个文件夹

2.用字符串接受路径

3.拼接文件路径

4.归档(写入本地)

5.反归档(从本地读出文件)

注:如果是复杂对象归档,要签订NScoding方法,并且实现两个协议方法,放在数组里的复杂对象归档也要签协议.

//NSUserDefaults一般存在的是小的数据,比如字符串等,它用法和字典类似

NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];

[defaults setObject:@"123456" forKey:@"passWord"];

NSArray *sendBox=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSLog(@"%@",sendBox);

NSLog(@"%@",[defaults objectForKey:@"passWord"]);

//通过文件管理者对文件夹进行操作

NSArray *arr=NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

NSString *sandBoxstr=arr[0];

//创建一个文件管理者

NSFileManager *manager=[NSFileManager defaultManager];

//给要创建的文件夹拼接一个路径

NSString *str=[sandBoxstr stringByAppendingString:@"/guyu"];

//文件夹的名不需要有任何扩展名

//通过manager进行文件的创建

[manager createDirectoryAtPath:str withIntermediateDirectories:YES attributes:nil error:nil];

NSLog(@"%@",str);

//向新建文件夹内写入一个字符串

NSString *r=@"qqqqq";

NSString *re=[str stringByAppendingString:@"/guyu.txt"];

[r writeToFile:re atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",re);

//移除文件夹

manager removeItemAtPath:str error:nil];

//清除缓存

NSArray *cancle=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *can=cancle[0];

[manager removeItemAtPath:can error:nil];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: