Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

Alamofireでのステータスコードとコンテンツタイプのハンドリング

はじめに

Alamofireではデフォルトではレスポンスの内容にかかわらず成功として処理される。

例えば下記のようなリクエストの場合、responseを取得できる。

AF.request("https://api.example.com").responseJSON { response in
    // handling response
}

この中にはURLRequestやHTTPURLResponse、Dataなどが含まれている。

サーバーからのレスポンスをそのまま返し、Alamofireではステータスコードと コンテンツタイプを見てエラーかどうかは処理されない。

ステータスコードとコンテンツタイプのハンドリング

コールバックされるクロージャのなかで自分でハンドリングするのも良いのですが、 ステータスコードとコンテンツタイプには簡単にハンドリングするための方法がAlamofireで用意されている。

ステータスコード(status code)

validate(statusCode:)メソッドを使う。 指定したステータスコード以外の場合はAFError.responseValidationFailedエラーが返される。

AF.request("https://api.example.com")
    .validate(statusCode: 200..<300)
    .responseJSON { response in
    // handling response
}

コンテンツタイプ(content type)

validate(contentType:)メソッドを使う。 指定したコンテンツタイプ以外の場合はAFError.responseValidationFailedエラーが返される。

AF.request("https://api.example.com")
    .validate(contentType: ["application/json"])
    .responseJSON { response in
    // handling response
}

デフォルト

引数なしのvalidate()メソッドを使う場合、 デフォルトのステータスコード(status code)とコンテンツタイプ(content type)をチェックしてくれる。

AF.request("https://api.example.com")
    .validate()
    .responseJSON { response in
    // handling response
}

デフォルトの値は以下の通り。

fileprivate var acceptableStatusCodes: Range<Int> { 200..<300 }

fileprivate var acceptableContentTypes: [String] {
    if let accept = request?.value(forHTTPHeaderField: "Accept") {
        return accept.components(separatedBy: ",")
    }

    return ["*/*"]
}