封装网络请求

封装网络请求类便捷, 适合多个地方使用.

第一封装下载方法

前提用Cocoapods或者直接引用第三方AFNetWorking

定义一个类NetWorkingManager, 继承于NSObject

A: 在.h中写方法声明

#import <Foundation/Foundation.h>

@interface NetWorkManager : NSObject

- (void)downLoadWithUrl:(NSString *)url progress:(void(^)(float progress))progressBlock complete:(void(^)(NSString *filePath))completeBlock;

//其中有两个Block块回调方法, 第一个回调下载进度, 第二个回调下载完成后返回文件路径名

@end

B: 在.m中写方法实现

#import "NetWorkManager.h"

#import "NSString+Security.h"

#import <AFNetworking/AFNetworking.h>

@implementation NetWorkManager

- (void)downLoadWithUrl:(NSString *)url progress:(void (^)(float))progressBlock complete:(void (^)(NSString *))completeBlock{

//在cache文件下, 创建存储MP3文件的文件夹

//创建文件夹路径

NSString *mp3Path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"downLoad"];

NSLog(@"%@", mp3Path);

NSFileManager *fileManager = [NSFileManager defaultManager];

//判断文件路径是否存在, 不存在就创建, 存在了就不创建

if ([fileManager fileExistsAtPath:mp3Path]) {

}else{

[fileManager createDirectoryAtPath:mp3Path withIntermediateDirectories:YES attributes:nil error:nil];

}

//对下载的文件名进行加密

NSString *fileName = url.md5;

//创建文件存储路径

NSString *filePath = [mp3Path stringByAppendingPathComponent:fileName];

//判断文件名是否存在, 存在就说明已经下载过了, 不再下载, 反之就下载文件

if ([fileManager fileExistsAtPath:filePath]) {

return;

}

//文件下载

//创建 manager

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

//POST请求 用[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod

//创建 request;适用于GET请求

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

//创建下载任务

NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

//返回下载进度

progressBlock(downloadProgress.completedUnitCount / (downloadProgress.totalUnitCount / 1.0));

} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

//返回文件存储路径

return [NSURL fileURLWithPath:filePath];

} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

//下载完成

completeBlock(mp3Path);

}];

[task resume];

}

@end

第二封装POST网络请求

A:在.h中写方法的声明

//封装POST网络请求

//parameter 请求体

- (void)networkWithUrl:(NSString *)Url parameter:(NSDictionary *)dic success:(void(^)(id obj))successBlock fail:(void(^)(NSError *error))failBlock;

//两个回调方法, 第一个回调成功后的操作, 第二个回调失败信息

B: 在.m中写方法实现

- (void)networkWithUrl:(NSString *)Url parameter:(NSDictionary *)dic success:(void (^)(id))successBlock fail:(void (^)(NSError *))failBlock{

//创建Session manager

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

//创建request, POST请求方法

NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:Url parameters:dic constructingBodyWithBlock:nil error:nil];

//创建请求任务

NSURLSessionDataTask *task = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

if (error) {

failBlock(error);

}else{

successBlock(responseObject);

}

}];

//开启任务

[task resume];

}

注意:需要在AFNetworking第三方里的

文件的第226行添加

字段

第三封装上传图片方法

A:在.h中写方法的声明

//封装上传图片方法

- (void)netWorkWithURL:(NSString *)url pic:(UIImage *)image parameter:(NSDictionary *)dic successBlock:(void (^)(id obj))success failBlock:(void (^)(NSError *error))fail;

B:在.m中写方法的实现

- (void)netWorkWithURL:(NSString *)url pic:(UIImage *)image parameter:(NSDictionary *)dic successBlock:(void (^)(id))success failBlock:(void (^)(NSError *))fail{

//创建sessionManager

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

//创建request, POST请求

NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:url parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

//在这里提交图片/视频/音频等数据

//先把图片转为 NSData

//参数2:缩放比例

NSData *data = UIImageJPEGRepresentation(image, 0.5);

//参数1:是data数据

//参数2:服务器提供的字段名, 片刻里面叫 iconfile

//参数3:随意填写

//参数4:文件类型

[formData appendPartWithFileData:data name:@"iconfile" fileName:[NSString stringWithFormat:@"%f.png", [[NSDate date] timeIntervalSince1970]] mimeType:@"PNG/JPEG/JPG"];

} error:nil];

