IOS 13 网络请求和Moya框架

server/2024/9/23 5:58:04/

允许HTTP请求

从iOS9开始,推荐使用HTTPS,如果使用的HTTP,默认情况下会出现如下错误:

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

这是因为iOS9引入了新特性App Transport Security (ATS),他要求App内网络请求必须使用HTTPS协议,也就是默认情况下,不允许发送HTTP请求,但我们这里后端实现的API是HTTP协议,虽然后端课程中讲解了HTTPS,但为了降低课程难度,这里我们先允许HTTP请求,后面在讲解HTTPS请求。

解决方法是要么改为HTTPS,要么声明可以使用HTTP,可以声明部分使用HTTP,也可以所有;但需要说明的是如果APP内所有请求都是HTTP,那么如果要上架App Store的时候基本都会被拒。

源码方式更改

这种方式是直接编辑配置文件。打开工程下的Info.plist文件,在文件dict标签内添加如下内容:

<key>NSAppTransportSecurity</key>  
<dict>  <key>NSAllowsArbitraryLoads</key><true/>  
</dict>

意思是允许使用HTTP,当然还可以配置指定的域名使用HTTP,我们这里是配置所有域名。

可视化更改

通过可视化编辑器。找到:

App Transport Security Settings,下面的Allow Arbitrary Loads设置为Yes。

网络框架

OC常用的是AFNetworking,Swift常用的Moya,本文使用Moya网络请求框架。

添加依赖

# 网络请求框架
# https://github.com/Moya/Moya
pod 'Moya'

还不了解如何使用 CocoaPods 管理依赖的,建议先看前面的文章:IOS 01 CocoaPods 安装与使用 

添加完依赖后,看一下Pods文件夹里面是否添加成功。 

配置请求相关地址 

//
//  Config.swift
//  MyCloudMusic
//
//  Created by jin on 2024/8/22.
//import Foundationclass Config {/*** 是否是调试模式* 是因为单独定了一个变量更方便,不用真正更改项目的编译模式*/static let DEBUG = true/// BaseURLstatic let ENDPOINT = "http://my-cloud-music-api-sp3-dev.ixuea.com/"/*** 资源端点*/static let RESOURCE_ENDPOINT = "http://course-music-dev.ixuea.com/"
}

定义Service

框架文档推荐使用枚举,本文也使用枚举进行定义。 

//
//  DefaultService.swift
//  网络API
//
//  Created by jin on 2024/8/22.
//import Foundation//导入网络框架
import Moyaenum DefaultService{case ads(position:Int)case sheets(size:Int)case register(data:User)
}// MARK: - 实现TargetType协议
extension DefaultService : TargetType{/// 返回网址var baseURL: URL {return URL(string: Config.ENDPOINT)!}/// 返回每个请求的路径var path: String {switch(self){case .ads(_):return "v1/ads"case .sheets:return "v1/sheets"case .register:return "v1/users"default:fatalError("DefaultService path is null")}}/// 请求方式var method: Moya.Method {switch(self){case .register:return .postdefault:return .get}}/// 请求的参数var task: Moya.Task {switch(self){case .ads(let position):return ParamUtil.urlRequestParamters(["position":position])case .sheets(let size):return ParamUtil.urlRequestParamters(["size":size])default://不传递任何参数return .requestPlain}}/// 请求头var headers: [String : String]? {var headers:Dictionary<String,String> = [:]return headers}}

 定义参数相关工具类

//
//  ParamUtil.swift
//  参数相关工具类
//
//  Created by jin on 2024/8/22.
//import Foundationimport Moyaclass ParamUtil{/// 返回URL编码的参数////// - Parameter parameters: <#parameters description#>static func urlRequestParamters(_ data:[String:Any]) -> Task {return .requestParameters(parameters: data, encoding: URLEncoding.default)}
}

请求接口

let provider = MoyaProvider<DefaultService>()
provider.request(.sheets(size: VALUE10)) { result inprint(result)switch(result){case let .success(response):let data = response.data // Data, your JSON response is probably in here!let statusCode = response.statusCode // Int - 200, 401, 500, etclet dataString = String(data: data, encoding: .utf8)!print("request network success \(statusCode) \(dataString)")case let .failure(error):print("request network error \(error)")}
}

至此,简单的实现了Moya框架的依赖和使用。 


http://www.ppmy.cn/server/105087.html

相关文章

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

linux文件——用户缓冲区——概念深度探索、IO模拟实现

前言&#xff1a;本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题&#xff0c; 然后通过分析问题&#xff0c; 将缓冲区的概念与原理一步一步地讲解。同时&#xff0c; 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf&#xff0c; fprintf接口&#xff0c…

2024河南省萌新联赛第(六)场 郑州大学

文章目录 2024河南省萌新联赛第&#xff08;六&#xff09;场 郑州大学A.装备二选一&#xff08;一&#xff09;题意&#xff1a;思路&#xff1a;AC代码&#xff1a; B.百变吗喽题意&#xff1a;思路&#xff1a;AC代码&#xff1a; C.16进制世界题意&#xff1a;思路&#xf…

牛客C++核心面试题总结

前言 总结了C核心面试题&#xff0c;一共80道&#xff0c;供大家学习。 下载链接:https://github.com/mco0308/-C- 以下是目录&#xff1a; # 目录## 一、链表1. 反转链表 ..................................................... 1 2. 链表内指定区间反转 ...............…

深入解析:Objective-C中的NSDistributedNotificationCenter分布式通知机制

标题&#xff1a;深入解析&#xff1a;Objective-C中的NSDistributedNotificationCenter分布式通知机制 在Objective-C的世界中&#xff0c;NSDistributedNotificationCenter是一个强大的工具&#xff0c;它允许应用程序在不同的进程之间发送和接收通知。这种分布式通知机制对…

C++设计模式2:代理模式

实际上&#xff0c;代理模式就是委托类通过代理类来控制实际对象的访问权限。 比如老板就是委托类&#xff0c;助理就是代理类&#xff0c;由于不是每一个客户都可以面见老板&#xff0c;所以助理要帮助老板筛选那些可以面见老板的客户。又比如一款游戏&#xff0c;游戏的关卡就…

AI 时代的编程革命:如何在挑战中抓住机遇?

AI 发展对软件开发的挑战与机遇&#xff1a;程序员应对策略 随着人工智能&#xff08;AI&#xff09;技术的快速进步&#xff0c;软件开发领域正经历深刻的变革。AI 不仅改变了编程的方式&#xff0c;也对程序员的职业发展产生了重要影响。在这个背景下&#xff0c;我们既看到…

log_linux_ubuntu_日志

makefile添加打印日志 makefile添加打印日志_makefile 打印日志-CSDN博客 使用tee记录编译日志 使用tee记录编译日志_optee 日志输出-CSDN博客 标准C库函数 标准C库函数之perror()、strerror()&#xff0c;以及他们之间各种的优缺点&#xff08;打印错误信息&#xff09;-…