使用NSURLConnection的网络请求与封装

访问网络的方式:

1、同步请求: 会阻塞主线程

2、异步请求: 无法取消 请求过程在多线程执行

基本流程:

1、构造NSURL实例。

2、生成NSURLRequest请求。

3、通过NSURLConnection发送请求。

4、通过NSURLRespond实例和NSError实例分析结果。

5、接受返回数据。

使用NSURLConnection发起异步请求:

第一种方法:

- (void)setUrl:(NSURL *)url

{

//使用同异步请求网络

NSMutableURLRequest *request = [[NSMutableURLRequest
alloc]init];

[request
setHTTPMethod:@"GET"];
//设置请求方式

[request
setURL:url];          
//设置网络请求的url

[request setTimeoutInterval:60];//设置超出时间

//get请求不需要设置请求体

self.data = [NSMutableData
data];

[NSURLConnection
connectionWithRequest:request delegate:self];

}

//此种方法可以通过协议方法来监听数据加载的过程

几种常用的协议方法:

#pragma mark -

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData
*)data

{

[self.data
appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

UIImage *image = [UIImage
imageWithData:self.data];

self.image = image;

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError
*)error

{

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

}

第二种方法:

- (void)setImageWithURL:(NSURL *)url

{

#if 0

//使用同步请求网络

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];

[request setHTTPMethod:@"GET"];

[request setURL:url];

[request setTimeoutInterval:60];

//get请求不需要设置请求体

NSURLResponse *response;

//发送同步请求

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

UIImage *image = [UIImage imageWithData:data];

self.image = image;

#endif

#if 1

//使用异步请求网络

NSMutableURLRequest *request = [[NSMutableURLRequest
alloc]init];

[request
setHTTPMethod:@"GET"];

[request
setURL:url];

[request setTimeoutInterval:60];

//get请求不需要设置请求体

//    NSURLResponse *response;

//发送异步请求

NSOperationQueue *queue = [[NSOperationQueue
alloc]init];

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

{

UIImage *image = [UIImage
imageWithData:data];

dispatch_async(dispatch_get_main_queue(), ^{

self.image = image;  //主线程加载数据

});

}];

#endif

}

下面简单写一个NSURLConnection的封装代码

首先写封装 NSMutableURLRequest
的代码 得继承它

#import <Foundation/Foundation.h>

typedef
void(^FinshLoadBlock) (NSData *);

@interface PXRequest :
NSMutableURLRequest <NSURLConnectionDataDelegate>

@property (nonatomic,strong)NSMutableData *data;        
//加载的数据

@property (nonatomic,strong)NSURLConnection *connection;
//连接对象

@property (nonatomic,strong)FinshLoadBlock block;       
//定义一个block
数据加载完后调用

- (void)startAsynrc;
//开始请求

- (void)cancel;     
//取消请求

@end

#import "PXRequest.h"

@implementation PXRequest

//开始异步请求

- (void)startAsynrc

{

self.data = [NSMutableData
data];

self.connection = [NSURLConnection
connectionWithRequest:self
delegate:self];

}

- (void)cancel

{

[self.connection
cancel];

}

#pragma  mark -

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData
*)data

