网络编程
GET请求方式
同步请求
会造成程序的卡顿(只有当请求完成才会恢复对界面的操作,用户的体验太差)
宏定义网址
#define kSearchURL @"http://api.map.baidu.com/place/v2/search?query=麦当劳®ion=上海&output=json&ak=6E823f587c95f0148c19993539b99295"
把字符串的网址 转换成网址对象
注意:如果网址中有中文,需要转化格式// 注意:如果网址中有中文,需要转化格式 NSString *newStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 把字符串的网址 转换成网址对象 NSURL *url = [NSURL URLWithString:newStr];
创建一个请求
timeoutInterval请求超时的时间 秒为单位NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
设置一个请求的标示(这步很重要)
[URLRequest setHTTPMethod:@"get"];
利用请求创建一个链接
NSURLResponse *response = nil; // 建立同步链接,并得到返回的数据(data) NSData *data = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&response error:nil];
JSON解析数据
注意数据类型,数组还是字典
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
异步请求
代理方法 异步请求
获取网址对象(有中文要转码)
NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
利用网址 创建网址对象
NSURL *url = [NSURL URLWithString:urlStr];
利用网址对象创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
标识请求类型
[request setHTTPMethod:@"Get"];
利用请求创建一个异步链接
定义属性 @property (nonatomic, retain) NSURLConnection *conn;self.conn = [NSURLConnection connectionWithRequest:request delegate:self];
开始链接
[self.conn start];
遵守协议
<NSURLConnectionDataDelegate, NSURLConnectionDelegate>
链接成功时,创建data
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"已经接收到服务器的响应信息,链接成功"); NSLog(@"%@", response); // 链接成功时,创建data self.receiveData = [NSMutableData data]; }
多次触发didReceiveData方法 才能接收到 完整的data,所以需要拼接一下data
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.receiveData appendData:data]; NSLog(@"接收到数据触发的方法"); }
完成数据加载,解析数据
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"%@", self.receiveData); NSLog(@"已经完成数据加载 触发的方法"); // 解析数据 NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil]; // 如果在tableView上展示的话 // 注意:要刷新界面 }
请求失败触发的方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"请求失败时触发 %@", error); }
block 异步请求
获取网址对象(有中文要转码)
NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
利用网址 创建网址对象
NSURL *url = [NSURL URLWithString:urlStr];
利用网址对象创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
标识请求类型
[request setHTTPMethod:@"Get"];
回到主线程
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 可以对data进行JSON解析 // 当数据请求完成的时候 会指定这个block NSLog(@"%@", data); // 判断是否在主线程 NSLog(@"%d", [NSThread isMainThread]); }];
POST请求方式
POST同步
利用网址 创建网址对象
NSURL *url = [NSURL URLWithString:kSearchURL];
利用网址对象创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
标识请求类型
[request setHTTPMethod:@"POST"];
把字符串转化成data使用UTF- 8的编码格式(携带的请求体)
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
Post请求 携带一个请求体
[request setHTTPBody:data];
创建同步链接
NSData *newData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
解析数据
NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:newData options:(NSJSONReadingMutableContainers) error:nil];
POST异步
代理方法 异步请求
获取网址对象
定义宏 #define kNewsListURL 网址
NSURL *url = [NSURL URLWithString:kNewsListURL];
利用网址对象创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
设置请求标示符
[request setHTTPMethod:@"Post"];
给请求添加请求体
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data];
利用请求创建一个链接(异步代理方法)
self.conn = [NSURLConnection connectionWithRequest:request delegate:self]; [self.conn start];
代理方法
参考Get代理方法的异步请求
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { self.receiveData = [NSMutableData data]; NSLog(@"%@", response); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.receiveData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"请求失败时触发 %@", error); }
block 异步请求
获取网址对象
定义宏 #define kNewsListURL 网址
NSURL *url = [NSURL URLWithString:kNewsListURL];
利用网址对象创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
设置请求标示符
[request setHTTPMethod:@"Post"];
给请求添加请求体
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data];
回到主线程
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 可以对data进行JSON解析 // 当数据请求完成的时候 会指定这个block NSLog(@"%@", data); // 判断是否在主线程 NSLog(@"%d", [NSThread isMainThread]); }];
GET请求方式 和POST请求方法对比
相同点:都能给服务器传输数据。
不同点:
给服务器传输数据的⽅式:
GET:通过⺴址字符串。
POST:通过data传输数据的⼤⼩:
GET:⺴址字符串最多255字节。
POST:使⽤NSData,容量超过1G安全性:
GET:所有传输给服务器的数据,显⽰在⺴址⾥,类似于密码的明⽂输⼊,直接可⻅。
POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输⼊,⽆法直接读取。
服务器端PHP简单接⼝
PHP中使⽤不同的函数获取数据,⽀持不同的请求⽅式:
- GET请求:使⽤ $_GET[“key”] 获取数据⺴址中的数据
- POST请求:使⽤ $_POST[“key”] 获取上传data中的数据
- GET、POST请求:使⽤ $_REQUEST[“key”] 获取数据