网络06——NSURLConnection03_使用
一、请求的登陆接口分析
如果你没有搭建自己登陆接口的话,可以按照
iOS学习笔记-141.网络01——使用Tomcat和JavaWeb来搭建自己的网络接口
搭建
请求的方法、参数、地址等可以查看我们的
iOS学习笔记-143.网络03——自己搭建的后台登陆接口文档
通过我们的接口文档,我们知道
请求的地址是 http://127.0.0.1:8080/qwmapi/login
请求头需要传递的信息是
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
QWM-CLIENT-TYPE | String | 是 | 客户端类型(1:安卓 2:iOS) |
请求参数是
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
userName | String | 是 | 用户名 |
password | String | 是 | 密码(经过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