IOS开发使用NSURLConnection、NSURLSession、AFN、ASI四种方式实现HTTP请求

概括:HTTP请求可以使用NSURLConnection、NSURLSession、AFN、ASI等方式实现,其中又包括了get、post两种请求方式和同步、异步两种程序执行方式。

NSURLConnection



1 get方式的同步请求


/**

*  get同步请求

*/

-(void) getSynch{

// 获取URL

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/login?username=123&password=123"];

// 获取request请求

NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 发送同步请求

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// 将data转换成string

NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"data -- %@", result);

}

2 get方式的异步请求


/**

*  get异步请求

*/

-(void) getAsynch{

// 获取URL

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video"];

// 获取request请求

NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 发送同步请求

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 将data数据转成字典

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

NSLog(@"data -- %@", dict);

}];

}

3 post同步请求


/**

*  post同步请求

*/

-(void) postSynch{

// 获取URL

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer"];

// 设置post请求需要使用NSMutableURLRequest

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求方式为post (必选)

request.HTTPMethod = @"POST";

// 发送同步请求

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// 将data转换成string

NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"data -- %@", result);

}

4 post异步请求


/**

*  post异步请求

*/

-(void) postAsynch{

// 获取URL

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/login"];

// 获取request请求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求方式为post

request.HTTPMethod = @"POST";

// 设置表单参数 (可选)

NSString *params = [NSString stringWithFormat:@"username=123&pwd=123"];

request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

// 设置超时(可选)

request.timeoutInterval = 5;

// 设置请求头信息(可选)

[request setValue:@"iPhone 6" forHTTPHeaderField:@"User-Agent"];

// 设置post请求需要使用NSMutableURLRequest

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 将data数据转成字典

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

NSLog(@"data -- %@", dict);

}];

}

NSURLSession



1 session的get请求


/**

*  session的get请求

*/

-(void) sessionGet{

// 获取一个session实例

NSURLSession *session = [NSURLSession sharedSession];

// 获取url

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video"];

// 创建一个数据访问任务

NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSLog(@"data -- %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

}];

// 启动任务,开始、回复都用resume

[task resume];

}

2 session的post请求


/**

*  session的post请求

*/

-(void) sessionPost{

// 获取一个session实例

NSURLSession *session = [NSURLSession sharedSession];

// 获取url

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/login"];

// 获取request请求对象

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求方式

request.HTTPMethod = @"POST";

// 设置请求体,

NSString *params = @"username=123&pwd=123";

request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

// 创建一个数据访问任务

NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSLog(@"data -- %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

}];

// 开始任务

[task resume];

}

AFNetwork框架,需要导入#import "AFNetworking.h"



1 AFN的get请求

#import "AFNetworking.h"


/**

*  afn的get请求

*/

-(void) afnGet{

// 创建一个请求操作管理者

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

// 声明响应结果不进行json、xml等格式解析,直接返回data

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

// 设置请求参数(可选)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"123";

params[@"pwd"] = @"123";

// 发送get请求

NSString *url = @"http://localhost:8070/MJServer/login";

[manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功在这里处理

// 将响应数据转换成字典

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];

NSLog(@"%@", dict);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 如果请求失败在这里处理

NSLog(@"request fail");

}];

}

2 AFN的post请求


/**

*  afn的post请求

*/

-(void) afnPost{

// 创建一个请求操作管理者

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

// 声明响应结果不进行json、xml等格式解析,直接返回data

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

// 设置请求参数(可选)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"123";

params[@"pwd"] = @"123";

// 发送get请求

NSString *url = @"http://localhost:8070/MJServer/login";

[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功在这里处理

// 将响应数据转换成字典

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];

NSLog(@"%@", dict);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 如果请求失败在这里处理

NSLog(@"request fail");

}];

}

ASI(注意添加libz类库并修改ASI源文件为非arc)



1 ASI的get同步请求

#import "ASIHTTPRequest.h"


/**

*  ASI的get同步请求

*/

-(void) asiGetSynch{

// 获取url

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video"];

// 获取asi请求对象

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// 发送同步请求

[request startSynchronous];

NSError *error = [request error];

if (error) {

NSLog(@"请求失败");

}else{

//        NSString *data = [request responseString];

NSData *data = [request responseData];

NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

NSLog(@"result -- %@", result);

}

}

2 ASI的get异步请求


/**

*  ASI的get异步请求

*  须知:ASI监听请求过程有delegate、block和selector三种方式,

*  经测试发现,delegate和block可以同时执行,selector和block也可以同时执行,但delegate和selector共存时(包括三者共存)不执行delegate

*  执行顺序:delegate > selector > block

*  通过responseData和responseString获取不到数据

*  使用了代理就不能直接通过responseData和responseString获取到数据

*/

