zoukankan      html  css  js  c++  java
  • 第八篇、封装NSURLSession网络请求框架

    主要功能介绍:

      1.GET请求操作

      2.POST请求操作

    1.处理params参数(例如拼接成:usename="123"&password="123")

    #import <Foundation/Foundation.h>
    
    @interface LYURLRequestSerialization : NSObject
    
    +(NSString *)LYQueryStringFromParameters:(NSDictionary *)parameters;
    
    @end
    #import "LYURLRequestSerialization.h"
    
    @interface LYURLRequestSerialization()
    
    @property (readwrite, nonatomic, strong) id  value;
    @property (readwrite, nonatomic, strong) id  field;
    
    
    @end
    
    @implementation LYURLRequestSerialization
    
    
    
    - (id)initWithField:(id)field value:(id)value {
        self = [super init];
        if (!self) {
            return nil;
        }
        
        self.field = field;
        self.value = value;
        
        return self;
    }
    
    #pragma mark -
    
    FOUNDATION_EXPORT NSArray * LYQueryStringPairsFromDictionary(NSDictionary *dictionary);
    FOUNDATION_EXPORT NSArray * LYQueryStringPairsFromKeyAndValue(NSString *key, id value);
    
    +(NSString *)LYQueryStringFromParameters:(NSDictionary *)parameters {
        NSMutableArray *mutablePairs = [NSMutableArray array];
        for (LYURLRequestSerialization *pair in LYQueryStringPairsFromDictionary(parameters)) {
            
            [mutablePairs addObject:[pair URLEncodedStringValue]];
        }
        
        return [mutablePairs componentsJoinedByString:@"&"];
    }
    
    
    
    NSArray * LYQueryStringPairsFromDictionary(NSDictionary *dictionary) {
        return LYQueryStringPairsFromKeyAndValue(nil, dictionary);
    }
    
    
    
    NSArray * LYQueryStringPairsFromKeyAndValue(NSString *key, id value) {
        NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
        
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];
        
        if ([value isKindOfClass:[NSDictionary class]]) {
            NSDictionary *dictionary = value;
            for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
                id nestedValue = dictionary[nestedKey];
                if (nestedValue) {
                    [mutableQueryStringComponents addObjectsFromArray:LYQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
                }
            }
        } else if ([value isKindOfClass:[NSArray class]]) {
            NSArray *array = value;
            for (id nestedValue in array) {
                [mutableQueryStringComponents addObjectsFromArray:LYQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
            }
        } else if ([value isKindOfClass:[NSSet class]]) {
            NSSet *set = value;
            for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
                [mutableQueryStringComponents addObjectsFromArray:LYQueryStringPairsFromKeyAndValue(key, obj)];
            }
        } else {
            [mutableQueryStringComponents addObject:[[LYURLRequestSerialization alloc] initWithField:key value:value]];
        }
        
        return mutableQueryStringComponents;
    }
    
    
    static NSString * LYPercentEscapedStringFromString(NSString *string) {
        static NSString * const kLYCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4
        static NSString * const kLYCharactersSubDelimitersToEncode = @"!$&'()*+,;=";
        
        NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
        [allowedCharacterSet removeCharactersInString:[kLYCharactersGeneralDelimitersToEncode stringByAppendingString:kLYCharactersSubDelimitersToEncode]];
        
        
        static NSUInteger const batchSize = 50;
        
        NSUInteger index = 0;
        NSMutableString *escaped = @"".mutableCopy;
        
        while (index < string.length) {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wgnu"
            NSUInteger length = MIN(string.length - index, batchSize);
    #pragma GCC diagnostic pop
            NSRange range = NSMakeRange(index, length);
            
            range = [string rangeOfComposedCharacterSequencesForRange:range];
            
            NSString *substring = [string substringWithRange:range];
            NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
            [escaped appendString:encoded];
            
            index += range.length;
        }
        
        return escaped;
    }
    
    - (NSString *)URLEncodedStringValue {
        if (!self.value || [self.value isEqual:[NSNull null]]) {
            return LYPercentEscapedStringFromString([self.field description]);
        } else {
            return [NSString stringWithFormat:@"%@=%@", LYPercentEscapedStringFromString([self.field description]), LYPercentEscapedStringFromString([self.value description])];
        }
    }
    
    @end

    2.封装请求管理器

    #import <Foundation/Foundation.h>
    
    @interface LYHTTPRequestOperationManager : NSObject
    
    
    -(void)driveTask:(nullable void(^)(NSData *__nullable data,NSURLResponse * __nullable response))success
             failure:(nullable void (^)(NSError *__nullable error))failure;
    
    
    - (instancetype) initWithMethod:(NSString *)method URL:(NSString *)URL parameters:( id)parameters;
    
    
    @end
    #import "LYHTTPRequestOperationManager.h"
    #import "LYURLRequestSerialization.h"
    
    @interface LYHTTPRequestOperationManager()
    
    @property(nonatomic,strong) NSString *URL;
    @property(nonatomic,strong) NSString *method;
    @property(nonatomic,strong) NSDictionary *parameters;
    @property(nonatomic,strong) NSMutableURLRequest *request;
    @property(nonatomic,strong) NSURLSession *session;
    @property(nonatomic,strong) NSURLSessionDataTask *task;
    
    @end
    
    @implementation LYHTTPRequestOperationManager
    
    
    - (instancetype)initWithMethod:(NSString *)method URL:(NSString *)URL parameters:(id)parameters
    {
        self = [super init];
        if (!self) {
            return nil;
        }
        self.URL = URL;
        self.method = method;
        self.parameters = parameters;
        self.request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL]];
        self.session = [NSURLSession sharedSession];
        return self;
    }
    
    -(void)test{
        NSLog(@"URL = %@",self.URL);
    }
    
    -(void)setRequest{
        if ([self.method isEqual:@"GET"]&&self.parameters.count>0) {
            
            self.request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[[self.URL stringByAppendingString:@"?"] stringByAppendingString: [LYURLRequestSerialization LYQueryStringFromParameters:self.parameters]]]];
        }
        self.request.HTTPMethod = self.method;
        
        if (self.parameters.count>0) {
            [self.request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        }
    }
    
    
    -(void)setBody{
        if (self.parameters.count>0&&![self.method isEqual:@"GET"]) {
           
            self.request.HTTPBody = [[LYURLRequestSerialization LYQueryStringFromParameters:self.parameters] dataUsingEncoding:NSUTF8StringEncoding];
        }
    }
    
    
    -(void)setTaskWithSuccess:(void(^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                      failure:(void (^)(NSError *__nullable error))failure
    {
        self.task = [self.session dataTaskWithRequest:self.request completionHandler:^(NSData * data,NSURLResponse *response,NSError *error){
                    if (error) {
                        failure(error);
                    }else{
                        if (success) {
                            success(data,response);
                        }
                    }
                }];
        [self.task resume];
    }
    
    
    -(void)driveTask:(void(^)(NSData *__nullable data,NSURLResponse * __nullable response))success
             failure:(void (^)(NSError *__nullable error))failure
    {
        [self setRequest];
        [self setBody];
        [self setTaskWithSuccess:success failure:failure];
    }
    @end

    3.封装适配器

    #import <Foundation/Foundation.h>
    
    @interface LyNetWork : NSObject
    
    
    +(void)requestWithMethod:(nullable NSString *)method
                         URL:(nullable NSString *)URL
                     success:(nullable void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                     failure:(nullable void (^)(NSError *__nullable error))failure;
    
    
    +( void)requestGetWithURL:(nullable NSString *)URL
                     success:(nullable void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                      failure:(nullable void (^)(NSError *__nullable error))failure;
    
    
    +(void)requestGetWithURL:(nullable NSString *)URL
                  parameters:(nullable id) parameters
                     success:(nullable void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                     failure:(nullable void (^)(NSError *__nullable error))failure;
    
    +(void)requestPostWithURL:(nullable NSString *)URL
                      success:(nullable void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                      failure:(nullable void (^)(NSError *__nullable error))failure;
    
    
    +(void)requestPostWithURL:(nullable NSString *)URL
                   parameters:(nullable id) parameters
                      success:(nullable void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                      failure:(nullable void (^)(NSError *__nullable error))failure;
    
    
    
    @end
    #import "LyNetWork.h"
    #import "LYURLRequestSerialization.h"
    #import "LYHTTPRequestOperationManager.h"
    
    
    @interface LyNetWork()
    
    
    
    @end
    
    @implementation LyNetWork
    
    
    //+(void)requestMethod:(NSString *)method
    //                 URL:(NSString *)URL
    //          parameters:(id) parameters
    //             success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
    //             failure:(void (^)(NSError *__nullable error))failure
    //{
    //    
    //    LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:method URL:URL parameters:parameters];
    //    [manange driveTask:success failure:failure];
    //}
    
    //不带parameters
    +(void)requestWithMethod:(NSString *)method
                     URL:(NSString *)URL
                 success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                 failure:(void (^)(NSError *__nullable error))failure
    {
        
        LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:method URL:URL parameters:nil];
        [manange driveTask:success failure:failure];
    }
    
    
    //GET不带parameters
    +(void)requestGetWithURL:(NSString *)URL
                 success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                 failure:(void (^)(NSError *__nullable error))failure
    {
        
        LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:@"GET" URL:URL parameters:nil];
        [manange driveTask:success failure:failure];
    }
    //GET带parameters
    +(void)requestGetWithURL:(NSString *)URL
              parameters:(id) parameters
                 success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                 failure:(void (^)(NSError *__nullable error))failure
    {
        
        LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:@"GET" URL:URL parameters:parameters];
        [manange driveTask:success failure:failure];
    }
    
    
    
    //POST不带parameters
    +(void)requestPostWithURL:(NSString *)URL
                     success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                     failure:(void (^)(NSError *__nullable error))failure
    {
        
        LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:@"POST" URL:URL parameters:nil];
        [manange driveTask:success failure:failure];
    }
    //POST带parameters
    +(void)requestPostWithURL:(NSString *)URL
                  parameters:(id) parameters
                     success:(void (^)(NSData *__nullable data,NSURLResponse * __nullable response))success
                     failure:(void (^)(NSError *__nullable error))failure
    {
        
        LYHTTPRequestOperationManager *manange = [[LYHTTPRequestOperationManager alloc] initWithMethod:@"POST" URL:URL parameters:parameters];
        [manange driveTask:success failure:failure];
    }
    
    
    
    @end

    4.使用示例

        NSString *postURL = @"http://cityuit.sinaapp.com/p.php";
        NSString *getURL= @"http://cityuit.sinaapp.com/1.php";
        
        id parmentersPost = @{
                          @"username":@"1",
                          @"password":@"1"
                          };
        id parmentersGet = @{
                          @"value":@"Lastday",
                              };
    
        
        
        [LyNetWork requestWithMethod:@"POST"
                                 URL:@"http://cityuit.sinaapp.com/1.php?value=Lastday"
                             success:^(NSData *data,NSURLResponse *response){
                                 NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                 NSLog(@"requestWithMethod = %@",string);
                             }
                             failure:^(NSError *error){
                                 NSLog(@"====%@",error);
                             }];
        
        
        [LyNetWork requestPostWithURL:postURL
                           parameters:parmentersPost
                              success:^(NSData *data,NSURLResponse *response){
                                  NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                  NSLog(@"requestPostWithURL(带参数) = %@",string);
                              }
                              failure:^(NSError *error){
                                  
                              }];
        [LyNetWork requestPostWithURL:postURL
                              success:^(NSData *data,NSURLResponse *response){
                                  NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                  NSLog(@"requestPostWithURL(不带参数) = %@",string);
                              }
                              failure:^(NSError *error){
                                  
                              }];
        
        [LyNetWork requestGetWithURL:getURL
                           parameters:parmentersGet
                              success:^(NSData *data,NSURLResponse *response){
                                  NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                  NSLog(@"requestGetWithURL(带参数) = %@",string);
                              }
                              failure:^(NSError *error){
                                  
                              }];
        
        [LyNetWork requestGetWithURL:getURL
                              success:^(NSData *data,NSURLResponse *response){
                                  NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                  NSLog(@"requestGetWithURL(不带参数) = %@",string);
                              }
                              failure:^(NSError *error){
                                  
                              }];
  • 相关阅读:
    add repository(仓库) EntityState状态
    添加 Attribute(属性)和Attribute的用法
    分部视图 Partial View
    MVC架构+ef 添加、删除、查询用户。。。
    首次接触 ef
    了解ASP.NET MVC的基本架构
    C# SqlParameter SqlCommand
    mysql命令行导出导入,附加数据库
    py03_变量
    py02_操作系统
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/6055617.html
Copyright © 2011-2022 走看看