{

[self.data
appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

self.block(_data);

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError
*)error

{

NSLog(@"出错信息 = %@",error);

}

@end

下面封装一段数据代码:

比如我要通过网络去访问一段天气接口

#import <Foundation/Foundation.h>

typedef void(^Completion)(id result);
//返回void
参数id 名字Completion

@interface PXDataService :
NSObject

//访问天气接口数据

+ (void)getWetheaData:(NSDictionary *)params block:(Completion)block;

@end

#import "PXDataService.h"

#import "PXRequest.h"

#define BASE_URL @"http://www.weather.com.cn/data/sk/"

@implementation PXDataService

//定义获取天气的接口

+ (void)getWetheaData:(NSDictionary *)params block:(Completion)block

{

NSString *cityCode = [params
objectForKey:@"code"];

NSString *urlstring = [BASE_URL
stringByAppendingFormat:@"%@.html",cityCode];

[self
startRequest:params
url:urlstring block:block
isGet:NO];

}

+ (void)startRequest:(NSDictionary *)param

url:(NSString *)urlString

block:(Completion)block

isGet:(BOOL)get

{

PXRequest *request = [PXRequest
requestWithURL:[NSURL
URLWithString:urlString]];

if(get)

[request
setHTTPMethod:@"GET"];

else

[request
setTimeoutInterval:60];

//如果是post请求则需要有请求体
一般格式是 username=zpx&password=1234

//    [request setHTTPBody:<#(NSData *)#>]

[request
startAsynrc];  //开始请求网络

//当request的block执行时
会执行这里面的代码 block封装一段代码

request.block = ^(NSData *data){

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

NSLog(@"data = %@",datastring);

id ret =  [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingMutableContainers
error:nil];

//json解析

block(ret);

};

}

@end

主函数代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions

{

self.window = [[UIWindow
alloc] initWithFrame:[[UIScreen
mainScreen] bounds]];

// Override point for customization after application launch.

self.window.backgroundColor = [UIColor
whiteColor];

[self.window
makeKeyAndVisible];

UIButton *button = [UIButton
buttonWithType:UIButtonTypeContactAdd];

button.frame =
CGRectMake(10,
50, 20,
20);

[button addTarget:self
action:@selector(load)
forControlEvents:UIControlEventTouchUpInside];

[self.window
addSubview:button];

return
YES;

}

- (void)load

{

NSDictionary *params =
@{@"code":@"101010300"};

[PXDataService
getWetheaData:params
block:^(id result) {

NSLog(@"result = %@",result);  //打印加载完的数据

}];

}

点击按钮打印:

2014-07-08 23:08:20.862 WXDataServer[11527:60b] result = {

    weatherinfo =     {

        Radar = "JC_RADAR_AZ9010_JB";

        SD = "70%";

        WD = "\U5317\U98ce";

        WS = "0\U7ea7";

        WSE = 0;

        city = "\U671d\U9633";

        cityid = 101010300;

        isRadar = 1;

        temp = 24;

        time = "22:55";

    };

}

使用NSURLConnection的网络请求与封装

时间: 2024-10-19 15:39:34

使用NSURLConnection的网络请求与封装的相关文章

网络请求的封装

网络封装的原因: 开发者为了开发方便,出现了大量的第三方的网络请求,我们除了在cocoapods中引入第三方的开源,同时还应该注意的一点是:如果第三方的网络请求不更新了(比如ASI),或者网络请求工具类在新版本出现了bug导致暂时无法使用,我们工程中存在大量的网络请求,可能会导致我们工程无法运行,甚至导致工程需要重新走通,为了这种解决这种突发状况的产生,我们需要在网络请求之前,进行简单的封装: 这里我们以AFNetworking为例 HttpTool.h中: #import <Foundatio

关于ajax网络请求的封装

// 封装的ajax网络请求函数// obj 是一个对象function AJAX(obj){ //跨域请求        if (obj.dataType == "jsonp") {            //在这里 callback 必须是全局变量 保证函数消失的时候 这个变量不可以被销毁 //处理一下函数名(防止多个网络请求 函数名字相同 出现紊乱的情况)            var hehe = "callBack" + "_" + n

【iOS】网络请求框架封装

在使用网络请求的过程中,可以使用系统的框架.ASI.AF.MK等等,但是如果需要更换项目的网络请求框架(比如,项目之前用的ASI的框架,现在需要更换为AF),那么这将是一个浩大的工程.项目初期,怎么搭建网络请求框架,才可以让修改网络请求的工程量减到最小呢,这是我们今天要说的问题. 环境信息: Mac OS X 10.10.1 Xcode 6.1.1 iOS 8.1 正文 封装的网络请求框架一共三层: 第三层:ASI.AF或者其他网络请求方式.第二层:第二层分有基类与类目(Category)构成,

AFNetworking 2.5.x 网络请求的封装

源码地址 https://github.com/YouXianMing/Networking 说明 1. 将block形式的请求转换成用代理来处理 2. 你可以通过继承父类,改写父类的某些方法来达到转换请求字典(加密或者其他事宜等),转换获取结果的目的(加密或者其他事宜等) 3. 支持下载进度 常规请求源码 // // Networking.h // NetworkingCraft // // Created by YouXianMing on 15/6/11. // Copyright (c)

IOS开发之—— 在AFN基础上进行的网络请求的封装

网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求成功:解析数据,刷新页面 4请求失败做处理 VPKCResponse.h VPKCResponse.m VPKCRequestManager.h VPKCRequestManager.m 定义两个文件继承NSObject. VPKCResponse.h #import <Foundation/Fou

NSURLConnection发送网络请求

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //    [self getYahooData];//同步请求,会阻塞主线程 //    [self getYahooData_GCD];//使用GCD把同步请求放在子线程中,也不会阻塞主线程 [self getYahooData_Async];//直接使用异步请求,不会阻塞主线程+ } -(void)getYahooData_Async

异步网络请求的封装

1 public class MainActivity extends Activity { 2 private String PATH = "https://www.baidu.com/"; 3 private TextView mTv; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.

IOS中的网络请求

使用NSURLConnection的网络请求,最好定义一个类方法,在主线程中直接调用类方法获取请求到的网络数据 //构建类方法--请求网络 + (void)requestData:(NSString *)urlStr httpMethod:(NSString *)method params:(NSMutableDictionary *)params comletionHandle:(void (^)(id result))block { //1.构建URL urlStr = [BASE_URL

http请求的封装与过滤

最近做的净水器项目,前台需要对发送的请求进行统一的封装,后台需要对请求进行统一的验证.本文记录了前台进行的http请求的封装及后台进行的http请求的过滤.前台:小程序,后台:SpringMvc. 小程序对http请求进行封装 在微信小程序wx.request官网 中的http请求是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 wx.request({ url: 'test.php', data: { x: '' , y: '' }, header: { 'content