1

我正在尝试改进网络层,所以我使用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 或超时响应。

有任何想法吗?

4

0 回答 0