iOS AFN 請求封裝方法


 

.h 文件

#import <Foundation/Foundation.h>

#define kTimeOutInterval 30  //請求超時時間

@interface SingletonClass : NSObject

+(SingletonClass *)shareSingletonClasss;

#pragma mark  Get 請求數據

-(void)GetParsingDataSourceWithUrl:(NSString *)url WithVC:(UIViewController * )VC success:(void(^)(id responseObject))success fail:(void(^)())fail;

#pragma mark  post上傳數據

- (void)PostParsingDataSourceWithUrl:(NSString *)url parameters:(NSDictionary *)parameters  WithVC:(UIViewController * )VC success:(void(^)(id responseObject))success fail:(void(^)())fail;

 

#pragma mark 上傳圖片 Method

- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg;

 

#pragma mark 下載

- (void)downLoadWithUrlString:(NSString * )urlString;

 

- (NSMutableDictionary * )getWillPOSTData;

//#pragma mark  GET  請求數據

//- (void)GetParsingDataSoucrceWithUrl:(NSString * )url success:(void(^)(id responseObject))success fail:(void(^)())fail;

@end

 

.m 文件 

 

 

//

//  SingletonClass.m

//  YuTongTianXia

//

//  Created by 合一網絡 on 16/3/17.

//  Copyright © 2016年 合一網絡. All rights reserved.

//

 

#import "SingletonClass.h"

#import "AppDelegate.h"

#import "GetIPAddress.h"

#import "LoginViewController.h"

 

 

@implementation SingletonClass

 

+(SingletonClass *)shareSingletonClasss{

    static SingletonClass * singletonClass = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        singletonClass = [[SingletonClass alloc]init];

    });

    return singletonClass;

}

 

#pragma mark -  get 請求數據 Method

-(void)GetParsingDataSourceWithUrl:(NSString *)url WithVC:(UIViewController * )VC success:(void(^)(id responseObject))success fail:(void(^)())fail{

    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

    manager.requestSerializer = [AFHTTPRequestSerializer serializer];

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //超時時間

    manager.requestSerializer.timeoutInterval = kTimeOutInterval;

    

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

    NSMutableDictionary * dic = [self getWillPOSTData];

    [manager GET:url parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {

        //這里可以獲取到目前數據請求的進度

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {//請求成功

        

        //刪除轉義字符

        NSData *jsonData = [self deleteEscapeStringWithResponseObject:responseObject];

        //令牌異常的情況下跳轉到登錄界面

        [self JudgeTokenToLoginViewWithJsonData:jsonData WithVC:VC];

        //---------正常輸入數據

       

        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];

            success(dict);

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {//請求失敗

         [SVProgressHUD showErrorWithStatus:@"請求失敗"];

        fail(error);

       

    }];

}

 

#pragma mark  - post 請求/上傳數據  Method

- (void)PostParsingDataSourceWithUrl:(NSString *)url parameters:(NSDictionary *)parameters  WithVC:(UIViewController * )VC success:(void(^)(id responseObject))success fail:(void(^)())fail{

    AFHTTPSessionManager * manager = [[AFHTTPSessionManager alloc]init];

    

    manager.requestSerializer = [AFHTTPRequestSerializer serializer];

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

    NSMutableDictionary * dic = [self getWillPOSTData];

    [dic addEntriesFromDictionary:parameters];

   [manager POST:url parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

       

   } progress:^(NSProgress * _Nonnull uploadProgress) {

        // 這里可以獲取到目前數據請求的進度

   } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

       //請求成功

       NSString * str = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];

       NSLog(@"--responseObjectStr----%@",str);

       //刪除轉義字符

       NSData *jsonData = [self deleteEscapeStringWithResponseObject:responseObject];

       //令牌異常的情況下跳轉到登錄界面

       [self JudgeTokenToLoginViewWithJsonData:jsonData WithVC:VC];

        //---------正常輸入數據

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

           success(dict);

   } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

       //請求失敗

        [SVProgressHUD showErrorWithStatus:@"請求失敗"];

       fail(error);

       

   }];

    

}

 

#pragma mark - 上傳 Method

- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg

