如何使用 Alamofire 和 Combine 处理空响应?

How to handle empty response using Alamofire and Combine?

我正在发出 post 请求,但响应为空

AF.request(URL(string: "some url")!, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil)
    .validate()
    .publishDecodable(type: T.self)
    .value()
    .eraseToAnyPublisher()

其中 T 是

struct EmptyResponse: Codable {}

我遇到这个错误“无法序列化响应,输入数据为零或零长度。” 我如何使用 Alamofire 和 Combine 处理一个 post 请求,响应为空?

当您的后端 return 没有数据但没有 return 适当的 HTTP 响应代码(204 或 205)时,就会发生此错误。如果这是您后端的预期行为,您可以在设置发布者时将您的响应代码添加到可接受的空响应代码列表中:.publishDecodable(T.self, emptyResponseCodes: [200]。这也需要 T 符合 Alamofire 的 EmptyResponse 协议,或者您期望 Alamofire 的 Empty 类型作为响应。

AF.request(UrlUtils.base_url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { (response:AFDataResponse<Any>) in
                switch(response.result) {
                case .success(_):
                    // this case handles http response code 200, so it will be a successful response
                    break
                case .failure(_): 
                    break
                }
            }

在其他地方找到了答案,但在这里很有用。像这样制作空对象:

struct EmptyEntity: Codable, EmptyResponse {
    
    static func emptyValue() -> EmptyEntity {
        return EmptyEntity.init()
    }
}

并且 return 发布者是这样的:

-> AnyPublisher<EmptyEntity, AFError>