web-dev-qa-db-ja.com

Web API .Net Coreでx-www-form-urlencodedを受け入れる

Jsonを含むデータを投稿しようとすると415 Unsupported Media Errorを返す.Net Core Web APIがあります。 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 data-しかし、私にはわかりません。コントローラーを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...
9
Roddy Balkan

PlayerPackageの場合、リクエストはPlayerPackage Json Objectを送信する必要があります。説明に基づいて、投稿されたリクエストを制御できませんでした別の場所。

リクエストの場合、そのタイプはapplication/x-www-form-urlencodedで、{ "status": "incomplete"、 "score": ""}Jsonオブジェクトの代わりに文字列形式で。 {"status": "incomplete"、 "score": ""}を受け入れたい場合は、以下のようにメソッドを変更することをお勧めします。次に、Newtonsoft.Jsonによって文字列をObjectに変換します

    [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);
    }
22
Tao Zhou

[FromBody]の代わりに[FromForm]を使用してみてください

public IActionResult Post([FromForm] PlayerPackage playerPackage)

FromBody-> JSONからバインドする場合

FromForm-> Formパラメーターからバインドする場合

注1:

[FromBody]を完全に削除して、試用することもできます。 form-urlencodedはオブジェクトにバインドするように指示する必要があるためです。

18
Aeseir

同じ問題がありました。 FormDataCollectionには、フォーマッターが必要とするデフォルトのコンストラクターがありません。代わりにIFormCollectionを使用してください

0
jahansha