2017-08-08 132 views
1

我有一个C#WebAPI(我是web API的新手),它可以正常工作,因为我可以执行GET & Postman和另一个使用HttpClient的C#程序的POST请求。将JSON嵌套对象传递到Post()方法 - C#WebAPI

POST方法是“工作”,因为我把一个断点放入它来检查它是否在我发送POST请求时触发它的代码。

“另一个C#程序”负责从数据库中读取一些数据,将其序列化(使用JSON.Net)&将其发送到Web API。

在Web API中,我想使用JSON序列化对象(其中包含嵌套对象)来重建序列化和发送之前所具有的同一个对象。每个用于创建此对象的类都存在于webAPI程序中。

我认为我只需要接收JSON字符串,然后将其反序列化到我的对象,但我不会获得这个字符串,而是将'null'作为post参数。

我的代码:

的WebAPI配置

public static class SHPC_APIConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "ShPcAPI", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new {id = RouteParameter.Optional} 
     ); 

     // Configure JSON formatter 
     var jsonFormatter = config.Formatters.JsonFormatter; 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    } 
} 

控制器

public class DataController : ApiController 
{ 
    public string Get() 
    { 
     return "Hello world!"; 
    } 

    public HttpResponseMessage Post([FromBody] string value) 
    { 
     var data = JsonConvert.DeserializeObject<Data>(value); 
     Console.WriteLine(value != string.Empty ? "OK" : "KO"); 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

执行GET请求的作品,我得到我期望的答案。无论我从Postman还是从其他C#程序请求。

但是,当我尝试执行POST请求时,请求的参数值始终为空,无论我要求从Postman还是从我的其他C#程序。

+0

只需使用正确的类型作为参数即可。 JSON反序列化应该作为框架的一部分发生。另外,如果可能的话使用WebApi 2,使用属性方法定义路由而不是在config中注册路由更好。 –

+0

@DarrenYoung当你说出正确的类型时,你是在谈论我想将JSON反序列化的类型“数据”?如果是这样,我已经试图期望数据作为Post()方法的参数而不是字符串,但是它将Data对象设置为所有默认值/空值... – Arnaud

回答

2

在你WebApiConfig文件到App_Start尝试把这个在注册功能:

var settings = 
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 

这将序列化JSON所有的答复。

+0

非常感谢您的理解!你知道为什么我在注册函数中的jsonFormatter var不能完成这项工作吗? – Arnaud

+0

这是因为它可能是试图返回一个JSON到一个XML响应 –

+0

好吧,非常感谢您的答复我被困在这个小时。 – Arnaud