//创建请求任务

NSURLSessionDataTask *task = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

if (error) {

fail(error);

}else{

success(responseObject);

}

}];

[task resume];

}

注意:此方法一般会用在注册中, 因为注册时需要用户选择头像上传到服务器上, 一般的网络请求不满足需求.

时间: 2024-12-15 01:50:16

封装网络请求的相关文章

[iOS微博项目 - 3.3] - 封装网络请求

github: https://github.com/hellovoidworld/HVWWeibo A.封装网络请求 1.需求 为了避免代码冗余和对于AFN框架的多处使用导致耦合性太强,所以把网络请求封装成自己的工具类,以后便于更换网络框架. 2.思路 创建一个自定义工具类,提供类方法来实现网络请求 3.实现 1 // 2 // HVWNetworkTool.h 3 // HVWWeibo 4 // 5 // Created by hellovoidworld on 15/2/9. 6 //

四种网络请求的方式封装网络请求

封装网络请求类便捷, 适合多个地方使用. 第一封装下载方法 前提用Cocoapods或者直接引用第三方AFNetWorking 定义一个类NetWorkingManager, 继承于NSObject A: 在.h中写方法声明 #import <Foundation/Foundation.h> @interface NetWorkManager : NSObject - (void)downLoadWithUrl:(NSString *)url progress:(void(^)(float p

App 组件化/模块化之路——如何封装网络请求框架

App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-async-http 这些网络请求库很大程度上提高程序猿的编码效率.但是随着业务的发展,App 变得越来越大,我们将这些网络请求库加入到项目中直接使用,对我们业务类的入侵是非常强的.如果要进行业务分离时,这些网络请求代码将是一个阻止我们进一步工作的绊脚石.对开发者来说是非常痛苦的. 因此我们构建的网络请求框

ios中封装网络请求类

ios中封装网络请求类 #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 #import "UseXmlParser.h" //判断是否联网 #import "Reachability.h" //sbJson,判断json的解析 #import "JSON.h" @implementation JS

iOS开发项目篇—35封装网络请求

iOS开发项目篇—35封装网络请求 一.简单说明 1.分析项目对网路请求(AFN框架)的依赖 项目中,多个控制器都使用了AFN框架发送网络请求,如果AFN2.0存在重大BUg,或者是升级至3.0版本,那么对于整个项目都是及其危险的,所有用到AFN的地方都需要做出相应的修改. 另外,如果现在要求不再使用AFN框架,而是使用一个新的框架,那么有关AFN的依赖所关联的所有代码都需要重新来过. 如果把afn这个第三方框架从项目中删除的话,那么项目就相当于作废了,这就是项目对第三方框架的强依赖的体现. 说

事件传递参数-封装网络请求api

1==>通过点击事件进行传递参数 <view bindtap="goEdution" data-index="5">西南大学</view> <view bindtap="goEdution" data-index="6">北京师范</view> <view bindtap="goEdution" data-index="7"&g

微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据

§ 封装网络请求及 mock 数据 本文配套视频地址:https://v.qq.com/x/page/i0554... 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发工具 上一节中,我们对 index.js 文件中增加了 util 对象,并在对象中封装了很多公用方法 let util = { log(){--}, alert(){--}, getStorageData(){--}, setStorageData(){--} } 本节中,我们对常用的网络请求方法 wx.reques

用Block封装网络请求

#import <Foundation/Foundation.h> // 定义一个枚举typedef NS_ENUM(NSInteger) {    LY_GET,    LY_POST} URLRequestMethod;///定义返回block网络请求结果typedef void(^ResultBlock)(NSData *data,NSURLResponse *response,NSError *error); @interface LYNetWorkRequestManager : N

关于android-async-http的使用,封装网络请求

首先async是跟安卓中自带的AsyncTask很像,不过它更简单 异步基于回调的Http客户端为Android构建,是基于Apache HttpClient库的.所有的请求都是位于应用程序主线程 UI 之外,但任何回调逻辑将相同的线程上执行回调,使用Android的处理程序创建消息传递. 首先封装一下AsyncHttpClient,这个jar包中的核心类 public class AsyncHttpRequestClient { private static AsyncHttpClient c