Alamofire 发布可解码

Alamofire publish decodable

我有一个这样的 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{[=10=] 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)

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

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

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

其中 BackendError 封装了从后端 return 获取的信息。然后你可以映射来自 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: [=11=]) }
            return NetworkError(initialError: error, backendError: backendError)
        }
    }

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