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

5

我正在发起一个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请求的响应?

3个回答

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

谢谢,我猜是 "emptyResponseCodes: [200]",它的工作方式就是这样。 - user13691063
我在定义Combine响应为Empty类型时遇到了困难,AnyPublisher<Empty, AFError>不起作用,“Empty is ambiguous for type lookup”。 - Lukasz D
我的后端没有发送任何内容,返回了204代码。我得到了Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength的错误。 - Lukasz D
1
@LukaszD try Alamofire.Empty - Robert Fogash

5

在其他地方找到了答案,但它在这里也很有用。创建了一个空对象,就像这样:

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

并返回类似于以下的发布者:

-> AnyPublisher<EmptyEntity, AFError>

-2
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
                }
            }

此答案未涉及问题中的 Combine 部分,具体来说是如何在使用.publishDecodable(...)时处理空响应。 - Robin Macharg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接