字符串转为数据:[target dataUsingEncoding:];
数据转为字符串:[[NSString alloc]initWithData:encoding:];
响应状态:[NSHTTPURLResponse localizedStringForStatusCode:];
异步post开子线程写
1.HTTP请求方法
GET请求
POST请求
这2种请求方法都要大写字母。
2.区别
GET:通常用于请求URL并得到资源
POST:用于提交数据到服务器
如GET:
http://www.baidu.com/img/123.jpg
http://www.baidu.com?name=123
3.URL连接方式
同步连接(软件安装):同步(需要等待的状态),一个人做多件事,要完成1件才可以做第2件
异步连接(后台下载):多处理(单件事多个人做),通过代理实现
总的来说:当请求的数据量小时,同步连接是不错的选择,缺点:UI会“冻结”。异步连接适用于大数据,UI不“冻结”。
4.NSString、NSData、NSArray、UImage等类都有从URL初始化数据的方法,这个方法便是系统封装好的GET请求的同步连接方式。
5.创建一个GET同步连接
step1.创建URL对象,指定路径
step2.创建NSURLRequest对象,设置请求方法,默认GET
step3.创建NSURLConnect对象,发送同步连接(核心步骤)
step4.接收数据
6.创建一个POST同步连接
step2:创建NSMutableURLRequest对象,设置为POST连接方式
7.GET异步连接
step1.创建URL对象,指定路径
step2.创建NSURLRequest对象,设置请求方法,默认GET
step3:创建NSURLConnection对象,并设置代理,发送异步连接
step4.代理方法中接收数据
8.POST异步连接
step2:创建NSMutableURLRequest对象,设置为POST连接方式
GET同步
// 1.创建URL对象 NSURL * url = [NSURL URLWithString:@"http://192.168.1.5:8080/Jersey/rest/contacts"]; // 2.创建 NSURLRequest 对象 NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData // 忽略缓存 timeoutInterval:10.0f]; // 3.创建 NSURLConnection 对象,发送同步请求 // 设置回应和错误的指针变量 NSHTTPURLResponse * response = nil; NSError * error = nil; // 发起同步链接 NSData * data = [NSURLConnection sendSynchronousRequest:request//同步会卡在这里 returningResponse:&response error:&error]; // 4.接收数据 // 打印回应和错误信息 NSLog(@"response = %@",[NSHTTPURLResponse localizedStringForStatusCode:[response statusCode]]); NSLog(@"error = %@",[error localizedRecoveryOptions]); // 打印字符串信息 NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (response.statusCode == 200) { NSLog(@"str = %@",str); } //NSLog(@"str = %@",str); // 打印请求方式 NSLog(@"request method = %@",[request HTTPMethod]);
POST同步
// 1 NSURL * url2 = [NSURL URLWithString:@"http://192.168.1.5:8080/Jersey/rest/contacts/addContact"]; // 2 NSMutableURLRequest * req = [NSMutableURLRequest requestWithURL:url2 cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f]; // 3 NSString * string = @"<contact><id>3007</id><name>Song</name></contact>"; NSData * postData = [string dataUsingEncoding:4 allowLossyConversion:YES]; NSString * len = [NSString stringWithFormat:@"%d",postData.length]; // 设置请求方式 [req setHTTPBody:postData]; [req setHTTPMethod:@"POST"]; [req setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; [req setValue:len forHTTPHeaderField:@"Content-Length"]; // 4 NSError * err; NSURLResponse * resp; NSData *urlData = [NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:&err]; // 5 NSString * responseStr = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; NSLog(@"request method = %@",[req HTTPMethod]); NSLog(@"len = %@",len); NSLog(@"responseStr = %@",responseStr);
异步
AppDelegate.h
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate,NSURLConnectionDataDelegate> { NSMutableData *_mData; } @property (strong, nonatomic) UIWindow *window; @end
AppDelegate.m
GET异步
NSString *str = @"http://192.168.1.5:8080/Jersey/rest/contacts"; //1 NSURL *url = [NSURL URLWithString:str]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f]; // [NSURLConnection connectionWithRequest:request delegate:self];
POST异步
NSString *str = @"http://192.168.1.5:8080/Jersey/rest/contacts/addContact"; NSURL *url = [NSURL URLWithString:str]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0f]; // NSString *string = @"<contact><id>3007</id><name>Song</name></contact>"; NSData *postData = [string dataUsingEncoding:4 allowLossyConversion:YES];//api上说没法识别时,是否支持转换为同一编码,也就是否允许失真 NSString *len = [NSString stringWithFormat:@"%d",postData.length];//内容的字节长度 [request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; [request setHTTPMethod:@"POST"]; [NSURLConnection connectionWithRequest:request delegate:self];//?该返回值有什么用,为什么不用[NSURLConnection sendAsynchronousRequest:]; NSLog(@"request method = %@",[request HTTPMethod]); NSLog(@"len = %@",len);
重写代理方法,系统自动调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"%s",__func__);//服务器响应就会执行这个方法 _mData = [[NSMutableData alloc]init]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"%s",__func__);//当开始接受到数据的时候,数据量大的时候执行多次 [_mData appendData:data];//将多个数据添加到可变data中 //算进度 } -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"%s",__func__);//数据接受完后 NSString *str = [[NSString alloc]initWithData:_mData encoding:4]; NSLog(@"str = %@",str); } -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"%s",__func__);//连接接受失败 }
//文件读写 //写文件 NSString *path1 = @"/Users/yf02/Desktop/Oc_12/123.txt"; NSString *content = @"i am a ios developer"; NSError *error = nil; BOOL s = [content writeToFile:path1//写到的位置,默认覆盖,没追加 atomically:YES//Yes 先写到缓存,再从缓存写入文件 encoding:NSUTF8StringEncoding error:&error];//指针的指针,有2个返回值 if (!s) { NSLog(@"error:%@",[error localizedFailureReason]); exit(-1); } //读文件(url可以是网络路径[NSURL URLWithString:],也可以本地路径) NSURL *url = [NSURL fileURLWithPath:path1]; NSString *u = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; NSLog(@"%@",u); //NSData主要存二进制数据(系统常用二进制文件) NSData *data = [NSData dataWithContentsOfFile:path1]; NSLog(@"%@",data); NSString *dataCoutent = [[NSString alloc]initWithData:data encoding:4]; NSLog(@"%@",dataCoutent); //写 [data writeToFile:path1 atomically:YES];//不用编码,比字符串更安全更快速 //NSFileManger对目录操作(单例) NSFileManager *fm = [NSFileManager defaultManager]; [fm createDirectoryAtPath:@"/Users/yf02/Desktop/Oc_12/abc/123" withIntermediateDirectories:YES//中间目录 attributes:nil//nil默认为可以读可写 error:nil]; [fm createFileAtPath:@"/Users/yf02/Desktop/Oc_12/abc/123/helloworld.txt" contents:data attributes:nil]; [fm moveItemAtPath:@"/Users/yf02/Desktop/Oc_12/abc/123/helloworld.txt" toPath:@"/Users/yf02/Desktop/Oc_12/abc/helloworld.txt" error:nil]; //包(单例) NSBundle *mainBundle = [NSBundle mainBundle]; NSString *mainBundlePath = [mainBundle pathForResource:@"helloworld" ofType:@"txt"];//要先关联好文件 NSLog(@"mainBundlePath:%@",mainBundlePath); NSString *BundleContent= [NSString stringWithContentsOfFile:mainBundlePath encoding:4 error:nil]; NSLog(@"BundleContent = %@",BundleContent); //NSBundle不能写入内容 NSString *string1 = @"abc"; BOOL return1 = [string1 writeToFile:mainBundlePath atomically:YES encoding:4 error:nil]; NSLog(@"return1 = %d",return1);