iOS学习笔记-146.网络06——NSURLConnection03_使用

网络06——NSURLConnection03_使用

一、请求的登陆接口分析

如果你没有搭建自己登陆接口的话,可以按照
iOS学习笔记-141.网络01——使用Tomcat和JavaWeb来搭建自己的网络接口
搭建

请求的方法、参数、地址等可以查看我们的

iOS学习笔记-143.网络03——自己搭建的后台登陆接口文档

通过我们的接口文档,我们知道

请求的地址是 http://127.0.0.1:8080/qwmapi/login

请求头需要传递的信息是

字段类型必选说明
QWM-CLIENT-TYPEString客户端类型(1:安卓 2:iOS)

请求参数是

字段类型必选说明
userNameString用户名
passwordString密码(经过MD5加密一次的密文)

二、GET方法同步请求(使用NSURLRequest)

我们使用的 NSURLRequest,无法设置请求头,所以我们的这个方法应该是登陆不成功的

2.1 代码示例

//登陆请求地址
#define LOGINURL @"http://127.0.0.1:8080/qwmapi/login"

/*get同步方法测试*/
-(void)getSyncTest1{
    //1.设置请求路径
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLSession sendsync方法发送网络请求
    /*
       第一个参数:请求对象
       第二个参数:响应头信息,当该方法执行完毕之后,该参数被赋值
       第三个参数:错误信息,如果请求失败,则error有值
       */
    //该方法是阻塞式的,会卡住线程
    NSHTTPURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //4.接收到服务器的响应后,解析响应体
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);
}

2.2 响应结果

{
    "code": 700,
    "msg": "客户端类型不能为空"
}

三、GET方法同步请求(使用NSMutableURLRequest)

3.1 代码示例

//登陆请求地址
#define LOGINURL @"http://127.0.0.1:8080/qwmapi/login"

/*get同步方法测试*/
-(void)getSyncTest2{
    //1.设置请求路径
    NSString *path = [NSString stringWithFormat:@"%@?userName=qiwenming&password=%@",LOGINURL,[@"123456" MD5_32BitLower]];
    NSURL *url = [NSURL URLWithString:path];

    //2.创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.添加请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];

    //4.使用NSURLSession sendsync方法发送网络请求
     /*
        第一个参数:请求对象
        第二个参数:响应头信息,当该方法执行完毕之后,该参数被赋值
        第三个参数:错误信息,如果请求失败,则error有值
        */
    //该方法是阻塞式的,会卡住线程
    NSHTTPURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //5.接收到服务器的响应后,解析响应体
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);
}

3.2 响应结果

{
    "code": 200,
    "msg": "登录成功",
    "t": {
        "userName": "qiwenming",
        "clientType": "2"
    }
}


四、GET方法异步请求(使用NSMutableURLRequest)

4.1 代码示例

/*get异步请求*/
-(void)getAsyncTest{
    //1.设置请求路径
    NSString *path = [NSString stringWithFormat:@"%@?userName=qiwenming&password=%@",LOGINURL,[@"123456" MD5_32BitLower]];
    NSURL *url = [NSURL URLWithString:path];

    //2.创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];

    //4.使用NSURLSession sendsync方法发送网络请求
    /*
       第一个参数:请求对象
       第二个参数:队列 决定代码块completionHandler的调用线程
       第三个参数:completionHandler 当请求完成(成功|失败)的时候回调
       response:响应头
       data:响应体
       connectionError:错误信息
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //5.接收到服务器的响应后,解析响应体
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

}

4.2 响应结果

{
    "code": 200,
    "msg": "登录成功",
    "t": {
        "userName": "qiwenming",
        "clientType": "2"
    }
}


五、POST方法同步请求(使用NSMutableURLRequest)

5.1 代码示例

/*post同步方法测试*/
-(void)postSyncTest{
    //1.设置URL
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法,必须大写
    [request setHTTPMethod:@"POST"];
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求参数
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.通过NSURLConnection发从请求
    NSHTTPURLResponse *response = nil;
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //4.返回的数据
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}

5.2 响应结果

{
    "code": 200,
    "msg": "登录成功",
    "t": {
        "userName": "qiwenming",
        "clientType": "2"
    }
}


六、POST方法异步请求(使用NSMutableURLRequest)

6.1 代码示例

/*post异步方法测试*/
-(void)postAsyncTest{
    //1.设置请求地址
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法
    request.HTTPMethod = @"POST";
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求体
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.发送网络请请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //4.处理响应
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

}

6.2 响应结果

{
    "code": 200,
    "msg": "登录成功",
    "t": {
        "userName": "qiwenming",
        "clientType": "2"
    }
}


七、POST方法请求(使用NSMutableURLRequest),响应通过代理获取

7.1 代码示例

/*NSURLConnection 设置代理的请求方式*/
-(void)delegateRequest{
    //1.设置请求地址
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建创建对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置超时时间
    request.timeoutInterval = 10;
    //设置请求方法
    request.HTTPMethod = @"POST";
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求体
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.发送网络连接
    //创建的时候,发送请求需要检查startImmediately的值
    //(startImmediately == YES 会发送 | startImmediately == NO 则需要调用start方法)
    //[[NSURLConnection alloc]initWithRequest:request delegate:self];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

    //4.开始连接
    [connection start];

    //取消连接
    //[connection cancel];
}


//===============================代理方法=================================

/*1.开始接收到服务器的响应时调用*/
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"--接收到服务器响应啦--");
}

/*2.接收到服务器返回的数据时调用(服务器返回的数据比较大时会调用多次)*/
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"--接收到数据啦---");
    [self.resultData appendData:data];
}