{

     // 創建管理者對象

    AFHTTPSessionManager * manager  =[AFHTTPSessionManager manager];

     // 參數

    NSDictionary * param = @{@"user_id":userId};

    [manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        /******** 1.上傳已經獲取到的img *******/

        // 把圖片轉換成data

        NSData * data = UIImagePNGRepresentation(upImg);

         // 拼接數據到請求題中

        [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];

        /******** 2.通過路徑上傳沙盒或系統相冊里的圖片 *****/

        //        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];

        

    } progress:^(NSProgress * _Nonnull uploadProgress) {

        // 打印上傳進度

        NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        //請求成功

        NSLog(@"請求成功:%@",responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        //請求失敗

        NSLog(@"請求失敗:%@",error);

         [SVProgressHUD showErrorWithStatus:@"請求失敗"];

    }];

}

 

 

#pragma mark - 下載 Method

- (void)downLoadWithUrlString:(NSString * )urlString

{

     // 1.創建管理者對象

    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

     // 2.設置請求的URL地址

    NSURL * url = [NSURL URLWithString:urlString];

    // 3.創建請求對象

    NSURLRequest * request = [NSURLRequest requestWithURL:url];

    // 4.下載任務

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

        //下載進度

        NSLog(@"當前下載進度為:%lf", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

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

        //下載地址

         NSLog(@"默認下載地址%@",targetPath);

        // 設置下載路徑,通過沙盒獲取緩存地址,最后返回NSURL對象

        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];

        return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址

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

        // 下載完成調用的方法

        NSLog(@"%@---%@", response, filePath);

    }];

    

    //啟動下載任務

    [task resume];

}

 

#pragma mark - 刪除轉義字符

- (NSData * )deleteEscapeStringWithResponseObject:(NSData * )responseObject{

    NSString * str_Json = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"\r\n" withString:@""];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"\r" withString:@""];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"\t" withString:@"   "];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"&nbsp;" withString:@"   "];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"&ldquo;" withString:@"“"];

    str_Json = [str_Json stringByReplacingOccurrencesOfString:@"&rdquo;" withString:@"”"];

    NSData * data = [str_Json dataUsingEncoding:NSUTF8StringEncoding];

    return data;

}

 

#pragma mark - 令牌異常的情況下跳轉到登錄界面

- (void)JudgeTokenToLoginViewWithJsonData:(NSData * )jsonData WithVC:(UIViewController * )VC{

    //令牌異常

    NSString * str = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];

    if ([str isEqualToString:@"令牌錯誤!"] || [str isEqualToString:@"令牌過期!"]) {

 

        LoginViewController *login = [[LoginViewController alloc]init];

        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:login];

        [VC presentViewController:nav animated:YES completion:nil];

        return;

    }

 

}

 

#pragma mark - POST請求需要傳入的參數

- (NSMutableDictionary * )getWillPOSTData{

    NSString * ipStr = [GetIPAddress getIPAddress:NO];

    

    NSDictionary * infoDic = [[NSBundle mainBundle] infoDictionary];

    NSString * currentVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];//當前版本號

    //     NSDictionary * parameters = @{@"qcmn_os":@"系統ios/android",@"qcmn_version":@"app版本號",@"qcmn_client_ip":@"客戶端IP地址",@"qcmn_ts":@"測試數據/線上數據"};

    NSDictionary * parameters = @{@"qcmn_os":@"ios",@"qcmn_version":currentVersion,@"qcmn_client_ip":ipStr,@"qcmn_ts":TESTORONLINE};

    NSMutableDictionary * dic = [NSMutableDictionary dictionary];

    [dic addEntriesFromDictionary:parameters];

    return dic;

 

}

 

 

/*

 #pragma mark  GET  請求數據

 - (void)GetParsingDataSoucrceWithUrl:(NSString * )url success:(void(^)(id responseObject))success fail:(void(^)())fail

 {

 url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 

 AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

 

 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

 

 [manager GET:url parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {

 //這里可以獲取到目前數據請求的進度

 } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {//請求成功

 success(responseObject);

 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {//請求失敗

  [SVProgressHUD showErrorWithStatus:@"請求失敗"];

 fail(error);

 }];

 }

 */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM