asp.net-core - 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 核心仅支持 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 命令中称为“数据”。
推荐阅读
- ios - iOS 本地通知和 APN:我可以用它做什么?
- sql - 将文本框更改存储在数据库中
- javascript - 过滤器和唯一的对象数组
- css - 使用 Chrome 加载页面时 CSS Snap 滚动失败
- ionic3 - Ionic 3 App 问题访问定位服务
- json - 如何访问角度模板中的嵌套 jsondata,我尝试过使用 ngFor 对我不起作用
- mysql - MySQL:“在方言 3 中添加/减去字符串” - 在数字字段上操作时出错?
- selenium - Robotframework 桌面应用程序测试设置失败
- html - 如何使用引导程序 4 将导航栏放置在粘性导航栏下方?
- azure - Azure 应用程序网关、Azure 应用程序服务和基于表单的身份验证