2017-11-18 120 views
2

我有以下Asp.Net的Web API V2控制器 - 就像一個基本的例子:的WebAPI接受Json的問題 - 的Zendesk

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

當我通過JSON請求與AA簡單的 「Hello world」 控制器 - 我能夠得到沒有問題的價值。當我使用更復雜的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,而是爲輸入類型創建一個類。

因此,這是類應該什麼樣子:

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; } 
} 

然後使用TicketRoot型,而不是從string控制器。

+0

完美運作。這是爲什麼?我已經有了一個課程,可以在以後對其進行反序列化。我不知道背後的原因是什麼。 –

+0

讓框架做(de)序列化有很多好處。例如,您可以指定'Content-Type:application/xml'標頭,這會使您的Web API接受XML而不是JSON,而無需對代碼進行任何更改。它還可以幫助您編寫易於重構的測試,您只需重命名該屬性,並且所有引用都將在整個解決方案中重命名。 –