2017-11-18 124 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,而无需对代码进行任何更改。它还可以帮助您编写易于重构的测试,您只需重命名该属性,并且所有引用都将在整个解决方案中重命名。 –