在 Web API .NET Core 中接受 x-www-form-urlencoded
Accept x-www-form-urlencoded in Web API .NET Core
我有一个 .NET Core Web API,当我尝试 post 一些数据到它时返回 415 不支持的媒体错误,其中包括一些 json。以下是 Chrome 调试器返回的部分内容:
Request URL:http://localhost:51608/api/trackAllInOne/set
Request Method:POST
Status Code:415 Unsupported Media Type
Accept:text/javascript, text/html, application/xml, text/xml, */*
Content-Type:application/x-www-form-urlencoded
action:finish
currentSco:CSharp-SSLA:__How_It_Works_SCO
data:{"status":"incomplete","score":""}
activityId:13
studentId:1
timestamp:1519864867900
我认为这与我的控制器不接受 application/x-www-form-urlencoded
数据有关 - 但我不确定。我试过用 Consumes
装饰我的控制器,但这似乎不起作用。
[HttpPost]
[Route("api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromBody] PlayerPackage playerPackage)
{ etc..}
非常感谢任何帮助。
以下代码在 .NET 4.6.1 中运行良好,我能够捕获和处理上面显示的 posts。
[ResponseType(typeof(PlayerPackage))]
public async Task<IHttpActionResult> PostLearningRecord(PlayerPackage playerPackage)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var id = Convert.ToInt32(playerPackage.ActivityId);
var learningRecord = await _context.LearningRecords.FindAsync(id);
if (learningRecord == null)
return NotFound();
etc...
尝试使用 [FromForm]
而不是 [FromBody]
。
public IActionResult Post([FromForm] PlayerPackage playerPackage)
FromBody
> 从 JSON
绑定
FromForm
> 从表单参数绑定
您也可以完全删除 [FromBody]
然后再试用。因为您期望 form-urlencoded 应该告诉它绑定到对象。
对于 PlayerPackage
,请求应该发送一个 PlayerPackage Json 对象 ,根据您的描述,您无法控制发自其他地方。
对于请求,它的类型是application/x-www-form-urlencoded,它将发送带有{"status":"incomplete","score"的数据:""} 字符串格式而不是 Json 对象。如果你想接受 {"status":"incomplete","score":""},我建议你改变下面的方法,然后通过 Newtonsoft.Json
[HttpPost]
[Route("~/api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm] string data)
{
PlayerPackage playerPackage = JsonConvert.DeserializeObject<PlayerPackage>(data);
return Json(data);
}
我遇到了同样的问题。 FormDataCollection 没有格式化程序所需的默认构造函数。请改用 IFormCollection。
这对我有用:
[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm]IFormCollection value)
我有一个 .NET Core Web API,当我尝试 post 一些数据到它时返回 415 不支持的媒体错误,其中包括一些 json。以下是 Chrome 调试器返回的部分内容:
Request URL:http://localhost:51608/api/trackAllInOne/set
Request Method:POST
Status Code:415 Unsupported Media Type
Accept:text/javascript, text/html, application/xml, text/xml, */*
Content-Type:application/x-www-form-urlencoded
action:finish
currentSco:CSharp-SSLA:__How_It_Works_SCO
data:{"status":"incomplete","score":""}
activityId:13
studentId:1
timestamp:1519864867900
我认为这与我的控制器不接受 application/x-www-form-urlencoded
数据有关 - 但我不确定。我试过用 Consumes
装饰我的控制器,但这似乎不起作用。
[HttpPost]
[Route("api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromBody] PlayerPackage playerPackage)
{ etc..}
非常感谢任何帮助。
以下代码在 .NET 4.6.1 中运行良好,我能够捕获和处理上面显示的 posts。
[ResponseType(typeof(PlayerPackage))]
public async Task<IHttpActionResult> PostLearningRecord(PlayerPackage playerPackage)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var id = Convert.ToInt32(playerPackage.ActivityId);
var learningRecord = await _context.LearningRecords.FindAsync(id);
if (learningRecord == null)
return NotFound();
etc...
尝试使用 [FromForm]
而不是 [FromBody]
。
public IActionResult Post([FromForm] PlayerPackage playerPackage)
绑定FromBody
> 从 JSONFromForm
> 从表单参数绑定
您也可以完全删除 [FromBody]
然后再试用。因为您期望 form-urlencoded 应该告诉它绑定到对象。
对于 PlayerPackage
,请求应该发送一个 PlayerPackage Json 对象 ,根据您的描述,您无法控制发自其他地方。
对于请求,它的类型是application/x-www-form-urlencoded,它将发送带有{"status":"incomplete","score"的数据:""} 字符串格式而不是 Json 对象。如果你想接受 {"status":"incomplete","score":""},我建议你改变下面的方法,然后通过 Newtonsoft.Json
[HttpPost]
[Route("~/api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm] string data)
{
PlayerPackage playerPackage = JsonConvert.DeserializeObject<PlayerPackage>(data);
return Json(data);
}
我遇到了同样的问题。 FormDataCollection 没有格式化程序所需的默认构造函数。请改用 IFormCollection。
这对我有用:
[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm]IFormCollection value)