-(void) asiGetAsynch{

// 获取url

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video"];

// 获取asi请求对象

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// 设置ASIHTTPRequestDelegate代理。

request.delegate = self;

// 发送异步请求

[request startAsynchronous];

// 设置监听请求过程的block

[request setStartedBlock:^{

NSLog(@"block请求开始");

}];

[request setDataReceivedBlock:^(NSData *data) {

NSLog(@"block获得请求数据 -- %@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]);

}];

[request setCompletionBlock:^{

NSLog(@"block请求结束");

}];

// 设置监听请求过程的selector

[request setDidStartSelector:@selector(start:)];

[request setDidReceiveDataSelector:@selector(receiveData:)];

[request setDidFinishSelector:@selector(finish:)];

}

#pragma mark selector监听方法

-(void)start:(ASIHTTPRequest *)request{

NSLog(@"selector请求开始");

}

-(void) receiveData:(ASIHTTPRequest *) request{

// 这里获取不到数据

NSLog(@"selector获得请求数据 -- %@", [request responseString]);

}

-(void)finish:(ASIHTTPRequest *)request{

NSLog(@"selector请求结束");

}

#pragma mark 实现ASIHTTPRequestDelegate的代理方法

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{

NSLog(@"delegate获得请求数据 -- %@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]);

}

- (void)requestStarted:(ASIHTTPRequest *)request{

NSLog(@"delegate请求开始");

}

- (void)requestFinished:(ASIHTTPRequest *)request{

NSLog(@"delegate请求结束");

}

- (void)requestFailed:(ASIHTTPRequest *)request{

NSLog(@"delegate请求失败");

}

3 ASI的post异步请求

#import "ASIFormDataRequest.h"


/**

*  ASI的post异步请求

*/

-(void) asiPostAsynch{

// 获取url

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/login"];

// 获取ASI表单请求对象

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// 设置请求参数

[request setPostValue:@"123" forKey:@"username"];

[request setPostValue:@"123" forKey:@"pwd"];

// 使用了代理就不能直接通过responseData和responseString获取数据

//    request.delegate = self;

// 发送异步请求

[request startAsynchronous];

// 设置监听(这里只演示block方法)

__weak ASIFormDataRequest *req = request;

[request setCompletionBlock:^{

NSLog(@"selector获得请求数据 -- %@", [req responseString]);

}];

}

时间: 2024-11-04 09:43:05

IOS开发使用NSURLConnection、NSURLSession、AFN、ASI四种方式实现HTTP请求的相关文章

iOS开发——实用OC篇&定时器的几种方式

定时器的几种方式 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资料,大概有三种方法:NSTimer.CADisplayLink.GCD.接下来我就一一介绍它们的用法. 一.NSTimer 1. 创建方法 1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:s

【iOS开发系列】延时执行的几种方式

/* 本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. */ - (void)delayMethod { NSLog(@"execute"); } /** * [1].performSelector方法 */ [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f]; // 此方式要求必须在主线程中执行,否则无效. // 是一种非阻塞的执行方式, // 暂时未

python全栈开发【补充】单例模式的四种方式

一.什么是单例模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 二.优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量.静态变量(方法) 试问?为什么用单例模式,不用全局变量呢? 答.全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 三.使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接.Socket创建链接 四.单例模式的四种实现方式 # 1.模块导入的形式 s1.py class F

【iOS开发-73】创建控制器的3种方式、深入了解view的创建和加载顺序

(1)创建控制器的3种方式 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; [self.window makeKeyAndVisible]; //关于主窗口 //在iOS6之前,

【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

(1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器可以自定义不同的状态栏如下: -(BOOL)prefersStatusBarHidden{ } -(UIStatusBarStyle)preferredStatusBarStyle{ } --如果我们需要交给UIApplication对象管理(iOS6之前就是),则需要如下设置: 先在info.plist中把默认的设置修改掉: 然后直接用如下代码即可: - (void)view

【iOS开发-图层】自定义图层的两种方式

想要自定义图层,只需要构建一个类继承CALayer方法 如果让自定义图层初始化上面就有画好的图形,有两种办法 重写drawInContext方法 自定义的图层下面的方法,然后必须自定义的图层对象显示调用 [layer setNeedsDisplay]然后才会调用这个方法; 自定图层文件 - (void)drawInContext:(CGContextRef)ctx { CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);//设置红色 CGContextAddEll

学习IOS开发UI篇--UI知识点总结(四) UITabelView/UITableViewCell

UITabelView:常用属性 @property (nonatomic)          CGFloat    rowHeight;             // will return the default value if unset @property (nonatomic)          CGFloat     sectionHeaderHeight;   // will return the default value if unset @property (nonatom

iOS开发网络篇—简单介绍ASI框架的使用

iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高.可惜作者早已停止更新,有一些潜在的BUG无人去解决 ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考 http://www.cnblogs.com/dot

iOS开发中常用的轮子 第四篇 收集齐7个轮子,准备高仿部分微博APP页面

产品原因有几张页面会参考微博APP来做,先收集齐轮子:计划这周完成,然后放到github上开源. 1,微博流刷新: 2,浏览微博中的图片: 3,发布微博: 4,发微博时选择照片: ============分割线:具体如下 ============= 选择相册中图片: 1,UzysAssetsPickerController 链接:https://github.com/uzysjung/UzysAssetsPickerController 介绍:用于替换UIImagePickerControlle