网络工具类代码---单例(上传文件等等,发送网络请求)

本文介绍了一个用于iOS开发的网络请求工具类,支持GET和POST请求,并详细展示了如何封装请求参数及处理请求结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//  SHNetworkTool.h

#import <Foundation/Foundation.h>

// 定义 block 类型:
// 1. 成功回调 参数类型:二进制数据和响应头信息.
typedef void(^SuccessBlock)(id responseObj , NSURLResponse *response);

// 2. 失败回调
typedef void(^failBlock)(NSError *error);

@interface SHNetworkTool : NSObject

// 网络工具类 单例

// 带参数的网络请求:POST
// urlString: 网络接口.
// paramaters: 参数字典. key(服务器接收参数的key) = value(key对应的参数内容)
// success : 网络成功的回调
// fail : 网络失败的回调
-(
void)POSTdataWithUrlString:(NSString *)urlString paramaters:(NSDictionary *)paramaters SuccessBlock:(SuccessBlock)success FailBlock:(failBlock)fail;


// 带参数的网络请求:GET
// urlString: 网络接口.
// paramaters: 参数字典. key(服务器接收参数的key) = value(key对应的参数内容)
// success : 网络成功的回调
// fail : 网络失败的回调
- (
void)GETdataWithUrlString:(NSString *)urlString paramaters:(NSDictionary *)paramaters SuccessBlock:(SuccessBlock)success FailBlock:(failBlock)fail;


// 多文件上传.网络完成之后的回调.
// completionHandler:如果后台返回的是JSON 数据,自动解析之后,JSON 数据传递给外界 (responseObj:就是JSON解析之后的数据.)如果不是JSON 数据,直接传给外界 data(responseObj:就是 NSData) .
- (
void)POSTuploadWithUrlString:(NSString *)urlString fileDict:(NSDictionary *)fileDict fileKey:(NSString *)fileKey paramaters:(NSDictionary *)paramaters completionHandler:(void (^)(id responseObj, NSURLResponse * response, NSError *error))completionHandler;


// 自动封装多文件+多普通参数上传的请求体格式.
// fileDict : 文件参数字典
// fileKey  : 服务器接收文件参数的 key .
// paramaters : 普通参数字典
- (
NSData *)getHttpBodyWithfileDict:(NSDictionary *)fileDict fileKey:(NSString *)fileKey paramaters:(NSDictionary *)paramaters;

//实例化单例的方法.
+(
instancetype)sharedNetworkTool;

// 网络请求完成之后,应该有成功和失败.
// 定义两个Block :成功回调/失败回调.

// 发送网络请求的方法
// urlString :网络接口
// 两个 block 参数
// 1.successBlk 成功回调
// 2.failBlk 失败回调
-(
void)getServerDataWithUrlString:(NSString *)urlString Success:(SuccessBlock)successBlk Fail:(failBlock)failBlk;

@end






//
//  SHNetworkTool.m


#import "SHNetworkTool.h"
#define kBoundary @
"kboundary"


@implementation SHNetworkTool

-(
void)POSTdataWithUrlString:(NSString *)urlString paramaters:(NSDictionary *)paramaters SuccessBlock:(SuccessBlock)success FailBlock:(failBlock)fail
{
   
// 作业:
}


- (
void)GETdataWithUrlString:(NSString *)urlString paramaters:(NSDictionary *)paramaters SuccessBlock:(SuccessBlock)success FailBlock:(failBlock)fail
{
   
// GET 请求的参数都拼接在url, ? 分隔. 参数和参数之间以 & 分隔
   
NSMutableString *str = [NSMutableString stringWithFormat:@"%@?",urlString];
   
   
// 遍历参数字典,将参数拼接在 url 后面
    [paramaters
enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
       
       
// 服务器接收参数的 key .
       
NSString *paramaterKey = key;
       
// 参数内容
       
NSString *paramater = obj;
       
        [str
appendFormat:@"%@=%@&",paramaterKey,paramater];
       
    }];
   
   
   
NSString *urlStr = [str substringToIndex:str.length - 1];
   
   
NSLog(@"%@",urlStr);
   
   
// 1. 创建网络请求
   
NSURL *url = [NSURL URLWithString:urlStr];
   
   
NSURLRequest *request = [NSURLRequest requestWithURL:url];
   
   
   
// 2 .发送请求
    [[[
NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
       
if (data && !error) { // 网络成功
           
           
// JSON 解析 JSON --> OC
           
id Obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
           
           
if (!Obj) {
               
                Obj = data;
            }
           
           
// 执行 成功回调.
           
if (success) {
                success(Obj,response);
            }
           
        }
else
        {
           
// 执行网络失败回调.
           
if (fail) {
                fail(error);
            }
        }
       
    }]
resume];

}


