本文主要是練習(xí)Moya的熟練使用
簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求
1.創(chuàng)建baseTargetType
主要是添加了baseUrl省去了每次創(chuàng)建接口都要寫的步驟
extension TargetType {
public var baseURL: URL {
return URL(string: "https://api.github.com/")!
}
}
2.創(chuàng)建接口
enum Github {
case repositories(q: String, sort: String)
}
3.拓展接口
extension Github: TargetType {
var path: String {
switch self {
case .repositories:
return "search/repositories"
}
}
var method: Moya.Method {
switch self {
case .repositories:
return .get
}
}
var parameters: [String: Any]? {
switch self {
case .repositories(let q, let sort):
return ["q": q,
"sort": sort]
}
}
var parameterEncoding: ParameterEncoding {
return URLEncoding.default
}
var task: Task {
return .request
}
var sampleData: Data {
switch self {
case .repositories:
return "".utf8Encoded
}
}
}
extension String {
var urlEscaped: String {
return self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
}
var utf8Encoded: Data {
return self.data(using: .utf8)!
}
}
參數(shù)說(shuō)明
- path 就是API的地址了(該demo完整的URL是https://api.github.com/search/repositories?q=javascript&sort=stars)
- method 請(qǐng)求的方式:get/post
- parameters API參數(shù)替梨,以Map形式提交
- parameterEncoding 參數(shù)的格式
- task 該條請(qǐng)API求的方式鸟悴,request、upload辨嗽、download
- sampleData 這個(gè)是做單元測(cè)試模擬的數(shù)據(jù),必須要實(shí)現(xiàn),只在單元測(cè)試文件中有作用
4.創(chuàng)建一個(gè)Provider
let GithubRxProvicer = RxMoyaProvider<Github>(plugins: [NetworkLoggerPlugin(verbose: true, responseDataFormatter: JSONResponseDataFormatter),
networkActivityPlugin])
private func JSONResponseDataFormatter(_ data: Data) -> Data {
do {
let dataAsJSON = try JSONSerialization.jsonObject(with: data)
let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
return prettyData
} catch {
return data //fallback to original data if it cant be serialized
}
}
let networkActivityPlugin = NetworkActivityPlugin { (change) -> () in
switch(change) {
case .ended:
UIApplication.shared.isNetworkActivityIndicatorVisible = false
case .began:
UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
}
補(bǔ)充
Moya在初始化Provider的時(shí)候可以傳入一些插件,Moya庫(kù)中默認(rèn)有4個(gè)插件稍算。
- AccessTokenPlugin 管理AccessToken的插件
- CredentialsPlugin 管理認(rèn)證的插件
- NetworkActivityPlugin 管理網(wǎng)絡(luò)狀態(tài)的插件
- NetworkLoggerPlugin 管理網(wǎng)絡(luò)log的插件
且,自己也可以創(chuàng)建plugin役拴;比如:
class RequestAlertPlugin: PluginType {
private let viewController: UIViewController
init(viewController: UIViewController) {
self.viewController = viewController
}
func willSend(request: RequestType, target: TargetType) {
//do your things
}
func didReceive(result: Result<Response, MoyaError>, target: TargetType) {
guard case Result.failure(_) = result else { return }//只監(jiān)聽(tīng)失敗
// do your things
}
}
5.使用
GithubRxProvicer.request(.repositories(q: "javascript", sort: "stars"))
.mapResponseToObject(type: Repositorie.self)
.subscribe { event in
switch event {
case .next(let data):
print(".next")
case .error(let error):
print(error)
case .completed:
print(".completed")
}
}
.disposed(by: disposeBag)
補(bǔ)充
Moya也為我們提供了很多Observable的擴(kuò)展糊探,讓我們能更輕松的處理MoyaResponse,常用的如下:
- filter(statusCodes:) 過(guò)濾response狀態(tài)碼
- filterSuccessfulStatusCodes() 過(guò)濾狀態(tài)碼為請(qǐng)求成功的
- mapJSON() 將請(qǐng)求response轉(zhuǎn)化為JSON格式
- mapString() 將請(qǐng)求response轉(zhuǎn)化為String格式
更多使用參考
可以參考這篇文章河闰,里面很詳細(xì)的介紹了moya的各種用法