Asp.net-Core-2.0
在 Web API .NET Core 中接受 x-www-form-urlencoded
我有一個 .NET Core Web API,當我嘗試向它發布一些包含一些 json 的數據時,它返回 415 Unsupported Media Error。以下是 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 中執行良好,我能夠擷取和處理上面顯示的文章。
[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...
對於
PlayerPackage,請求應該發送一個PlayerPackage Json Object,根據您的描述,您無法控制從其他地方發布的請求。對於請求,它的類型是 application/x-www-form-urlencoded,它會發送**{“status”:“incomplete”,“score”:""}字元串格式的數據,而不是 Json 對象。如果您想接受{“status”:“incomplete”,“score”:""}**,我建議您更改如下方法,然後將字元串轉換為 Object by
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); }
嘗試使用
[FromForm]而不是[FromBody].public IActionResult Post([FromForm] PlayerPackage playerPackage)
FromBody> 從 JSON 綁定FromForm> 從表單參數綁定您也可以
[FromBody]完全刪除並試用它。因為您期望 form-urlencoded 應該告訴它綁定到對象。