对于自动响应对象序列化,我正在使用Alamofire的GitHub页面上提供的示例(有一些修改)。它适用于非Void调用。但我的后端API有一些调用只返回httpStatus代码,如果成功调用则没有响应主体,或者如果服务器端存在异常则返回正文中的JSON。我正在考虑DataRequest的另一个扩展,如果httpStatusCode == 200将返回成功(没有数据),并返回失败,其中自定义错误对象从JSON序列化为其他statusCodes。但我不知道如何在没有数据的情况下取得成功。我真的很感激任何帮助。
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)
}
}