一、GET请求方式:
/*
get请求网络api
*/
- (void)doGet{
//url
NSString *urlStr = [NSString stringWithFormat:@"https://m.baidu.com/s?word=%@", @"phone"];
//对URL字符串进行转义,处理空格中文等情况
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//还原转义的url字符串
//urlStr = [urlStr stringByRemovingPercentEncoding];
NSLog(@"url: %@", urlStr);
//1.创建url
NSURL *url = [NSURL URLWithString:urlStr];
//2.创建request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.执行异步请求,NSOperationQueue alloc]表示多线程,在子线程中请求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//请求失败时返回
if(connectionError != nil){
NSLog(@"请求失败");
return;
}
//4.将网络返回的data转为String字符串
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//5.解析返回的字符串
NSLog(@"result: %@", json);
//6.用主线程更新界面
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//此处在主线程,可以设置界面数据
}];
}];
}
二、POST请求方式(请求body可以为key=value或json):
/*
post请求网络api(请求body为:key=value方式、json方式)
*/
- (void)doPost{
//url
NSString *urlStr = [NSString stringWithFormat:@"https://m.baidu.com/"];
NSLog(@"url: %@", urlStr);
//1.创建url
NSURL *url = [NSURL URLWithString:urlStr];
//2.创建request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//请求方式设为POST,默认为GET
request.HTTPMethod = @"POST";
//3.添加请求数据
//(1)key=value方式(key1=value1&key2=value2):
// NSString *bodyStr = [NSString stringWithFormat:@"word=%@", @"phone"]; //生成key=value的String字符串
// request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; //将NSString字符串转为NSData并赋值
//(2)json方式:
NSString *bodyJson = @"{word: phone}"; //json的NSString字符串
request.HTTPBody = [bodyJson dataUsingEncoding:NSUTF8StringEncoding]; //将NSString字符串转为NSData并赋值
//4.执行异步请求,NSOperationQueue alloc]表示多线程,在子线程中请求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//请求失败时返回
if(connectionError != nil){
NSLog(@"请求失败");
return;
}
//4.将网络返回的data转为String字符串
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//5.解析返回的json
NSLog(@"result: %@", json);
//6.用主线程更新界面
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//此处在主线程,可以设置界面数据
}];
}];
}
三、请求获取服务器返回流(下载文件可使用这种方式):
1.定义用于接收服务器返回流的NSMutableData变量,并实现NSURLConnectionDataDelegate:
@interface ViewController () <NSURLConnectionDataDelegate>
//服务器接收的数据
@property (nonatomic, strong) NSMutableData *data;
@end
2.执行请求,并监听接收的几个方法:
/*
请求网络获取流数据,如文件下载
*/
- (void)doGetStream{
//url
// NSString *urlStr = @"http://dldir1.qq.com/qqfile/QQforMac/QQ_V6.5.2.dmg";
NSString *urlStr = @"https://m.baidu.com/";
NSLog(@"url: %@", urlStr);
//1.创建url
NSURL *url = [NSURL URLWithString:urlStr];
//2.创建request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.创建NSURLConnection
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//4.开始连接(子线程执行)
dispatch_async(dispatch_queue_create("stream", DISPATCH_QUEUE_CONCURRENT), ^{
[conn start];
});
}
/*
收到服务端响应,准备工作
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
if(!self.data){
//为空时初始化
self.data = [NSMutableData data];
} else {
//首次设置为nil
[self.data setData:nil];
}
}
/*
接收流数据
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"didReceiveData: %@", [NSThread currentThread]);
[self.data appendData:data];
}
/*
接收完成
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//将网络返回的data转为String字符串
NSString *result = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", result);
}
/*
接收出错时触发
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"接收出错: %@", error.localizedDescription);
}