- (
void)POSTuploadWithUrlString:(NSString *)urlString fileDict:(NSDictionary *)fileDict fileKey:(NSString *)fileKey paramaters:(NSDictionary *)paramaters completionHandler:(void (^)(id, NSURLResponse *, NSError *))completionHandler
{
   
// 百分号转译
    urlString = [urlString
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
   
   
NSURL *url = [NSURL URLWithString:urlString];
   
   
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
   
   
// 设置请求方法
    request.
HTTPMethod = @"POST";
   
   
NSString *type = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",kBoundary];
   
// 设置 Content-Type
    [request
setValue:type forHTTPHeaderField:@"Content-Type"];

   
//  设置请求体
    request.
HTTPBody = [self getHttpBodyWithfileDict:fileDict fileKey:fileKey paramaters:paramaters];
   
   
// 发送请求
    [[[
NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
       
// 网络完成. 回调自己写的 block(completionHandler)
       
       
// 解析 JSON 数据.
       
id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
       
       
if (!obj) { // 如果 data 不是 JSON 数据, obj = data.
           
            obj = data;
        }
       
       
// 执行 block 回调.
       
if (completionHandler) {
           
            completionHandler(obj,response,error);
        }
   
    }]
resume];

}


// fileDict : 文件参数字典
// fileKey  : 服务器接收文件参数的 key .
// paramaters : 普通参数字典
- (
NSData *)getHttpBodyWithfileDict:(NSDictionary *)fileDict fileKey:(NSString *)fileKey paramaters:(NSDictionary *)paramaters
{
   
// 实例化空的请求体内容.
   
NSMutableData *data = [NSMutableData data];
   
   
// 1. 遍历文件参数字典,拼接文件参数格式.
    [fileDict
enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
       
       
// 文件路径
       
NSString *filePath = key;
       
// 文件名称
       
NSString *fileName = obj;
       
       
// 拼接文件格式:
       
       
// 1. 文件的上边界 headerStrM
       
       
NSMutableString *headerStrM = [NSMutableString stringWithFormat:@"\r\n--%@\r\n",kBoundary];
       
        [headerStrM
appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n",fileKey,fileName];
       
        [headerStrM
appendFormat:@"Content-Type: application/octet-stream\r\n\r\n"];
       
       
// 将文件上边界添加到请求体中
       
        [data
appendData:[headerStrM dataUsingEncoding:NSUTF8StringEncoding]];
       
       
// 2. 文件内容
       
       
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
       
       
// 将文件内容添加到请求体中
       
        [data
appendData:fileData];
       
    }];
   
   
// 2. 遍历普通参数字典,拼接普通参数的上传格式.
    [paramaters
enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
       
       
// 服务器接收参数的 key .
       
NSString *paramaterKey = key;
       
// 参数内容
       
NSString *paramater = obj;
       
       
// 拼接普通参数的上传格式.
       
       
// 1. 普通参数上边界
       
       
NSMutableString *headerStrM = [NSMutableString stringWithFormat:@"\r\n--%@\r\n",kBoundary];
       
        [headerStrM
appendFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n",paramaterKey];
       
       
// 将普通参数上边界添加到请求体中
        [data
appendData:[headerStrM dataUsingEncoding:NSUTF8StringEncoding]];
       
       
// 2. 普通参数内容
       
       
NSData *paramaterData = [paramater dataUsingEncoding:NSUTF8StringEncoding];
       
       
// 将普通参数内容添加到请求体中
        [data
appendData:paramaterData];
       
    }];
   
   
   
// 下边界内容
   
NSMutableString *footerStrM = [NSMutableString stringWithFormat:@"\r\n--%@--",kBoundary];
   
   
// 将下边界内容添加到请求体中
    [data
appendData:[footerStrM dataUsingEncoding:NSUTF8StringEncoding]];
   
   
return data;
}


-(
void)getServerDataWithUrlString:(NSString *)urlString Success:(SuccessBlock)successBlk Fail:(failBlock)failBlk
{
   
// 1. 创建请求
   
NSURL *url = [NSURL URLWithString:urlString];
   
   
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
   
   
// 2. 发送网络请求
    [[[
NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
       
// 网络请求完成之后的回调.
       
       
// 成功:
       
if (data && !error) {
           
// 执行成功回调.
           
dispatch_async(dispatch_get_main_queue(), ^{
               
               
// 3.执行成功回调.
               
if (successBlk) {
                    successBlk(data,response);
                }
            });
        }
else // 失败
        {
           
if (failBlk) {
               
// 3.执行失败回调.
                failBlk(error);
            }
           
        }
       
    }]
resume];
}


+(
instancetype)sharedNetworkTool
{
   
static id _instance;
   
   
static dispatch_once_t onceToken;
   
dispatch_once(&onceToken, ^{
        _instance = [[
self alloc] init];
    });
   
   
return _instance;
}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值