2017-11-18 13 views
2

I次Asp.Net Web APIをv2のコントローラを持っている - ちょうど基本的な例として:WEBAPI受け入れJSONの問題 - ZenDesk

[HttpPost] 
    public IHttpActionResult TestPost([FromBody]string value) 
    {  
     l.TestNotify(value, "test");  
     return Ok(); 
    } 

私はAAシンプルな "Hello World" を持つコントローラにJSON要求を渡すと - 私は値を問題なく得ることができる。より複雑なJSONを使用する場合、valueパラメータは空を返します。

私は、restsharpを使ったテストプログラムで同じJSONをテストしており、正常に動作しています。ここで

が要求される:ここでは

Content-Type application/json; charset=utf-8 
Accept-Encoding gzip;q=1.0,deflate;q=0.6,identity;q=0.3 
Accept */* 
Content-Length 743 

は、JSONスニペットです:

{ 
    "ticket": { 
    "url": "", 
    "id": "", 
    "external_id": null, 
    "FromEmail": "cody", 
    "via": "Mail", 
    } 
} 

私の推測では、それは、要求の違いの間に何かを持っているということですが、明らかに何も心に来ることはありません。リクエストの内容を読むための他の方法や、上記のhttpリクエストに関する私の理解の調整が認められます。

答えて

1

を使用しないで、入力タイプのクラスを作成してください。

だから、これはクラスがどのように見えるべきかである:あなたのコントローラからstringの代わりにTicketRoot型を使用すると

public class Ticket 
{ 
    public string url { get; set; } 
    public string id { get; set; } 
    public object external_id { get; set; } 
    public string FromEmail { get; set; } 
    public string via { get; set; } 
} 

public class TicketRoot 
{ 
    public Ticket ticket { get; set; } 
} 

+0

これは完全に機能しました。何故ですか?私はすでにそれを後でデシリアライズするようにビルドされたクラスを持っていました。その違いの背景には何があるのだろうか。 –

+0

フレームワークに(デ)シリアライゼーションをさせることには多くの利点があります。例えば、あなたのコードに必要な変更をJSONの代わりにWeb APIがXMLを受け入れるようにする 'Content-Type:application/xml'ヘッダを指定することができます。また、リファクタリングの容易なテストを書くのに役立ちます。プロパティの名前を変更するだけで、すべての参照がソリューション全体で名前が変更されます。 –