/*3.服务器返回的数据完全接收完毕后调用*/
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"---数据接收完成啦--");
    NSLog(@"%@",[[NSString alloc]initWithData:self.resultData encoding:NSUTF8StringEncoding]);
}

/*4.请求出错时调用(比如请求超时)*/
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
     NSLog(@"---出错啦--");
}

7.2 响应结果

{
    "code": 200,
    "msg": "登录成功",
    "t": {
        "userName": "qiwenming",
        "clientType": "2"
    }
}

7.3 打印结果

[23650:122048] --接收到服务器响应啦--
[23650:122048] --接收到数据啦---
[23650:122048] ---数据接收完成啦--
[23650:122048] {"code":700,"msg":"客户端类型不能为空"}

八、全部代码

//
//  ViewController.m
//  001_NSURLConnection_get_post
//
//  Created by 杞文明 on 17/9/11.
//  Copyright © 2017年 杞文明. All rights reserved.
//

#import "ViewController.h"
#import "NSString+MD5.h"

//登陆请求地址
#define LOGINURL @"http://127.0.0.1:8080/qwmapi/login"
@interface ViewController ()<NSURLConnectionDataDelegate>
@property (nonatomic, strong) NSMutableData *resultData;
@end

@implementation ViewController

-(NSMutableData*)resultData{
    if (!_resultData) {
        _resultData = [NSMutableData data];
    }
    return _resultData;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    [self getSyncTest1];
//    [self getSyncTest2];
//    [self getAsyncTest];
//    [self postSyncTest];
    [self delegateRequest];
}

/*get同步方法测试*/
-(void)getSyncTest1{
    //1.设置请求路径
    NSString *path = [NSString stringWithFormat:@"%@?userName=qiwenming&password=%@",LOGINURL,[@"123456" MD5_32BitLower]];
    NSURL *url = [NSURL URLWithString:path];

    //2.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLSession sendsync方法发送网络请求
    /*
       第一个参数:请求对象
       第二个参数:响应头信息,当该方法执行完毕之后,该参数被赋值
       第三个参数:错误信息,如果请求失败,则error有值
       */
    //该方法是阻塞式的,会卡住线程
    NSHTTPURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //4.接收到服务器的响应后,解析响应体
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);
}

/*get同步方法测试*/
-(void)getSyncTest2{
    //1.设置请求路径
    NSString *path = [NSString stringWithFormat:@"%@?userName=qiwenming&password=%@",LOGINURL,[@"123456" MD5_32BitLower]];
    NSURL *url = [NSURL URLWithString:path];

    //2.创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.添加请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];

    //4.使用NSURLSession sendsync方法发送网络请求
     /*
        第一个参数:请求对象
        第二个参数:响应头信息,当该方法执行完毕之后,该参数被赋值
        第三个参数:错误信息,如果请求失败,则error有值
        */
    //该方法是阻塞式的,会卡住线程
    NSHTTPURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //5.接收到服务器的响应后,解析响应体
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);
}

/*get异步请求*/
-(void)getAsyncTest{
    //1.设置请求路径
    NSString *path = [NSString stringWithFormat:@"%@?userName=qiwenming&password=%@",LOGINURL,[@"123456" MD5_32BitLower]];
    NSURL *url = [NSURL URLWithString:path];

    //2.创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];

    //4.使用NSURLSession sendsync方法发送网络请求
    /*
       第一个参数:请求对象
       第二个参数:队列 决定代码块completionHandler的调用线程
       第三个参数:completionHandler 当请求完成(成功|失败)的时候回调
       response:响应头
       data:响应体
       connectionError:错误信息
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

    //5.接收到服务器的响应后,解析响应体
}

/*post同步方法测试*/
-(void)postSyncTest{
    //1.设置URL
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法,必须大写
    [request setHTTPMethod:@"POST"];
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求参数
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.通过NSURLConnection发从请求
    NSHTTPURLResponse *response = nil;
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //4.返回的数据
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}

/*post异步方法测试*/
-(void)postAsyncTest{
    //1.设置请求地址
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法
    request.HTTPMethod = @"POST";
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求体
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.发送网络请请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //4.处理响应
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

}

/*NSURLConnection 设置代理的请求方式*/
-(void)delegateRequest{
    //1.设置请求地址
    NSURL *url = [NSURL URLWithString:LOGINURL];

    //2.创建创建对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //设置超时时间
    request.timeoutInterval = 10;
    //设置请求方法
    request.HTTPMethod = @"POST";
    //设置请求头
    [request setValue:@"2" forHTTPHeaderField:@"QWM-CLIENT-TYPE"];
    //设置请求体
    NSString *params = [NSString stringWithFormat:@"userName=qiwenming&password=%@",[@"123456" MD5_32BitLower]];
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

    //3.发送网络连接
    //创建的时候,发送请求需要检查startImmediately的值
    //(startImmediately == YES 会发送 | startImmediately == NO 则需要调用start方法)
    //[[NSURLConnection alloc]initWithRequest:request delegate:self];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

    //4.开始连接
    [connection start];

    //取消连接
    //[connection cancel];
}

//===============================代理方法=================================

/*1.开始接收到服务器的响应时调用*/
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"--接收到服务器响应啦--");
}

/*2.接收到服务器返回的数据时调用(服务器返回的数据比较大时会调用多次)*/
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"--接收到数据啦---");
    [self.resultData appendData:data];
}

/*3.服务器返回的数据完全接收完毕后调用*/
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"---数据接收完成啦--");
    NSLog(@"%@",[[NSString alloc]initWithData:self.resultData encoding:NSUTF8StringEncoding]);
}

/*4.请求出错时调用(比如请求超时)*/
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
     NSLog(@"---出错啦--");
}

@end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值