美文网首页
iOS简易封装网络请求

iOS简易封装网络请求

作者: 杰小冷_4957 | 来源:发表于2019-11-22 17:10 被阅读0次

学而时习之,不亦乐乎,大家好,我是张杰。

iOS开发做久了不免就是复制了黏贴了,代码积累多了就不想敲了,高级一点的对UI也做了不少轮子。下面要写的不是UI轮子,是简单的网络请求的封装。

一般网络请求的封装分为两种:
一、iOS原生NSURLSession以及NSURLConnection(NSURLConnection已经被废弃,我们就不多说了)。NSURLSession 下面这篇讲的不错,我自认为没人家讲的精辟,怕误导读者,故引用之。
https://www.jianshu.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

使用起来很简单,打印的信息也很齐全,请求头,请求参数,请求地址等一目了然。

相关文章

  • iOS简易封装网络请求

    学而时习之,不亦乐乎,大家好,我是张杰。 iOS开发做久了不免就是复制了黏贴了,代码积累多了就不想敲了,高级一点的...

  • 网络请求简易封装

    import typedef void (^completeB...

  • Android HttpURLConnection简易框架

    1、概述 封装一个简易的HttpURLConnection简易框架,内部通过线程池来进行网络请求。同时实现了请求返...

  • iOS网络框架简单封装

    AFN 简单封装--iOS重构-轻量级的网络请求封装实践 YTKNetworking 网络框架封装源码解析:网络层...

  • 如何封装iOS原生网络请求

    今天我想说的是如何封装iOS原生的网络请求 , 本文是基于 NSURLConnection 网络请求的封装 , 实...

  • iOS-网络相关

    本篇涵盖AFN、ASI、封装网络请求等. 1.iOS网络请求之ASI与AFN的二次封装及意义2.LXNetwork...

  • AFNetworking使用总结

    简介 AFNetworking是目前iOS最流行的网络请求库,其内部实现封装了NSURLSession的网络请求。...

  • 网络请求

    ios开发 合理封装请求接口 概述 如今大多的app都会与网络打交道,作为开发者 合理的对网络后台请求接口进行封装...

  • iOS封装网络请求, 封装 AFNetworking

    iOS,网络请求AFNetworking 的封装 SwpNetworking AFNetworking 是一个非常...

  • Flutter网络请求dio简易封装

    DioManager HeaderInterceptor DioLogInterceptor OperatingC...

网友评论

      本文标题:iOS简易封装网络请求

      本文链接:https://www.haomeiwen.com/subject/bveqwctx.html