對於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