2016-05-24 19 views
1

からのGuid POSTを読んでいない:私はそれに掲示していますコントローラのアクションは、私のようにコントローラのアクションを宣言したJSON

[Route("api/person")] 
[HttpPost] 
public async Task<IActionResult> Person([FromBody] Guid id) { ... } 

POST /api/person HTTP/1.1 
Host: localhost:5000 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c 

{ 
    "id": "b85f75d8-e6f1-405d-90f4-530af8e060d5" 
} 

私の行動がヒットしているが、Guidが、そのそれは常にGuid.Empty値(:それは私がそれを渡している値を取得していないのIE)で受け取ります。

[FromBody]の代わりにURLパラメータを使用するとうまくいきますが、代わりにhttp投稿の本文を使用したいと思います。 Web API documentationで説明したように

+0

IDは、オブジェクトではなく生のJSON文字列であってはなりませんか?だから "b85f75d8-e6f1-405d 90f4-530af8e060d5"? –

+0

はまた、文字列を渡した後、GUIDにTryParse。私は私のマシンでこれをテストするだろうが、VSがインストールされています。 –

+0

悪い考えではありません。私は携帯ではありますが、朝にテストします。 – mariocatch

答えて

4

デフォルトでは、ウェブAPIは、パラメータをバインドするために、次の規則を使用しています:

  • パラメータは、Web APIを取得しようと、「シンプル」タイプの場合、 URIからの値。単純型は、.NETプリミティブ型(int型、 BOOL、ダブルなど)、プラスのTimeSpan、日時、GUID、小数、 文字列、プラス 文字列から変換することができる型コンバータを有する任意のタイプを含みます。 (後で型コンバータの詳細。)
  • 複合タイプの場合、ウェブAPIは、メディアタイプのフォーマッタを使用して、メッセージ本体から値を読み取ろうとします。セクションで同じ記事でさらに

[FromBody]あなたがやったように、あなたが要求本体から値をバインドするために、あなたのパラメータに属性[FromBody]を追加することができますサンプルを見ることができますを使用して。サンプルを示し、この場合のリクエストボディは、生の値ではなく、JSONオブジェクトが含まれている必要があることを - しかし、ここでキャッチです。

だからあなたの場合には、あなたが2つのオプションがあります:

最初のオプションは

POST /api/person HTTP/1.1 
Host: localhost:5000 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c 

"b85f75d8-e6f1-405d-90f4-530af8e060d5" 

目のオプションは、単一のプロパティを持つ複雑なオブジェクトを提供することである代わりに、JSONオブジェクトの生の値を提供するために、あなたの要求を変更することですパラメータとして使用してください:

public class Request 
{ 
    public Guid Id { get; set; } 
} 

[Route("api/person")] 
[HttpPost] 
public async Task<IActionResult> Person([FromBody] Request request) { ... } 
関連する問題