我有一个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#程序。
只需使用正确的类型作为参数即可。 JSON反序列化应该作为框架的一部分发生。另外,如果可能的话使用WebApi 2,使用属性方法定义路由而不是在config中注册路由更好。 –
@DarrenYoung当你说出正确的类型时,你是在谈论我想将JSON反序列化的类型“数据”?如果是这样,我已经试图期望数据作为Post()方法的参数而不是字符串,但是它将Data对象设置为所有默认值/空值... – Arnaud