【问题标题】:Alamofire publish decodableAlamofire 发布可解码
【发布时间】:2021-03-03 15:41:09
【问题描述】:

我有一个这样的 HTTP 请求到我的服务器。

func loginUser( username: String, password: String )->AnyPublisher<UserModel, Error>{

    let url = URL( string: "\(Credentials.BASE_URL)auth/login")!
    let userSignInModel = SignInModel(username: username, password: password)
    
    return AF.request(url,
                      method: .post,
                      parameters: userSignInModel,
                      encoder: JSONParameterEncoder.default)
        .validate()
        .publishDecodable(type: UserModel.self)
        .value()
        .mapError{$0 as Error}
        .receive(on: DispatchQueue.main)
        .eraseToAnyPublisher()
}

得到这样的回应

    self.dataManager.loginUser(username: self.logInUsername, password: self.logInPassword)
        .sink { (response) in
            print( response )
            switch response {
                case .failure( let error ):
                    self.createAlert(with: error.localizedDescription,
                                     for: .loginAlert,
                                     responseCode: error.asAFError?.responseCode)
                case .finished:
                    break
            }
        } receiveValue: { (userModel) in                
            self.token = userModel.token
            self.userID = userModel.user.id
        }.store(in: &cancellableSet)

但问题是我无法从服务器获取错误消息,怎么办?

【问题讨论】:

  • 来自服务器的错误消息是什么意思?你的意思是当请求失败并且你想要解析这些失败时有一个替代体?
  • 是的,例如错误类似于状态、消息,我想获取它

标签: ios swift alamofire


【解决方案1】:

有几种不同的方法可以解析返回成功或响应值的响应。也许最简单的方法是将任何初始故障映射到您自己的错误类型,该错误类型会解析您需要的信息。例如,给定这个错误类型:

struct NetworkError: Error {
  let initialError: AFError
  let backendError: BackendError?
}

其中BackendError封装了后端返回的信息。然后你可以映射来自 Alamofire 的响应。

AF.request(url,
           method: .post,
           parameters: userSignInModel)
    .validate()
    .publishDecodable(type: UserModel.self)
    .map { response in
        response.mapError { error in
            // Check to see if it's an error that should have backend info.
            // Assuming it is, parse the BackendError.
            let backendError = response.data.flatMap { try? JSONDecoder().decode(BackendError.self, from: $0) }
            return NetworkError(initialError: error, backendError: backendError)
        }
    }

其他替代方案包括基于enum 的响应类型,用于区分您的成功和失败,或者您自己的响应序列化程序,它在内部进行错误解析。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 2015-10-08
    • 1970-01-01
    • 2018-06-28
    • 2019-12-30
    • 2017-05-11
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多