Alamofire,在Swift 3中处理可以返回带有httpError和json正文的响应的void调用

Alamofire,在Swift 3中处理可以返回带有httpError和json正文的响应的void调用,swift,deserialization,alamofire,Swift,Deserialization,Alamofire,对于自动响应对象序列化,我使用Alamofire的GitHub页面上提供的示例(经过一些修改)。它适用于非无效调用。但我的后端API有一些调用,如果调用成功,则只返回httpStatus代码,而不返回响应正文;如果服务器端出现异常,则返回JSON正文。我正在考虑DataRequest的另一个扩展,如果httpStatusCode==200,它将返回success(没有数据),并返回failure,其中包含从JSON序列化的自定义错误对象,用于其他状态代码。但我不知道如何在没有数据的情况下返回成功

对于自动响应对象序列化,我使用Alamofire的GitHub页面上提供的示例(经过一些修改)。它适用于非无效调用。但我的后端API有一些调用,如果调用成功,则只返回httpStatus代码,而不返回响应正文;如果服务器端出现异常,则返回JSON正文。我正在考虑DataRequest的另一个扩展,如果httpStatusCode==200,它将返回success(没有数据),并返回failure,其中包含从JSON序列化的自定义错误对象,用于其他状态代码。但我不知道如何在没有数据的情况下返回成功。我真的很感激任何帮助

extension DataRequest {
func responseObject<T: ResponseObjectSerializable>(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<T>) -> Void) -> Self
{
    let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
        guard error == nil else { return .failure(BackendError.network(error: error!)) }

        let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
        let result = jsonResponseSerializer.serializeResponse(request, response, data, nil)

        guard case let .success(jsonObject) = result else {
            return .failure(BackendError.jsonSerialization(error: result.error!))
        }

        if response!.statusCode != 200 {
            if let jsonWithException = jsonObject as? [String:Any]{
               return .failure(BackendError.serverException(message: "serverException, statusCode=\(response!.statusCode)", respomseBody: jsonWithException))
            }else{
                return .failure(BackendError.serverException(message: "unparseble serverException, statusCode != 200", respomseBody: nil))
            }
        }

        guard let _ = response, let responseObject = T(representation: jsonObject) else {
            return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: \(jsonObject)"))
        }

        return .success(responseObject)
    }

    return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)
}
扩展数据请求{
func responseObject(队列:DispatchQueue?=nil,completionHandler:@escaping(DataResponse)->Void)->Self
{
让responseSerializer=DataResponseSerializer{请求,响应,数据,错误
guard error==nil else{return.failure(BackendError.network(错误:error!))}
让jsonResponseSerializer=DataRequest.jsonResponseSerializer(选项:.allowFragments)
让result=jsonResponseSerializer.serializeResponse(请求、响应、数据,无)
guard case let.success(jsonObject)=结果else{
return.failure(BackendError.jsonSerialization(错误:result.error!))
}
如果响应!.statusCode!=200{
如果让jsonWithException=jsonObject为?[字符串:任意]{
return.failure(BackendError.serverException(消息:“serverException,statusCode=\(response!.statusCode)”,respomseBody:jsonWithException))
}否则{
return.failure(BackendError.serverException(消息:“unparseble serverException,statusCode!=200”,respomsebdy:nil))
}
}
保护let=response,让responseObject=T(表示:jsonObject)else{
return.failure(BackendError.objectSerialization(原因:“JSON无法序列化:\(jsonObject)”)
}
return.success(responseObject)
}
返回响应(队列:队列,响应序列化程序:响应序列化程序,completionHandler:completionHandler)
}

}

您找到解决方案了吗?如果响应正文无效,我也会遇到同样的错误!如果有任何解决方法,请与我们分享!