如何从`MoyaError`获取错误statusCode?

时间:2017-01-28 15:36:04

标签: ios swift alamofire rx-swift moya

我正在使用Moya_ModelMapperRxSwiftlet provider = RxMoyaProvider<MyEndpoint>() let observable: Observable<RegistrationResponse> = provider.request(.register(firstName: "", lastName: "", email: "", password: "")).mapObject(type: RegistrationResponse.self) observable.subscribe { [weak self] (event: Event<RegistrationResponse>) in switch event { case .next(let response): print(response) case .error(let error): print(error) case .completed: break } } 来执行网络请求。 这是我的示例代码:

409

一切正常,但是当我从服务器收到例如jsonMapping(Status Code: 409, Data Length: 0)状态代码响应类型时,我不知道如何获取错误代码。 如果我打印错误,我会得到:

MoyaError

但我不知道如何通过代码获取此状态代码。错误是<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.MainActivity" > <data class="MainActivityBinding"></data> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/main"> <android.support.v4.view.ViewPager android:id="@+id/popular_movies_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.TabLayout android:id="@+id/popular_movies_tablayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" /> </android.support.v4.view.ViewPager> </RelativeLayout> </layout> ,这是一个枚举类型。这是MoyaError的source code

谢谢!

2 个答案:

答案 0 :(得分:14)

从评论中迁移

Moya错误不直接包含错误代码,它们包含MoyaResponses,而MoyaResponses又包含错误代码。

第一种情况是错误,如MoyaError

let moyaError: MoyaError? = error as? MoyaError

可选的MoyaError将包含一个可选的响应,使用可选的链接我们得到:

let response : Response? = moyaError?.response

最后,我们可以获得响应的状态代码。

let statusCode : int? = response?.statusCode

答案 1 :(得分:1)

对于具有 nil moyaError.response的用户,这是一种获取 errorCode

的方法。
 if let error = ((error as? MoyaError)?.errorUserInfo["NSUnderlyingError"] as? Alamofire.AFError)?.underlyingError as? NSError, error.domain == NSURLErrorDomain, error.code == NSURLErrorNotConnectedToInternet || error.code == NSURLErrorTimedOut || error.code == NSURLErrorNetworkConnectionLost {
                   print("not connected")
      }