Alamofire + Combine:获取HTTP响应状态码

Alamofire + Combine: Get the HTTP response status code

我目前正在使用包含 Combine 支持的 Alamofire,并按以下方式使用它:

    let request = AF.request(endpoint)

    ...
    request
            .publishDecodable(type: T.self, decoder: decoder)
            .value()
            .eraseToAnyPublisher()

这将发布结果和 AFError 但是从订阅者的 .sink,我找不到任何地方来获取 HTTP 状态代码。在订阅者中获取状态代码的最佳方式是什么?

如果您想要响应代码,请不要使用 .value() 擦除 DataPublisher。相反,使用从各种 publish 方法中获得的 DataResponse,其中包括所有各种响应信息,包括状态代码。然后,您可以 .map 将其转换为您需要的任何类型。

对于Swift5.X和Xcode12.4 出于调试目的,您可以在 Combine 发布者 (publishDecodable()) 之前拦截响应并获取 URL 响应的一些元素,其中:

session.request(signedRequest)
    .responseJSON { response in
        print(response.request)  // original URL request
        print(response.response) // URL response
        print(response.data)     // server data
        print(response.result)   // result of response serialization
    }

简单的 MVVM 方式:

func fetchChats() -> AnyPublisher<ChatListModel, AFError> {
     let url = URL(string: "Your_URL")!
     AF.request(url, method: .get)
            .validate()
            .publishDecodable(type: ChatListModel.self)
            .value()
            .receive(on: DispatchQueue.main)
            .eraseToAnyPublisher()
}

稍后在 viewModel 中

private var subscriptions: Set<AnyCancellable> = []
// some func
      dataManager.fetchChats()
           .sink {[weak self] completion in
            guard let self = self else { return }
            switch completion {
            case .failure(let error):
                switch error.responseCode {
                case 401:
                    //do something with code
                default:
                   print(error.responseCode)
                }
                print("All errors:\(error)")
            case .finished:
                break
            }
        } receiveValue: {[weak self] message in
            guard let self = self else { return }
            self.message = message
        }
        .store(in: &subscriptions)