OC HTTPRequest GET和POST請求的代碼封裝


對於GET和PSOT請求我們在開發中會經常使用,所以對代碼進行封裝就可以做到事半功倍.下面就介紹下怎么對代碼進行封裝,

要求是:

 1.要有網絡成功和失敗的blcok.

 2.如果服務器傳回的是 JSON 數據,自動解析;如果不是,直接返回二進制數據.

 3.默認成功之后的block回調在主線程進行.

首先我們要創建一個類ZSNetworkTool,繼承自NSObject,代碼如下

#import <Foundation/Foundation.h>

//定義別名

//成功回調類型:參數: 1. id: object(如果是 JSON ,那么直接解析成OC中的數組或者字典.如果不是JSON ,直接返回 NSData)

typedef void(^SuccessBlock)(id object , NSURLResponse *response);

// 失敗回調類型:參數: NSError error;

typedef void(^failBlock)(NSError *error);

 @interface ZSNetworkTool : NSObject

// 單例的實例化方法

+ (instancetype)sharedNewtWorkTool;

// GET請求調用的方法 其中: urlString:網絡接口. paramaters:參數字典 參數字典:  key:服務器接收參數的 key 值.  value:參數內容. 成功回調類型:參數: 1. id: object(如果是 JSON ,那么直接解析成OC中的數組或者字典.如果不是JSON ,直接返回 NSData) 2. NSURLResponse: response ,  success: 成功回調. fail 失敗回調.

- (void)GETRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail;

// POST請求調用方法 其中: urlString:網絡接口. paramaters:參數字典 參數字典:  key:服務器接收參數的 key 值.  value:參數內容. 成功回調類型:參數: 1. id: object(如果是 JSON ,那么直接解析成OC中的數組或者字典.如果不是JSON ,直接返回 NSData) 2. NSURLResponse: response ,  success: 成功回調. fail 失敗回調.

-(void)POSTRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail;

 @end

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在.m實現方法

#import "ZSNetworkTool.h"

@implementation ZSNetworkTool

// 單例的實例化方法

+(instancetype)sharedNewtWorkTool

{

    static id _instance;

   static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[self alloc] init];

    });

    return _instance;

}

 //實現GET請求方法

- (void)GETRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail

{

    NSMutableString *strM = [[NSMutableString alloc] init];

//遍歷參數字典將value和key拼裝在一起

     [paramaters enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

           // 服務器接收參數的 key 值.

        NSString *paramaterKey = key;

             // 參數內容

        NSString *paramaterValue = obj;

        // appendFormat :可變字符串直接拼接的方法!

        [strM appendFormat:@"%@=%@&",paramaterKey,paramaterValue];

    }];

    urlString = [NSString stringWithFormat:@"%@?%@",urlString,strM];

        // 截取字符串的方法!

    urlString = [urlString substringToIndex:urlString.length - 1];

    NSLog(@"urlString:%@",urlString);

    NSURL *url = [NSURL URLWithString:urlString];

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];

        // 2. 發送網絡請求.

    // completionHandler: 說明網絡請求完成!

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

        // 網絡請求成功:

        if (data && !error) {

            // 查看 data 是否是 JSON 數據.

            // JSON 解析.

            id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

            // 如果 obj 能夠解析,說明就是 JSON

            if (!obj) {

                obj = data;

            }

            // 成功回調

            dispatch_async(dispatch_get_main_queue(), ^{

                   if (success) {

                    success(obj,response);

                }

            });

         }else //失敗

        {

            // 失敗回調

            if (fail) {

                fail(error);

            }

        }

    }] resume];

}

//POST請求方法

- (void)POSTRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail

{

    NSMutableString *strM = [[NSMutableString alloc] init];

        [paramaters enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

                // 服務器接收參數的 key 值.

        NSString *paramaterKey = key;

               // 參數內容

        NSString *paramaterValue = obj;

               // appendFormat :可變字符串直接拼接的方法!

        [strM appendFormat:@"%@=%@&",paramaterKey,paramaterValue];

    }];

    NSString *body = [strM substringToIndex:strM.length - 1];

    NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];

    // 1.設置請求方法:

    request.HTTPMethod = @"POST";

    // 2.設置請求體

    request.HTTPBody = bodyData;

    // 2. 發送網絡請求.

    // completionHandler: 說明網絡請求完成!

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        // 網絡請求成功:

        if (data && !error) {

            // 查看 data 是否是 JSON 數據.

            // JSON 解析.

            id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

            // 如果 obj 能夠解析,說明就是 JSON

            if (!obj) {

                obj = data;

            }

            

            // 成功回調

            dispatch_async(dispatch_get_main_queue(), ^{

                

                if (success) {

                    success(obj,response);

                }

            });

        }else //失敗

        {

            // 失敗回調

            if (fail) {

                fail(error);

            }

        } 

    }] resume];

}

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面的代碼是控制器中調用一下GET方法

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"touchesBegan");

    NSMutableDictionary *dict = @{@"username":@"value1",@"password":@"value2"}.mutableCopy;

    [[CZNetworkTool sharedNewtWorkTool] GETRequestWithUrl:@"http://127.0.0.1/login/login.php" paramaters:dict successBlock:^(id object, NSURLResponse *response) {

          NSLog(@"網絡請求成功:%@ %@",object,[NSThread currentThread]);

    } FailBlock:^(NSError *error) {

            NSLog(@"網絡請求失敗");

    }];

   }

@end

 


免責聲明!

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



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