网络请求ASIFormDataRequest(上传下载)

使用第三方网络请求类型

ASIFormDataRequest进行网络请求,包括上传,下载。使用代码块模式,用户可自定义请求模式,即GET,或POST。同时可根据请求参数中是否包含文件,而进行文件的上传处理。


.h文件

#import <Foundation/Foundation.h>

#import "ASIFormDataRequest.h"

#import "JSON.h"


/****************************************************************/


// 文件信息

@interface FileModal : NSObject


@property (nonatomic, strong) NSString *fileName; // 文件名称

@property (nonatomic, strong) NSString *filePath; // 文件路径


@end


/****************************************************************/


static NSString *const requestType_get = @"GET";

static NSString *const requestType_post = @"POST";


@interface NetRequestBlockManager : NSObject


/// 单例

+ (NetRequestBlockManager *)shareRequest;


/// 发送请求(开始,成功,失败)

- (ASIFormDataRequest *)sendRequest:(NSString *)urlString

                          parameter:(NSDictionary *)parameter

                           didStart:(void (^)(void))startBlock

                        didFinished:(void (^)(id obj))finishedBlock

                          didFailed:(void (^)(NSError *error))failedBlock

                            finally:(void (^)(void))finallyBlock;

/// 发送请求,自定义请求方式

- (ASIFormDataRequest *)sendRequest:(NSString *)urlString

                          parameter:(NSDictionary *)parameter

                        requestType:(NSString *)type

                           didStart:(void (^)(void))startBlock

                        didFinished:(void (^)(id obj))finishedBlock

                          didFailed:(void (^)(NSError *error))failedBlock

                            finally:(void (^)(void))finallyBlock;

@end




.m文件


#import "NetRequestBlockManager.h"


static NetRequestBlockManager *staticRequestManager;


/****************************************************************/


// 文件信息

@implementation FileModal


@synthesize fileName;

@synthesize filePath;


@end


/****************************************************************/


@implementation NetRequestBlockManager


- (id)init

{

    self = [super init];

    if (self)

    {

    

    }

    

    return self;

}



+ (NetRequestBlockManager *)shareRequest

{

    if (staticRequestManager == nil)

    {

        staticRequestManager = [[NetRequestBlockManager alloc] init];

    }

    

    return staticRequestManager;

}


/// 发送请求

- (ASIFormDataRequest *)sendRequest:(NSString *)urlString

                          parameter:(NSDictionary *)parameter

                           didStart:(void (^)(void))startBlock

                        didFinished:(void (^)(id obj))finishedBlock

                          didFailed:(void (^)(NSError *error))failedBlock

                            finally:(void (^)(void))finallyBlock

{

    // 创建请求 __block 在非ARC下时使用,而ARC下则用__weak

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

    

    // 设置请求模式,根据有无参数情况

    NSString *requestMethod = (!parameter ? requestType_get : requestType_post);

    request.requestMethod = requestMethod;

    // 设置请求超时

    request.timeOutSeconds = 30.0;

    

    // 参数设置

    for (NSString *key in parameter.allKeys)

    {

        id valueObj = [parameter objectForKey:key];

        if ([valueObj isKindOfClass:[FileModal class]])

        {

            // 上传文件

            FileModal *fileModal = (FileModal *)valueObj;

            NSString *filePath = fileModal.filePath;

            NSString *fileName = [filePath substringFromIndex:[filePath rangeOfString:@"/" options:NSBackwardsSearch].location + 1];

            [request setFile:filePath withFileName:fileName andContentType:@"multipart/form-data" forKey:key];

        }

        else

        {

            [request setPostValue:valueObj forKey:key];

        }

    }

    

    __weak ASIFormDataRequest *weakRequest = request;

    

    // 设置请求开始时

    [request setStartedBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (startBlock)

        {

            startBlock();

        }

#endif

    }];

    

    // 设置请求成功时

    [request setCompletionBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (finishedBlock)

        {

            NSString *responseString = [[NSString alloc] initWithData:[weakRequest responseData] encoding:NSUTF8StringEncoding];

            finishedBlock([responseString JSONValue]);

            

            NSLog(@"request url:%@\n request methord:%@\n requst para:%@\n result:%@", urlString, weakRequest.requestMethod, parameter, responseString);

        }

        if (finallyBlock)

        {

            finallyBlock();

        }

#endif

    }];

    

    // 设置请求失败时

    [request setFailedBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (failedBlock)

        {

            failedBlock([weakRequest error]);

        }

        if (finallyBlock)

        {

            finallyBlock();

        }

#endif

    }];

    

    // 发送异步请求

    [request startAsynchronous];

    

    return request;

}


