首页 > 解决方案 > AspNetCore 无法在 POST 操作中获取有效负载的值

问题描述

试图获得一个简单的后端点来读取数据。我似乎无法弄清楚如何完成将 post 有效负载绑定到方法参数的简单任务。

[Route("[controller]")]
[ApiController]

public class TestController : ControllerBase
{
    [HttpPost]
    public object Post(string data)
    {
        return Ok();
    }
}

我在 Ok() 上有一个断点。我正在使用 cURL 进行测试。

我试过这个命令 curl -d data:"hello" -X POST http://localhost:80/test 和这个命令 curl -d "hello" -X POST http://localhost:80/test

data参数在断点处始终为空。

如果我将 [FromBody] 添加到参数:

public object Post([FromBody] string data)
{
    return Ok();
}

断点永远不会到达,asp net core 内部返回 400 - 输入无效。但它没有记录任何关于输入无效的原因。

标签: asp.net-corecurlpost.net-corehttp-post

解决方案


默认情况下,ASP .net 核心仅支持 POST 中的 json 有效负载。

由于您尝试发送纯文本,因此您需要从请求中手动获取有效负载。开箱即用不支持绑定。

这是获取包含纯文本的已发布文件的解决方案。

例如。curl -F data=@test.txt -X POST http://localhost:80/test

首先删除string data参数。

将此方法添加到您的控制器:

    private string GetPostedFile(string fileName)
    {
        IFormFile data = Request.Form.Files[fileName];
        var bytes = new byte[data.Length];
        var result = data.OpenReadStream().ReadAsync(bytes).Result;
        return System.Text.Encoding.Default.GetString(bytes);
    }

现在您可以获取数据,在您的 POST 处理程序中引用 GetPostedFile 方法,如下所示:

[HttpPost]
public object Post()
{
    string data = GetPostedFile("data");
    return Ok();
}  

这将获得您发布的文件的值,在 curl 命令中称为“数据”。


推荐阅读