.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;

}

iOS NSURLConnection POST异步请求封装,支持转码GBK,HTTPS等的更多相关文章

  1. javascript 异步请求封装成同步请求

    此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...

  2. libcurl的封装,支持同步异步请求,支持多线程下载,支持https

    最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...

  3. iOS中POST异步请求

    POST异步请求(代理) 1.遵循<NSURLConnectionDataDelegate> @interface ViewController ()<NSURLConnection ...

  4. iOS NSURLConnection和异步网络请求

    在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (vo ...

  5. js 异步请求封装

    1. function ajax(url, onsuccess) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ...

  6. iOS开发——post异步网络请求封装

    IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...

  7. iOS: NSURLConnection详解

    摘要: NSURLConnection是iOS网络编程中一个比较旧的类,在需要兼容低版本的系统时,NSURLConnection也是一个不错的选择. 一.引言 在iOS7后,NSURLSession基 ...

  8. flutter dio网络请求封装实现

    flutter dio网络请求封装实现 文章友情链接:   https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...

  9. 15.SpringMVC之异步请求

    SpringMVC中异步请求相关组件 SpringMVC在此基础上对异步请求进行了封装.提供了AsyncWebRequest类型的request,并提供了处理异步请求的管理器WebAsyncManag ...

随机推荐

  1. NSURLSession访问网络数据

    1.NSMutableURLRequest的设置 //创建NSMutableURLRequest对象 NSMutableURLRequest *request = [NSMutableURLReque ...

  2. mySql 注入攻击

    注入攻击 1.原理: a.只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入; b.字符串拼接和没有判断用户输入是否合法------>导致用户可以玩填字游戏-----> ...

  3. Leetcode: Android Unlock Patterns

    Given an Android 3x3 key ≤ m ≤ n ≤ , count the total number of unlock patterns of the Android lock s ...

  4. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  5. android switch语句报错:case expressions must be constant expressions

    今天无意中碰见了   case expressions must be constant expressions 的问题 写了一个 switch(item.getItemId()) { case R. ...

  6. hashmap的底层实现

    HashMap的底层实现都是数组+链表结构实现的,添加.删除.获取元素都是先计算hash值,根据hash值和table.length计算出index也就是table的数组的下标,然后进行相应的操作. ...

  7. hdu5714 拍照[2016百度之星复赛C题]

    由于船移动的速度都一样,那么对于往一个方向的船相对距离其实是不变的,我们可以把往一个方向移动的船都视作静止,并求出在哪些观测位置可以看到,很明显对于船[x,y,z],当x+z>=y-z的时候,可 ...

  8. android 设计

    引用:http://my.eoe.cn/blue_rain/archive/3631.html 1.一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案 ...

  9. Linux 环境变量PS1设置

    新建用户不显示IP和机器名 CentOS下新增加一个用户,登录进去会发现shell脚本信息没有显示用户名和主机名,反而显示的是user1@202.173.1.12 解决方案: 1.在新建用户的-目录下 ...

  10. rqt工具的使用

    安装rqt工具sudo apt-get install ros-indigo-rqtsudo apt-get install ros-indigo-rqt-common-plugins或者rosdep ...