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;
}
iOS NSURLConnection POST异步请求封装,支持转码GBK,HTTPS等的更多相关文章
- javascript 异步请求封装成同步请求
此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...
- libcurl的封装,支持同步异步请求,支持多线程下载,支持https
最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...
- iOS中POST异步请求
POST异步请求(代理) 1.遵循<NSURLConnectionDataDelegate> @interface ViewController ()<NSURLConnection ...
- iOS NSURLConnection和异步网络请求
在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (vo ...
- js 异步请求封装
1. function ajax(url, onsuccess) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ...
- iOS开发——post异步网络请求封装
IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...
- iOS: NSURLConnection详解
摘要: NSURLConnection是iOS网络编程中一个比较旧的类,在需要兼容低版本的系统时,NSURLConnection也是一个不错的选择. 一.引言 在iOS7后,NSURLSession基 ...
- flutter dio网络请求封装实现
flutter dio网络请求封装实现 文章友情链接: https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...
- 15.SpringMVC之异步请求
SpringMVC中异步请求相关组件 SpringMVC在此基础上对异步请求进行了封装.提供了AsyncWebRequest类型的request,并提供了处理异步请求的管理器WebAsyncManag ...
随机推荐
- sql 中set和select区别
基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET ...
- Leetcode: Valid Word Abbreviation
Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...
- CSS中LI圆点样式li {list-style-type:符号名称}
css中用list-style-type指定列表(lists)前面符号,如下: li {list-style-type:符号名称} 符号名称可用的值为: disc : CSS1 实心圆 circle ...
- ASPX.Net控件
简单控件 Label :显示文字,编译后的元素的为span 主要设置属性边框包括边框颜色,边框样式,边框粗细 Liteal :显示文字,编译后不会产生任何元素,一般用来从后台输出JS代码 Textbo ...
- Centos下安装nginx rpm包
1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/download.html wget http://nginx.org/packages/centos/6 ...
- docker-compose编写(英文)
原文地址:https://docker.github.io/compose/compose-file/ Compose file reference The Compose file is a YAM ...
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...
- 安卓 android ListView 数据填充
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...
- 安装Mysq方法
前言: 此方法只能借鉴,如果网友安装失败,后果自负. 借鉴的书籍<跟老男孩学Linux运维 Web集群实战> 文章所使用的Mysql:https://yunpan.cn/Oc6RkgKRF ...
- 转:django 接收页面form的post数组
<input type="text" name="input[]"> <input type="text" name=&q ...