/// 发送请求,自定义请求方式

- (ASIFormDataRequest *)sendRequest:(NSString *)urlString

                          parameter:(NSDictionary *)parameter

                        requestType:(NSString *)type

                           didStart:(void (^)(void))startBlock

                        didFinished:(void (^)(id obj))finishedBlock

                          didFailed:(void (^)(NSError *error))failedBlock

                            finally:(void (^)(void))finallyBlock

{

    // 创建请求 __block 在非ARC下时使用,而ARC下则用__weak

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

    

    // 设置请求模式,根据有无参数情况

    NSString *requestMethod = type;

    request.requestMethod = requestMethod;

    // 设置请求超时

    request.timeOutSeconds = 30.0;

    

    // 参数设置

    for (NSString *key in parameter.allKeys)

    {

        id valueObj = [parameter objectForKey:key];

        if ([valueObj isKindOfClass:[FileModal class]])

        {

            // 上传文件

            FileModal *fileModal = (FileModal *)valueObj;

            NSString *filePath = fileModal.filePath;

            NSString *fileName = [filePath substringFromIndex:[filePath rangeOfString:@"/" options:NSBackwardsSearch].location + 1];

            [request setFile:filePath withFileName:fileName andContentType:@"multipart/form-data" forKey:key];

        }

        else

        {

            [request setPostValue:valueObj forKey:key];

        }

    }

    

    __weak ASIFormDataRequest *weakRequest = request;

    

    // 设置请求开始时

    [request setStartedBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (startBlock)

        {

            startBlock();

        }

#endif

    }];

    

    // 设置请求成功时

    [request setCompletionBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (finishedBlock)

        {

            NSString *responseString = [[NSString alloc] initWithData:[weakRequest responseData] encoding:NSUTF8StringEncoding];

            finishedBlock([responseString JSONValue]);

            

            NSLog(@"request url:%@\n request methord:%@\n requst para:%@\n result:%@", urlString, weakRequest.requestMethod, parameter, responseString);

        }

        if (finallyBlock)

        {

            finallyBlock();

        }

#endif

    }];

    

    // 设置请求失败时

    [request setFailedBlock:^{

#if NS_BLOCKS_AVAILABLE

        if (failedBlock)

        {

            failedBlock([weakRequest error]);

        }

        if (finallyBlock)

        {

            finallyBlock();

        }

#endif

    }];

    

    // 发送异步请求

    [request startAsynchronous];

    

    return request;

}


@end




使用

1 导入头文件

#import "NetRequestBlockManager.h"

2 使用

注意内存管理,即相互引用

2-1

__weak 当前类名称 weakSelf = self;

    [[NetRequestBlockManager shareRequest] sendRequest:请求地址 parameter:请求参数 didStart:^{

        // 开始

    } didFinished:^(id obj) {

        // 成功

    } didFailed:^(NSError *error) {

// 失败

    } finally:^{

        // 结束

    }];

2-2

__weak 当前类名称 weakSelf = self;

    [[NetRequestBlockManager shareRequest] sendRequest:请求地址 parameter:请求参数 requestType:请求类型 didStart:^{

        // 开始

    } didFinished:^(id obj) {

        // 成功

        }

    } didFailed:^(NSError *error) {

        // 失败

    } finally:^{

        // 结束

    }];




转载于:https://my.oschina.net/potato512/blog/647742

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值