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

Alamofire动态Proxy,报出FAILURE: Error Domain=NSURLErrorDomain Code=-999 cancelled

使用Alamofire网络框架时,项目中需要动态替换 Proxy,使用 Alamofire 代码如下:

static var requestManager = Alamofire.SessionManager()
let cfg = Alamofire.SessionManager.default.session.configuration
cfg.connectionProxyDictionary = [
    kCFNetworkProxiesHTTPEnable: true,
    kCFNetworkProxiesHTTPPort: 80,
    kCFNetworkProxiesHTTPProxy: ip
]
requestManager = Alamofire.SessionManager(configuration: cfg)
requestManager.request(...)
复制代码

connectionProxyDictionary中的Proxy,需要是动态的,随时可能变化。但是使用此方法会报出一个错误

FAILURE: Error Domain=NSURLErrorDomain Code=-999 "cancelled"

在使用Alamofire时,官方推荐使用单利来完成初始化,不然就会报出上面的错误。

抱着试试的态度使用系统的URLSession来做这件事,代码如下:

var dataTask: URLSessionDataTask?
//        curl -v "http://xxxxx/uaa/apid/member/code/get" -x "47.91.236.123:80"
        let url = URL(string: "http://xxxxx/uaa/apid/member/code/get")
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30
        configuration.connectionProxyDictionary = [
            kCFNetworkProxiesHTTPEnable: true,
            kCFNetworkProxiesHTTPPort: 80,
            kCFNetworkProxiesHTTPProxy: "47.91.236.123"
        ]
        let session = URLSession(configuration: configuration)
        dataTask = session.dataTask(with: url!) { (data, response, error) in
            print("----------------------\n")
            if let result = data {
                let str = String(data: result, encoding: String.Encoding.utf8)
                print("result \(String(describing: str))")
            }
            if let msg = error {
                print(msg.localizedDescription)
            }
            print("----------------------\n")
        }
        dataTask?.resume()
复制代码

这样居然可以完成达到这个目的,然后我们就把整个Network层换了。 /(ㄒoㄒ)/~~ 真是个蛋疼的问题!!!!


其实使用Alamofire也可以完成

  1. 需要监听你的Ip变化
  2. 变化了,就重新创建一个Alamofire实例 代码如下:
final class Network {
    static let shared: SessionManager = {
        let configuration = URLSession.default
        cconfiguration.timeoutIntervalForRequest = 30
        configuration.connectionProxyDictionary = [
            kCFNetworkProxiesHTTPEnable: true,
            kCFNetworkProxiesHTTPPort: 80,
            kCFNetworkProxiesHTTPProxy: "47.91.236.123"
        ]
        return SessionManager(configuration: configuration)
    }()
}
复制代码

关于使用动态Proxy在Alamofire的问题

相关文章:

  • NSPredicate
  • 从tcpdump抓包看TCP/IP协议
  • Linux Redhat 6.5 安装NFS服务
  • java中的Checked Exception和Unchecked Exception的区别
  • Linux常用基本命令:三剑客命令之-awk数组用法
  • 第一个hibernate程序
  • Java 学习(02)--数据类型/类型转换/键盘录入
  • Mac中显示文件夹的大小
  • 逛自己的微博,回顾曾经的那个“我”
  • 定制化vue-cli Template/webpack
  • linux常用命令之用户及用户组操作
  • Ubuntu x86-64汇编(5) 控制指令
  • DOM4J使用简介
  • Python学习之路13-记分
  • 怎样解决chm类型的文件在Windows操作系统中无法打开
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • android 一些 utils
  • angular组件开发
  • Apache的80端口被占用以及访问时报错403
  • CentOS从零开始部署Nodejs项目
  • docker-consul
  • extjs4学习之配置
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • javascript数组去重/查找/插入/删除
  • leetcode-27. Remove Element
  • maven工程打包jar以及java jar命令的classpath使用
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 动态魔术使用DBMS_SQL
  • 手写一个CommonJS打包工具(一)
  • 我感觉这是史上最牛的防sql注入方法类
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一天一个设计模式之JS实现——适配器模式
  • 做一名精致的JavaScripter 01:JavaScript简介
  • FaaS 的简单实践
  • ionic入门之数据绑定显示-1
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • !!Dom4j 学习笔记
  • # Maven错误Error executing Maven
  • #if和#ifdef区别
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $jQuery 重写Alert样式方法
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (循环依赖问题)学习spring的第九天
  • (一)80c52学习之旅-起始篇
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 常见的偏门问题
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net快速开发框架源码分享
  • .NET上SQLite的连接
  • @Documented注解的作用
  • [ NOI 2001 ] 食物链