我正在尝试改进网络层,所以我使用Moya来创建更具可扩展性的代码。
我有一个简单的请求方法(使用 Alamofire),它请求一个 JSON 对象(我使用这个theMovieDB api 作为示例。所以,这是工作代码:
class Endpoints{
func getGenres(callback: @escaping (NSDictionary?)->()){
let headers = [
"Authorization": "Bearer 1234556789123345",
"Content-Type": "application/json;charset=utf-8"
]
let parameters: [String: String] = ["api_key": "1234567890"]
let url = "https://api.themoviedb.org/3/genre/movie/list?"
Alamofire.request(url, method: .get, parameters: parameters, headers: headers).responseJSON{ (response:DataResponse<Any>) in
switch(response.result) {
case .success(_):
if response.result.value != nil{
let t: NSDictionary = response.result.value as! NSDictionary
callback(t)
}
break
case .failure(_):
print(response.result.error!)
callback(nil)
break
}
}
}
上面的代码工作得很好,但我想编写 Moya 等效结构,所以我有这个,在文档中受到强烈启发:
import Foundation
import Moya
enum MyService {
case getGenres
}
// MARK: - TargetType Protocol Implementation
extension MyService: TargetType {
var baseURL: URL { return URL(string:
"https://api.themoviedb.org/3")! }
var path: String {
switch self {
case .getGenres:
return "/genre/movie/list?"
}
}
var method: Moya.Method {
switch self {
case .getGenres:
return .get
}
}
var parameters: [String: Any]? {
switch self {
case .getGenres:
return ["api_key": "1234567890"]
}
}
var parameterEncoding: ParameterEncoding {
switch self {
case .getGenres:
return JSONEncoding.default
}
}
var sampleData: Data {
switch self {
case .getGenres:
return "".utf8Encoded
}
}
var task: Task {
switch self {
case .getGenres:
return .request
}
}
var headers: [String: String]? {
return [
"Authorization": "Bearer 1234556789123345",
"Content-Type": "application/json;charset=utf-8"
]
}
}
// MARK: - Helpers
private extension String {
var urlEscaped: String {
return self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
}
var utf8Encoded: Data {
return self.data(using: .utf8)!
}
}
使用 Moya 服务时:
let provider = MoyaProvider<MyService>()
provider.request(.getGenres) { (result) in
print(result)
}
使用 Moya 服务时,我总是收到 504 或超时响应。
有任何想法吗?