在C#mvc中接收RESTClient POST JSON-Body并将其转换为可用数据

时间:2014-06-25 13:41:53

标签: c# asp.net-mvc json http post

我有一个C#网站和Web API,以及一个移动Android应用程序。在移动Android应用程序中,我想将带有List<Integer>List<Double>long的HttpPost发送到C#Web API,并在C#Web API中将其转换回{{ 1}},List<int>List<decimal>

Android应用程序的发送部分完成得非常快,因为我之前已经这样做了。但是在接收C#Web API端,我遇到了很多麻烦。

在其中一个Web API控制器中,我添加了以下方法:

long

现在我正在使用FireFox&#39; RESTClient插件发送这些HttpPOST:

[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders([FromBody] STILL_UNDETERMINED parameter)
{
    // TODO: Convert given parameter to usable List<int>, List<decimal> and long
}

我最终会在上面的方法中调试它,但现在我需要将它转换为List,List和long。

所以,我的问题:

我应该为该方法使用哪个参数?我已尝试过:

  • Method: POST http://localhost:54408/api/orders/save Header: Content-Type application/x-www-form-urlencoded Body: {"newPrices":[0.4,7.4],"productIds":[20,25],"dateInTicks":1402459200000} (始终为空);
  • string(因某些未知原因取代JObject的所有[,导致::" {";
  • { "{\"newPrices\":": { "0.4,7.4],\"productIds\":": { "20,25],\"dateInTicks\":1402459200000}": "" } } }(我无法做任何事情,因为它转换为看似空的dynamic

我应该如何将此参数转换为objectList<int>List<decimal>

  • 我尝试过创建一个自定义对象(见下文),并使用各种不同的方法来填充它们,许多人在这里列出所有内容,都没有结果(主要是因为参数已经错误):< / LI>

自定义对象:

long

理论上看起来很简单:

  • 从FireFox发送一个HttpPOST&#39; RESTClient插件
  • 在API控制器中有一个接收它的方法(这已经花了很长时间,并且必须使用Data { public List<int> productIds { get; set; } public List<decimal> newPrices { get; set; } public long dateInTicks { get; set; } } 对MapHttpRoutes进行一些更改。)
  • 将您从Body收到的参数转换为可用数据(我现在卡住的部分......)

看起来很简单,但我无法在C#中使用它。在Java中,我会在不到30分钟的时间内完成这项工作,我可以通过Google-ing找到很多有用的答案,但是我谷歌的C#HttpPOSTs我只得到结果从C#发送HttpPOSTs,或者从发送HttpPOST后的流中读取响应。没有关于从C#mvc中的actions方法接收HttpPOST的JSON主体..

PS:我的Config文件中有以下内容只接收JSON格式的响应,可能是出了问题。

[HttpPost]

2 个答案:

答案 0 :(得分:1)

将JSON数据发布到MVC操作时,您需要将Content-Type标头指定为application/json。如果不这样做,如果您传递的不是标准表单集,那么模型将始终为null。

[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders(Data model)
{
   //model is populated, and you have access to ModelState
}

public class Data
{
    // the JSON to Model mapper match is case-insensitive
    public List<int> ProductIds { get; set; }
    public List<decimal> NewPrices { get; set; }
    public long DateInTicks { get; set; }
}

发布数据:

{"newPrices":[0.4,7.4],"productIds":[20,25],"dateInTicks":1402459200000}

答案 1 :(得分:0)

因此,您应该能够将其作为模型对象传递。首先设置模型类:

public class Order
{
    public List<int> productIds { get; set; }
    public List<decimal> newPrices { get; set; }
    public long dateInTicks { get; set; }
}

然后设置您的操作以使用模型绑定到:

[HttpPost]
public ActionResult SaveOrders(Order order)
{
    //TODO: Save...
}

然后,您所要做的就是确保将其作为与Order模型匹配的JSON对象发送。所以post值将是[“productIds”],[“newPrices”]等等,它会自动填充SaveOrders上的order参数。这可以很好地理解这些事情如何结合起来:

http://weblogs.asp.net/nmarun/asp-net-mvc-2-model-binding-for-a-collection