C# 类型对象作为 Post 方法的有效负载

标签 c#

我们可以将 C# 类型对象上传到 Post 方法吗?

    [HttpPost]
    [Route("SendModelPayload")]
    public async Task<IActionResult> SendModelPayload([FromBody] Type type)
    {
        // Do some stuff
        return Ok("test");
    }

但是,这里的类型为空。

客户端代码:

        HttpClient httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri(@"http://localhost:5000");

        var res = httpClient.PostAsJsonAsync(@"/api/ModelPayload/SendModelPayload", 
        typeof(Student)).Result;

任何想法,提前致谢!!

最佳答案

将数据传输到 REST API 时,您需要记住,客户端和服务器在技术方面基本上不相关,因此使用许多编程语言支持的共同点。在您的情况下,可能有一个 .NET 客户端和一个 .NET 服务器,但很可能 Javascript 客户端调用不知道 Type 类的 API。即使您有 .NET 客户端和 .NET 服务器,客户端也可能发送服务器不知道的类型。

因此,您需要找到一个受各种编程环境支持且足够灵活的共同点,以应对客户端发送的数据而服务器无法映射到类型的情况。

一种方法是不直接传输Type,而是将类型名称作为字符串传输。然后服务器可以尝试直接加载类型。如果可以找到该类型,则可以使用该类型,如果没有,它将返回 BadRequestResult 以通知客户端无效数据。

[HttpPost]
[Route("SendModelPayload")]
public async Task<IActionResult> SendModelPayload([FromBody] string typeName)
{
    // Try to load type
    var type = Type.GetType(typeName);
    if (type == null)
        return BadRequest();
    // Do some stuff
    return Ok("test");
}

客户端将发送类型名称而不是实际类型,例如

var res = httpClient.PostAsJsonAsync(@"/api/ModelPayload/SendModelPayload", 
    typeof(Student).AssemblyQualifiedName).Result;

通过传输AssemblyQualifiedName,类型名称非常具体,因此服务器需要能够加载完全相同的类型,但如果无法加载该类型则会失败。

关于C# 类型对象作为 Post 方法的有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73697957/

相关文章:

c# - 避免循环生成可为空的集合,提高性能

c# - 在 Windows Phone 中生成 SHA1 散列会输出不同的散列

c# - 获取 Entity Framework 核心 1.1 的空异常

c# - 如何在 C# 对象中表达数组类型

c# - 如何增加 Asp .Net MVC 5 中的 session 超时时间?

c# - 找不到类型或命名空间名称 'ApplicationUser'

c# - 无法在邮件标题 C# 中添加回复

c# - 如何在源数据更改时更新数据绑定(bind)组合框?

c# - 为什么 C# 中的类没有循环布局问题?

c# - 设置属性时换出事件的最优雅方法是什么?