当前位置: 首页 > news >正文

iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求

HTTPS简单说明:
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
即HTTP下加入SSL层,HTTPS的安全基础是SSL(安全套接字层),因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
HTTPS:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
HTTPS和HTTP的区别主要为以下四点:
        https协议需要到ca申请证书,一般免费证书很少,需要交费。
       http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
        http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
        http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
简单说明:
HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的保护。
HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSign、Microsoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。
因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,这样一般在客户端是不被信任的。
所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。
使用NSURLSession示例代码:
-(void)session
{
    //1.确定请求路径
    NSString *urlStr = @"https://kyfw.12306.cn/otn/";
    NSURL *url= [NSURL URLWithString:urlStr];
    //2.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.创建session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //5.解析数据
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    //4.执行task
    [dataTask resume];
}
#pragma mark - NSURLSessionDataDelegate
//只要请求的地址是HTTPS的, 就会调用这个代理方法
//challenge:质询
//NSURLAuthenticationMethodServerTrust:服务器信任
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
    NSLog(@"%@",challenge.protectionSpace);

    if (![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"]) return;
    /*
     NSURLSessionAuthChallengeUseCredential 使用证书
     NSURLSessionAuthChallengePerformDefaultHandling  忽略证书 默认的做法
     NSURLSessionAuthChallengeCancelAuthenticationChallenge 取消请求,忽略证书
     NSURLSessionAuthChallengeRejectProtectionSpace 拒绝,忽略证书
     */

    NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}

如果是使用AFN框架,那么我们不需要做任何额外的操作,AFN内部已经做了处理,示例代码如下:

-(void)afn
{
    //1.确定请求路径
    NSString *urlStr = @"https://kyfw.12306.cn/otn/";
    NSURL *url= [NSURL URLWithString:urlStr];
    //2.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer  = [AFHTTPResponseSerializer serializer];

  //是否接受无效的证书
    manager.securityPolicy.allowInvalidCertificates= YES;
    //是否匹配域名
    manager.securityPolicy.validatesDomainName = NO;

   NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

        NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    }];
    //4.执行任务
    [dataTask resume];
}

 

转载于:https://www.cnblogs.com/liugengqun/p/5141482.html

相关文章:

  • 打印机连接常见故障
  • -----二叉树的遍历-------
  • Highcharts tooltip显示数量和百分比
  • Listen第二个参数的意义
  • 发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
  • 在Unity中实现一个简单的消息管理器
  • 重要的方法
  • Docker入门最佳实践
  • webpack 4.x 搭建项目脚手架
  • python学习第十二课
  • 用事件修饰符来修改事件
  • PHP慢慢长路之问题与解决方法(2)——用navicat导出数据库出错问题解决
  • DevOps/TestOps概念
  • 高级特性(8)- JavaBean构件
  • openpyxl read excel
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 78. Subsets
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • java多线程
  • Redis学习笔记 - pipline(流水线、管道)
  • SAP云平台里Global Account和Sub Account的关系
  • Tornado学习笔记(1)
  • vue 个人积累(使用工具,组件)
  • Vue学习第二天
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 力扣(LeetCode)56
  • 浏览器缓存机制分析
  • 前嗅ForeSpider教程:创建模板
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 设计模式走一遍---观察者模式
  • gunicorn工作原理
  • 阿里云重庆大学大数据训练营落地分享
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • !!java web学习笔记(一到五)
  • #13 yum、编译安装与sed命令的使用
  • #微信小程序:微信小程序常见的配置传值
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)(1.13) SiK无线电高级配置(六)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (笔试题)分解质因式
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (力扣)循环队列的实现与详解(C语言)
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)Linux下编译安装log4cxx
  • (转)Sql Server 保留几位小数的两种做法
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net core 依赖注入的基本用发
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution