Swift网络封装库Moya中文手册之Endpoints
Endpoints
Endpoint是一种半私有的数据结构,Moya用来解释网络请求的根本构成。一个endpoint储存了以下数据:
- The URL.
- The HTTP method (GET,POST,等).
- The request parameters.
- The parameter encoding (URL,JSON,自定义,等).
- The HTTP request header fields.
- The sample response (单元测试用).
Providers 将 Targets 映射为Endpoints,然后将Endpoints映射为实际的网络请求。
有两种方式使用Endpoints。
- 创建一个provider的时候,可以定义一个Target到Endpoint的映射。
- 创建一个provider的时候,可以定义一个Endpoint到
NSURLRequest
的映射。
第一种方式如下:
let endpointClosure = { (target: MyTarget) -> Endpoint<MyTarget> in
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
return Endpoint(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
}
这其实是Moya provides的默认实现。如果你需要自定义,比如你的API需要自定义参数mapping,或者在单元测试中创建一个返回非200 HTTP statuses的测试provider,可以在这里实现。
第二种方式很少使用。Moya希望使用者尽量不用关注底层实现的细节。但如果你需要, 请接着往下看。
让我们看看一个从Target到Endpoint的可变映射的示例。
From Target to Endpoint
默认情况,Endpoint
实例使用 .URL
类型的参数编码。如果需要其他编码方式,可以在配置provider时,用 Endpoint
的可选参数 parameterEncoding
来初始化你的endpointClosure
。
这里有四种编码类型:.URL
,.JSON
,.PropertyList
和.Custom
,可以直接解析成Alamofire可用的类型。这些也可以在provider的 endpointClosure
中配置。通常你只会用到 .URL
,但也可以使用任何你需要的。这是直接解析为 Alamofire parameter encodings。
你可以在闭包里为HTTP头文件添加参数。例如,我们可能想要在HTTP头文件中设置"APP_NAME"以便服务器端解析。
let endpointClosure = { (target: MyTarget) -> Endpoint<MyTarget> in
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
let endpoint: Endpoint<MyTarget> = Endpoint<MyTarget>(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
return endpoint.endpointByAddingHTTPHeaderFields(["APP_NAME": "MY_AWESOME_APP"])
}
这也意味着你可以为部分或全部endpoints提供附加参数。例如,我们需要给所有MyTarget
类型的 target添加认证token,但不包括用来进行认证的target。这就需要构造一个如下的 endpointClosure
。
let endpointClosure = { (target: MyTarget) -> Endpoint<MyTarget> in
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
let endpoint: Endpoint<MyTarget> = Endpoint<MyTarget>(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
// Sign all non-authenticating requests
switch target {
case .Authenticate:
return endpoint
default:
return endpoint.endpointByAddingHTTPHeaderFields(["AUTHENTICATION_TOKEN": GlobalAppStorage.authToken])
}
}
注:我们可以在Moya现有的方法上进行扩展,endpointByAddingParameters
和 endpointByAddingHTTPHeaderFields
允许你利用Moya现有的代码添加自定义value。
Sample responses是 TargetType
协议所必须的。然而,这只是定义了返回数据。Target-to-Endpoint映射闭包可以定义更多细节,在单元测试时非常有用。
Sample responses返回下面二者之一:
NetworkResponse
,包含一个Int
类型的status code 和NSData
类型的返回数据。NetworkError
,包含一个NSError?
类型的error。
Request Mapping
我们最初就提到,这个库不是一个封装网络请求的第三方库 - 那是Alamofire干的事。事实上,Moya是一种封装网络访问的方式,并提供编译时检查已经定义的targets。你已经知道怎样在MoyaProvider
的初始化中用 endpointClosure
把targets映射为endpoints。Moya会根据你创建的 Endpoint
实例来推动API请求。某些情况,Endpoint
必须要解析为 NSURLRequest
提供给Alamofire,这也就是 requestClosure
的作用。
requestClosure
是可选的,是修改request的根本办法。MoyaProvider.DefaultRequestMapper
使用 Endpoint
的 urlRequest
属性作为默认值。
这个闭包接受一个 Endpoint
作为参数,以及一个NSURLRequest -> Void
,在这里可以完成OAuth认证或其他事情。你想异步的调用这个闭包的时候,也可以使用第三方库认证 (example)。不需要修改request的话,可以单纯的log。
let requestClosure = { (endpoint: Endpoint<GitHub>, done: NSURLRequest -> Void) in
let request = endpoint.urlRequest
// Modify the request however you like.
done(request)
}
provider = MoyaProvider<GitHub>(requestClosure: requestClosure)
requestClosure
在修改 NSURLRequest
属性时很好用,或者提供一些请求创建之前不知道的信息,例如cookies设置。请注意前面提到的 endpointClosure
不能实现这种应用层的特定请求。
这个属性对于修改request对象非常有用,NSURLRequest
可以自定义很多属性,例如你想让禁用所有cookies:
{ (endpoint: Endpoint<ArtsyAPI>) -> (NSURLRequest) in
let request: NSMutableURLRequest = endpoint.urlRequest.mutableCopy() as NSMutableURLRequest
request.HTTPShouldHandleCookies = false
return request
}
你也在请求送达之前调用这个闭包来可以打印网络请求。
转载请注明出处http://www.cnblogs.com/liuliuliu/p/5627944.html,并注明转载。
原文链接
翻译: bibibi_liuliu
联系方式: 395985239@qq.com
Swift网络封装库Moya中文手册之Endpoints的更多相关文章
- Swift网络封装库Moya中文手册之Authentication
Authentication 安全验证可能有点复杂,一些网络请求需要认证,这里我们讨论两种常见的. Basic HTTP Auth HTTP auth是HTTP协议自带的用户名/密码验证.如果你使用的 ...
- Swift网络封装库Moya中文手册之Plugins
Plugins Moya plugins用于反映请求的发起或接收.Plugins定义为 PluginType 属性,可以在请求准备发起和接收到返回数据时回调. Built in plugins Moy ...
- Swift网络封装库Moya中文手册之Providers
Providers 使用Moya,你可以通过一个 MoyaProvider 的实例发送所有网络请求,通过枚举来指定你要访问的具体API.在配置你的 Endpoint 之后,你差不多就做好了基础配置: ...
- Swift网络封装库Moya中文手册之RxSwift
RxSwift Maya提供了一个可选的MoyaProvider 子类 - RxMoyaProvider.在网络请求完成时,我们不再使用 request() 函数的回调闭包,而是使用 Observab ...
- Swift网络封装库Moya中文手册之Targets
Targets 使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType 协议的 枚举 变量.接下来,你的app只需要处理这些targets,也就是一些你希望调用API完 ...
- EasyX库简单中文手册
EasyX库简单中文手册 作者: 时间: 2021/2/2 第一个例程 #include <graphics.h> // 图像相关库 #include <conio.h> // ...
- Swift:网络库Alamofire
一,Alamofire的说明与配置 1,什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方H ...
- swift中第三方网络请求库Alamofire的安装与使用
swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...
- Swift中文手册 -- The Basics
原文:Swift中文手册 -- The Basics 基础部分 Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 S ...
随机推荐
- [BZOJ4391][Usaco2015 dec]High Card Low Card dp+set+贪心
Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...
- java 类构造器中加入有参构造器及调用顺序【思路】
package com.ykmimi.new1; /** * * @author deadzq * */ public class AnyThing { public AnyThing() { thi ...
- The way to Go(3): 安装Go环境
Reference: Github: Go Github: The way to Go 在mac上安装Go语言初体验 安装Go环境 Go 语言开发团队开发了适用于以下操作系统的编译器: Linux F ...
- C语言优先级
条件1 && 条件2,如果条件1为假,则条件2语句不执行,因为能判断该表达式为假 条件1 || 条件2,如果条件1为真,则条件2语句不执行,因为能判断该表达式为真 优先级 运算符 名称 ...
- Hadoop 部分截图
- css3转盘
此效果涉及到 : 1. css 画图形 2. css3 动态效果 3. 贝塞尔曲线 用法 <style> .lds-hourglass { display: inline-block; p ...
- Codeforces 101487E - Enter The Dragon
101487E - Enter The Dragon 思路:做的时候两个地方理解错了,第一个事我以为龙吸了水,水就干了,其实龙是在下雨之前吸的,下雨时湖水又满了,所以湖水永远不会干:第二个是以为只要找 ...
- CSS sprites(css 精灵):将小图标整合到一张图片上
一.什么是css sprites css sprites直译过来就是CSS精灵.通常被解释为“CSS图像拼合”或“CSS贴图定位”.其实就是通过将多个图片融合到一张图里面,然后通过CSS backgr ...
- LeetCode--203--删除链表中的节点
问题描述: 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3 ...
- mysql查询出来的某一列合并成一个字段
查询所有用户及角色,一个用户会有多个角色 select u.*,sr.* from users u left join sys_user_role sur on sur.userCode=u.id l ...