iOS开发网络篇 一一 NSURLConnection发送GET请求

使用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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值