使用NSURLConnect发送GET请求有以下三种方式:
1. 同步方式: 阻塞的,开发中一般不适用这种方式(会阻塞线程)
2. 异步方式
3. 代理方式(属于异步方式): 当从网络中下载大文件的时候,使用代理方式
注意: 发送GET请求步骤
01 设置请求路径
02 创建请求对象(默认是GET请求,且已经默认包含了请求头)
03 使用NSURLSession sendsync方法发送网络请求
04 接收到服务器的响应后,解析响应体
当创建请求对象时,应该设置 请求头,请求体. 因为发送的是GET请求,使用NSURLRequest这个类来创建请求对象,发送GET请求,默认就包含了请求头,GET请求不包括请求体.
如果发送的是POST请求, 使用NSMutableURLRequest 类来创建请求对象,并且需要设置请求头,和请求体,请求方法等.
//
// ViewController.m
// 01掌握-NSURLConnection发送GET请求
//
// Created by 朝阳 on 2017/12/2.
// Copyright © 2017年 sunny. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<NSURLConnectionDataDelegate>
/** 从服务器中接收到的数据 */
@property (nonatomic ,strong) NSMutableData *resultData;
@end
@implementation ViewController
/*
使用NSURLConnect发送GET请求的几种方式:
1. 同步方式: 阻塞的,一般开发中不适用这种方式
2. 异步方式
3. 代理方式(属于异步): 当从网络中下载大文件的时候,使用代理方式
*/
#pragma -mark lazy loading
- (NSMutableData *)resultData
{
if (!_resultData) {
_resultData = [[NSMutableData alloc] init];
}
return _resultData;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//GET:http://120.25.226.186:32812/login?username=123&pwd=456&type=JSON
// 协议+主机地址+接口名称+?+参数1&参数2&参数3
//post:http://120.25.226.186:32812/login
// 协议+主机地址+接口名称
[self delegate];
}
// 使用同步的方式发送网络请求
- (void)sync
{
//1. 确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2. 创建请求对象(设置请求头,请求体)
// 因为是发送GET请求,因此没有请求体
// NSURLRequest对象中已经默认有 请求头了.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
//3. 使用NSURLConnection发送请求
// 创建响应头
NSHTTPURLResponse *response = nil;
/*
arg1: 请求对象
arg2: 响应头地址(用于服务器把响应头内容传到这个地址中)
arg3: 错误信息
返回值: 响应体
*/
// 同步的,会发生阻塞(开发中一般不适用sendSync...方法)
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//4. 解析data--->字符串
// 打印响应体
NSLog(@"响应体--->%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// 打印响应头(状态码)
NSLog(@"响应头--->%ld",response.statusCode);
}
// 使用异步的方式来发送请求:有两种方式: 1.下面这种 2. 设置代理
- (void)async
{
//1. 确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2. 创建请求对象(设置请求头,请求体)
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
//3. 创建网络连接-使用NSURLConnection发送请求
// 异步请求
/*
param1: 请求对象
param2: 队列:决定哪个任务在哪个线程中执行(这里是指completionHandler代码块 在哪个线程中执行)
param3: completionHandler代码块: 当请求完成(成功|失败)的时候回调
response: 响应头
data:响应体
connectionError:错误信息
*/
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4. 解析响应体
NSLog(@"响应体--->%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSHTTPURLResponse *res= (NSHTTPURLResponse *)response;
NSLog(@"%ld",res.statusCode);
NSLog(@"%@",[NSThread currentThread]);
}];
}
// 通过设置代理来异步发送网络请求
- (void)delegate
{
//1. 确定网络请求的路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2. 创建请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
//3. 设置代理,发送请求
//3.1
// [NSURLConnection connectionWithRequest:request delegate:self];
//3.2
// [[NSURLConnection alloc] initWithRequest:request delegate:self];
//3.3
// startImmediately: YES: 设置代理并发送网络请求
// startImmediately: NO: 设置代理不发送请求
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
// 如果设置为NO,需要调用start方法来,开启网络请求
[connection start];
// 取消网络请求
// [connection cancel];
}
#pragma -mark NSURLConnectDataDelegate
// 当接收到服务器响应的时候调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%s",__func__);
}
// 当接收到服务器返回数据的时候调用-并调用多次(数据是一点点返回的)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
//拼接数据
[self.resultData appendData:data];
}
// 当发送请求失败的时候调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
}
// 当发送请求完成后调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"发送请求完成!");
// 打印响应体
NSLog(@"响应体--->%@",[[NSString alloc] initWithData:self.resultData encoding:NSUTF8StringEncoding]);
}
@end