• iOS NSURLConnection POST异步请求封装,支持转码GBK,HTTPS等


     

    .h文件

    #import <Foundation/Foundation.h>

    //成功的回调

    typedef void(^successBlock)(id responseObj);

     

    //失败的回调

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

     

     

    @interface HttpGBK : NSObject<NSURLConnectionDataDelegate>

     

    {

        successBlock _saveSuccessBlock;//用于保存成功的回调

        failureBlock _saveFailureBlock;//用于保存失败的回调

        

        NSMutableData *_recevieData;//接收数据

    }

     

    + (instancetype)shareInstance;

     

    //自定义的POST方法

    - (void)POST:(NSString *)urlString parameters:(NSDictionary *)parameters success:(successBlock)success failure:(failureBlock)failure;

     

     

    @end

     

    .m文件

     

    #import "HttpGBK.h"

     @implementation HttpGBK

     

    + (instancetype)shareInstance

    {

        

        static HttpGBK *manager = nil;

        

        @synchronized(self)

        {

            //如果为空,则实例化

            if (manager == nil)

            {

                manager = [[HttpGBK alloc]init];

            }

        }

        //如果已经实例化过,直接返回

        return manager;

    }

     

     

    //重写构造方法

    - (instancetype)init

    {

        self = [super init];

        if (self)

        {

            _recevieData = [[NSMutableData alloc]init];

        }

        return self;

    }

     

     

     

    - (void)POST:(NSString *)urlString parameters:(NSDictionary *)parameters success:(successBlock)success failure:(failureBlock)failure

    {

    //对数据进行备份,以防传输过程中丢失数据

       _saveSuccessBlock = [success copy];

        _saveFailureBlock = [failure copy];

        

        NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

        

            NSString *str= [self makeParameters:parameters];

      //设置传输的参数为GBK    

       NSData *pramaData = [str dataUsingEncoding:enc];

        //拼接URL

            NSURL *requeturl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",BESTURL,urlString]];

        

            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requeturl];

        //设置为POST请求

              request.HTTPMethod = @"POST";

        

      //设置请求体    

            request.HTTPBody = pramaData;

        

            NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(enc));

      //设置请求头    

            [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];

        //设置请求头的长度

            [request addValue:[NSString stringWithFormat:@"%ld",[pramaData length]] forHTTPHeaderField:@"Content-Length"];

     

        //发起异步请求

        [NSURLConnection connectionWithRequest:request delegate:self];

    }

     

     

     

    #pragma mark -NSURLConnectionDataDelegate

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

    {

        _recevieData.length = 0;

    }

     

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    {

        [_recevieData appendData:data];

    }

     

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    {

        //如果有保存失败的回调才做回调.避免崩溃

        if (_saveFailureBlock)

        {

            _saveFailureBlock(error);

        }

    }

     

     

    -(void)connectionDidFinishLoading:(NSURLConnection *)connection

    {

        //成功的回调

        NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

        

        NSString *string = [[NSString alloc] initWithBytes:[_recevieData bytes] length:[_recevieData length] encoding:enc];

        

        NSData *newData = [string dataUsingEncoding:NSUTF8StringEncoding];

        

        id obj = [NSJSONSerialization JSONObjectWithData:newData options:NSJSONReadingMutableContainers error:nil];

        if (_saveSuccessBlock)

        {

            //转化成功,传回字典.转化失败,把二进制数据原样传回

            if (obj)

            {

                _saveSuccessBlock(obj);

            }else

            {

                _saveSuccessBlock(_recevieData);

            }

        }

        

    }

     

     

    /**

     * 接收任何证书

     *

     */

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

    {

                NSLog(@"https?");

        [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

    }

    /**

     *处理SSL

     *

     */

    - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace

    {

        return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];

    }

     

     

     

    //字典转化为字符串

    -(NSString *)makeParameters:(NSDictionary *)dic

    {

        NSMutableArray *tempArray = [NSMutableArray array];

        NSArray *keyArray = [dic allKeys];

        for (NSString *key in keyArray) {

            NSString *valueString = [dic objectForKey:key];

            NSString *formattedString = [NSString stringWithFormat:@"%@=%@", key, valueString];

            [tempArray addObject:formattedString];

        }

        NSString *finalString = [tempArray componentsJoinedByString:@"&"];

        return finalString;

    }

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    拖拽组件
    css3动画 巧用label
    轮播图
    弹出框组件,可拖拽
    基于angularJS的分页功能
    身份证验证大全-javascript
    公用拖拽功能插件
    记录那些年我踩过的坑
    节流函数
    手机号码的正则表达式
  • 原文地址:https://www.cnblogs.com/dududuzhaoji/p/5732508.html
Copyright © 2020-2023  润新知