将HTTPS请求封装在一个类里面,方便调用(前提是在项目里面要导入AFNetworking第三方库)
.h文件
#import
#import "AFNetworking.h"
@interface YDHTTPSManager : NSObject
/**
* 发送一个HTTPS的GET请求
* @param url 请求路径
* @param params 请求参数
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
*/
+ (void)GET:(NSString *)URLString parameters:(id)parameters success:(void(^)(id responseObject))sucess failure:(void(^)(NSError *error))failure;
/**
* 发送一个HTTPS的POST请求
* @param url 请求路径
* @param params 请求参数
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
*/
+(void)post:(NSString *)UrlString params:(NSDictionary *)params success:(void (^)(id json))success failure:(void(^)(NSError *error))failure;
/**
* 发送一个HTTPS的POST请求(上传图片)
* @param url 请求路径
* @param params 请求参数
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
*/
+(void)post:(NSString *)UrlString params:(NSDictionary *)params formData:(void (^)(idformData))block prodress:(void(^)(NSProgress *uploadProgress))progress success:(void (^)(id json))success failure:(void(^)(NSError *error))failure;
.m文件
#import "YDHTTPSManager.h"
#import "AFNetworking.h"
@implementation YDHTTPSManager
+ (void)GET:(NSString *)URLString parameters:(id)parameters success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure{
AFHTTPSessionManager *manger = [AFHTTPSessionManager manager];
// 设置网络请求超时时间
manger.requestSerializer.timeoutInterval = 10;
[manger.securityPolicy setAllowInvalidCertificates:YES];
// https ssl 验证。
[manger setSecurityPolicy:[self customSecurityPolicy]];
// 请求
manger.requestSerializer=[AFJSONRequestSerializer serializer];
// 响应( 返回格式 )
manger.responseSerializer = [AFHTTPResponseSerializer serializer];
NSString *encoded = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[manger GET:encoded parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//如果请求成功的话将responseObject保存在sucess Block中
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if(failure) {
failure(error);
}
}];
}
+(void)post:(NSString *)UrlString params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure{
AFHTTPSessionManager *manger = [AFHTTPSessionManager manager];
// 设置网络请求超时时间
manger.requestSerializer.timeoutInterval = 10;
[manger.securityPolicy setAllowInvalidCertificates:YES];
// https ssl 验证。
[manger setSecurityPolicy:[self customSecurityPolicy]];
// 请求
manger.requestSerializer=[AFJSONRequestSerializer serializer];
// 响应( 返回格式 )
manger.responseSerializer = [AFHTTPResponseSerializer serializer];
// NSString *encoded = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[manger POST:UrlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//如果请求成功的话将responseObject保存在sucess Block中
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
if (success) {
success(result);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if(failure) {
failure(error);
}
}];
}
+(void)post:(NSString *)UrlString params:(NSDictionary *)params formData:(void (^)(id))block prodress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 设置网络请求超时时间
manager.requestSerializer.timeoutInterval = 10;
[manager.securityPolicy setAllowInvalidCertificates:YES];
// https ssl 验证。
[manager setSecurityPolicy:[self customSecurityPolicy]];
// 请求 manager.requestSerializer=[AFJSONRequestSerializer serializer];
// 响应( 返回格式 )
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:UrlString parameters:params constructingBodyWithBlock:^(id_Nonnull formData) {
if (block) {
block(formData);
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
if (progress) {
progress(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//如果请求成功的话将responseObject保存在sucess Block中
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
if (success){
success(result);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if(failure){
failure(error);
}
}];
}
https ssl 验证。
//https ssl 验证。
+ (AFSecurityPolicy *)customSecurityPolicy {
// 先导入证书 证书由服务端生成
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"wnwHTTPS" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
// NSLog(@"cerData = %@",cerData);
// AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil];
return securityPolicy;
}