在iOS中构造Moya TargetType [英] Construct Moya TargetType in iOS

查看:378
本文介绍了在iOS中构造Moya TargetType的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的项目中将Moya与RxSwift一起使用

I'm trying to use Moya with RxSwift in my project

我正面临网址包含?"的问题

I'm facing the problem with url contain "?"

我创建的此TargetType

This TargetType I have create

private extension String {
    var URLEscapedString: String {
        return self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
    }
}

enum TMDb {
    case discoverMovieList(page: Int)
    case discoverMovieDetail(moive: Movie)
}

extension TMDb: TargetType {
    var baseURL: URL { return URL(string: BASE_URL)! }

    var path: String {
        switch self {
        case .discoverMovieList(page: let page):
            return "discover/movie?api_key=\(API_KEY)&sort_by=release_date.desc&page=\(page)"
        }
    }
    var method: Moya.Method {
        return .get
    }
    var parameters: [String: Any]? {
        return nil
    }
    var sampleData: Data {
        switch self {
            case .discoverMovieList(page: _):
                return "test".data(using: .utf8)!
            case .discoverMovieDetail(moive: _):
                return "test1".data(using: .utf8)!
        }
    }
    var task: Task {
        return .request
    }
    var parameterEncoding: ParameterEncoding {
        return URLEncoding.default
    }

}

问题是当我发出请求时.网址路径返回不正确

The problem is when I make the request. The url path return is somehow not correct

这是我从控制台获得的网址

This is the url i got from console

Optional("https://api.themoviedb.org/3/discover/movie%3Fapi_key=58da429caf2e25e8ff9436665e2f0e36&sort_by=release_date.desc&page=1")

但是正确的应该是

https://api.themoviedb.org/3/discover/movie?api_key=58da429caf2e25e8ff9436665e2f0e36&sort_by=release_date.desc&page=1

处理?"时出了点问题. (它变成了网址中的%3F"字符.如何使它正常工作?

There something wrong when handle the "?" (it become %3F" character in the url. How can we make it work normally?

这就是我给我的莫亚打电话的方式

This is how I call my Moya

let provider: RxMoyaProvider<TMDb>
    let persistentContainer: PersistentContainer

    func discoverMoiveList(for page: Int) {
        self.provider.request(TMDb.discoverMovieList(page: 1)) { (result) in
            print(result.value?.request?.url?.absoluteString ?? "no url")

        }
    }
}

推荐答案

您应该在?之后传递任何内容.作为参数,Moya通过这种方式知道如何正确构造URL.

You should pass anything after the ? as parameter, this way Moya knows how to construct the URL correctly.

  var path: String {
    switch self {
    case .discoverMovieList(page: let page):
        return "discover/movie"
    }
}
var method: Moya.Method {
    return .get
}
var parameters: [String: Any]? {
     switch self {
     case .discoverMovieList(page: let page):
       return "["api_key":"\(API_KEY)",
                "sort_by":"release_date.desc",
                "page":page]"
}
}

这篇关于在iOS中构造Moya TargetType的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