我使用JSON Placeholder post api在SWIFT中使用泛型和结果类型发出HTTP POST请求.以下是我用于请求和响应的可编码 struct .对于此接口,响应和请求都相同.

enum AddPostModel{
    struct AddPostRequest: Codable{
        let title: String
        let body: String
        let userId: String
        let id: String
    }
    struct AddPostResponse: Codable{
        let title: String
        let body: String
        let userId: String
        let id: String
    }
}

以下是我使用URLSession异步/等待、泛型和结果类型的POST请求代码.

func sendPostRequest<T: Codable>(url: String,responseType: T.Type,params: T) async -> Result<T,Error>{
        do{
            let session = URLSession(configuration: .default)
            guard let url = URL(string: url) else{return .failure(HTTPError.invalidUrl) }
            var request = URLRequest(url: url)
            request.httpMethod = HTTPMethods.POST.method
            
            
            let jsonData = try JSONEncoder().encode(params)
            request.httpBody = jsonData
            
            let (data,response) = try await session.data(for: request)
            guard let urlResponse = response as? HTTPURLResponse , (200...299).contains(urlResponse.statusCode)
              else{ return .failure(HTTPError.failedResponse)}
            
            
            let jsonResponse = try JSONDecoder().decode(responseType.self, from: data)
            return .success(jsonResponse)
            
        }
        catch{
            return .failure(error)
        }
    }

在这里,我调用Post方法

 func addPost(params: AddPostModel.AddPostRequest) async -> Result<AddPostModel.AddPostResponse,Error>{
        
        return await service.sendPostRequest(url: Constant.BASE_URL + "/" + HomeEndPoints.posts.path, responseType: AddPostModel.AddPostResponse.self, params: params)
    }

当我try 构建时,在sendPostRequest方法的params参数中得到以下错误

无法将类型AddPostModel.AddPostRequest的值转换为预期的参数类型AddPostModel.AddPostResponse

推荐答案

您对请求和响应都使用相同的通用T,这是不可能的.泛型参数意味着带有可选约束的占位符类型,这些约束将在编译时被替换,并且它们不能是同一上下文中的两个不同类型.为请求参数声明另一个泛型类型(如U)可以解决此问题.

func sendPostRequest<T: Codable, U: Codable>(url: String, responseType: T.Type, params: U) async -> Result<T, Error> {
    ...
}

Json相关问答推荐

2020-12年草案中的Json列举模式

如何在使用GO时检测JSON中不需要的字段?

kotlinx-serialization:如何将具有不同类型对象的JsonArray转换为同一个Class

如何创建可由Gin序列化到json的排序键值映射?

如何在Swift中使用JSON编码器的泛型

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

如何强制仅有一个元素的数组在JSON中生成方括号

JOLT - 如果对象内部存在键,则将对象移动到数组

使用 JQ 从文件中删除重复的 JSON 块

如何为包含一些固定值并可能具有其他附加值的数组字符串创建数组 json 架构

自定义将 struct 解组为切片映射

在循环中将变量添加到 bash 数组

如何将西里尔字母转换为 utf16

序列化为json时如何忽略空列表?

如何在 MVC4 中将 Json 字符串输出为 JsonResult?

将 CoffeeScript 项目转换为 JavaScript(不缩小)?

TypeError: b'1' 不是 JSON 可序列化的

Retrofit2.0 得到 MalformedJsonException 而 json 似乎正确?

处理 HTTP 请求正文中的可选 JSON 字段

如何使用 Gson 将 JSONArray 转换为 List?