MoyaでGithubAPIに通信する
APIのライブラリ使ったことがなかったので何か試してみたいなと思いMoyaを使ってみることにしました。
RxSwiftもサポートしている様ですが、まずはシンプルにRxは使わずにためしてみました。
コード
接続先のAPI情報
TargetTypeに準拠させると実装が必要なメソッドができるので処理を書いていきます。
だいぶシンプルに書くことができました!今回使っていませんがテスト用のメソッドが用意されているのは便利だなと思いました。
PresenterのMock作ってテストの時はscheme切り替えて…みたいな作業が省けそうです。
import Moya
enum GithubAPI {
case user
}
extension GithubAPI: TargetType {
var baseURL:URL {
return URL(string:"https://api.github.com")!
}
var path: String {
switch self {
case .user:
//今回はお試しなので私のIDベタ書き
return "/users/harumidiv"
}
}
var method: Moya.Method {
return .get
}
//テストの際テスト用のjsonを返すことができるメソッド
var sampleData: Data {
return Data()
}
var task: Task {
return .requestPlain
}
var headers: [String : String]? {
return nil
}
}
呼び出し側
プロバイダを作ってrequestを呼ぶだけです!
つまづくことなくjsonの情報を取得することができました。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let provider = MoyaProvider<GithubAPI>()
provider.request(.user) { result in
switch result {
case let .success(moyaResponse):
do {
let data = try moyaResponse.mapJSON()
print(data)
let jsonData = try? JSONDecoder().decode(GithubUser.self, from: moyaResponse.data)
print(jsonData!.blog)
}
catch {
print("json parse失敗")
}
case let .failure(error):
print("アクセスに失敗しました:\(error)")
}
}
}
}
Json parser
本当はもっといっぱい要素があるのですがお試しなので3つだけにしました。
class GithubUser: Codable {
var avatar_url: String
var bio: String?
var blog: String
}