2017-04-05 47 views
0

嗨我想在我的項目中使用Moya與RxSwiftIOS構造Moya TargetType

我面臨的問題與URL包含「?」

這TargetType的我已創建

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 
    } 

} 

問題是,當我提出的要求。 URL路徑的回報是某種不正確

這是URL我從控制檯

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「的URL字符。我們怎樣才能使它正常工作?幫助是非常感激。謝謝

更新這是我打電話給我的莫亞

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") 

     } 
    } 
} 
+0

任何人都理想? –

+0

任何人使用Moya創建端點? –

+0

我們該如何處理「?」字符? –

回答

0

的問題是不是」 ?「,這是因爲你在路徑URL中使用了可選的值,控制BASE_URL和API_KEY,它們不能是可選的值

Moya沒有問題,在這裏Moya-Logger結果爲你的提供者:

Moya_Logger: [29/04/2017 15:48:22] Request: https://api.themoviedb.org/3/discover/movie%3Fapi_key=58da429caf2e25e8ff9436665e2f0e36&sort_by=release_date.desc&page=1 
Moya_Logger: [29/04/2017 15:48:22] Request Headers: [:] 
Moya_Logger: [29/04/2017 15:48:22] HTTP Request Method: GET 
Moya_Logger: [29/04/2017 15:48:23] Response: <NSHTTPURLResponse: 0x618000220360> { URL: https://api.themoviedb.org/3/discover/movie%3Fapi_key=58da429caf2e25e8ff9436665e2f0e36&sort_by=release_date.desc&page=1 } { status code: 200, headers { 
Connection = "keep-alive"; 
"Content-Length" = 89; 
"Content-Type" = "application/octet-stream"; 
Date = "Sat, 29 Apr 2017 12:48:23 GMT"; 
Server = openresty; 
"X-RateLimit-Limit" = 40; 
"X-RateLimit-Remaining" = 39; 
"X-RateLimit-Reset" = 1493470113; 
} } 
+0

非常感謝你的回覆。但是所有BASE_URL和API_KEY都是字符串。我們如何製作非可選的網址 –

+0

可以幫助建議什麼是構建TargetType的正確方法 –

+0

您可以分享您如何稱呼您的提供商的請求? – user8783144

0

Here你有一個主題如何獲得一個可選變量沒有Opt()。我喜歡在那裏你創建一個extensionthat方式:

extension Optional { 
    func asStringOrNilText() -> String { 
     switch self { 
     case .some(let value): 
      return String(describing: value) 
     case _: 
      return "(nil)" 
     } 
    } 

} 

print(result.value?.request?.url?.absoluteString.asStringOrNilText()) 
+0

嗨我應用你的建議,但result.value?.request?.url?.absoluteString是類型字符串?編譯器抱怨字符串沒有成員asStringOrNilText –

0

你應該通過後什麼?作爲參數,這種方式莫亞知道如何正確構建URL。

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]" 
} 
}