【发布时间】:2017-08-08 15:54:42
【问题描述】:
我有一个 C# WebAPI(我是 Web API 的新手),它工作正常,因为我可以使用 HttpClient 从 Postman 和另一个 C# 程序执行 GET 和 POST 请求。
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# 程序请求,请求的参数值始终为 null。
【问题讨论】:
-
只要使用正确的类型作为参数即可。 JSON 反序列化应该作为框架的一部分发生。此外,如果可能,请使用 WebApi 2,使用属性方法定义路由比在配置中注册它们要好得多。
-
@DarrenYoung 当您说正确的类型时,您是在谈论我想将 JSON 反序列化为的“数据”类型吗?如果是,我已经尝试将 Data 作为 Post() 方法的参数而不是字符串,但它设置了一个具有所有默认/空值的 Data 对象...
标签: c# json asp.net-web-api