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)
我目前正在使用包含 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)