学而时习之,不亦乐乎,大家好,我是张杰。
iOS开发做久了不免就是复制了黏贴了,代码积累多了就不想敲了,高级一点的对UI也做了不少轮子。下面要写的不是UI轮子,是简单的网络请求的封装。
一般网络请求的封装分为两种:
一、iOS原生NSURLSession以及NSURLConnection(NSURLConnection已经被废弃,我们就不多说了)。NSURLSession 下面这篇讲的不错,我自认为没人家讲的精辟,怕误导读者,故引用之。
//www.greatytc.com/p/158e2a8c545e
二、网络请求封装或者说用的最多的 AFNetworking,也是基于iOS原生请求NSURLSession封装而来的。用法也很简单。但是我们的APP网络请求很多,每次都去写一遍请求头之类过于繁琐。下面是我自己封装的,个人认为简单明了,便于使用。
JsonAFNetworking.h
//
// JsonAFNetworking.h
//
// Created by Admin on 2019/8/15.
// Copyright © 2019 zhangjie. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface JsonAFNetworking : NSObject
+ (instancetype)sharedInstance;
/**
* 发送get请求
*
* @param URLString 请求的网址字符串
* @param parameters 请求的参数
* @param success 请求成功的回调
* @param failure 请求失败的回调
*/
- (void)getWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;
/**
* 发送post请求
*
* @param URLString 请求的网址字符串
* @param parameters 请求的参数
* @param success 请求成功的回调
* @param failure 请求失败的回调
*/
- (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;
@end
JsonAFNetworking.m
//
// JsonAFNetworking.m
//
// Created by Admin on 2019/8/15.
// Copyright © 2019 zhangjie. All rights reserved.
//
#import "JsonAFNetworking.h"
#import "AFNetworking.h"
#import "MBProgressHUD+NJ.h"
@implementation JsonAFNetworking
static id _instance = nil;
+ (instancetype)sharedInstance {
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
- (instancetype)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super init];
});
return _instance;
}
#pragma mark -- GET请求 --
- (void)getWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id))success
failure:(void (^)(NSError *))failure {
NSString *token = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"token"]) {
[manager.requestSerializer setValue:token forHTTPHeaderField:@"RUICHAOSESSIONID"];
}
[manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"%ld",(long)responses.statusCode);
if (responses.statusCode == 401) {
[MBProgressHUD hideHUD];
[self showLogin];
}else{
failure(error);
}
}
}];
}
#pragma mark -- POST请求 --
- (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id))success
failure:(void (^)(NSError *))failure {
NSString *token = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"token"]) {
[manager.requestSerializer setValue:token forHTTPHeaderField:@"RUICHAOSESSIONID"];
}
[manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@"HTTPMethod===== %@",task.originalRequest.HTTPMethod);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"%ld",(long)responses.statusCode);
if (responses.statusCode == 401) {
[MBProgressHUD hideHUD];
[self showLogin];
}else{
failure(error);
}
}
}];
}
//处理异地登录
-(void)showLogin{
UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil message: @"当前账号在其他地方登录" preferredStyle:UIAlertControllerStyleAlert];
//添加Button
[alertController addAction: [UIAlertAction actionWithTitle: @"重新登录" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//处理点击拍照
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"login" bundle:nil];
UITabBarController *mian = [mainSB instantiateViewControllerWithIdentifier:@"login"];
[UIApplication sharedApplication].keyWindow.rootViewController = mian;
}]];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController: alertController animated: YES completion: nil];
}
@end
使用起来很简单,打印的信息也很齐全,请求头,请求参数,请求地址等一目了然。