2015-11-04 28 views
1

我正在使用web-api 2和邮递员休息客户端进行测试。对象不能正确解码请求与网页api

我有它看起来像这样的方法定义:

[Route("api/bob/user")] 
[HttpPut] 
public IHttpActionResult UpdateUser(User user) 

用户对象看起来像这样:

public class User : IUser 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

public interface IUser 
{ 
    string Firstname { get; set; } 
    string Lastname { get; set; } 
} 

在邮递员我已经设置一个放置请求和内容类型设置为JSON(application/json)我在主体中指定了以下原始数据:

{ 
    "user": {"Firstname":"Bob","Lastname":"Smith"} 
} 

当我发送请求检测到对象类型但没有填充任何属性(它们全都为空),导致我认为反序列化失败。

如果我将方法签名更改为对象,则获取json字符串并将其反序列化为用户对象。如果可能,我更喜欢强打字。

我webapiconfig看起来是这样的:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
            new MediaTypeHeaderValue("text/html")); 

config.MapHttpAttributeRoutes(); 

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

我还添加了测试客户端的截图:

content type shown

+1

您在请求中使用了“Content-Type:application/json”吗? –

+0

也可以尝试在“用户用户”之前添加“[FromBody]”属性 – MajkeloDev

+0

是的,我是邮差有这个集合我已经添加了一个屏幕快照来显示这个。 –

回答

5

你不应该在把user财产。您的JSON应如下所示:

{ 
    "Firstname": "Bob", 
    "Lastname": "Smith" 
} 

为了让模型绑定器绑定到模型。

如果你希望去与你目前的JSON,你User模型应该看起来像

public class User { 
    public User User { get; set; } 
} 

还要确保您使用application/json作为内容类型。

+1

* facepalm *,你是对的,只要SO让我接受。对于那些不明白答案的人来说,json中的对象不是用户类型,所以序列化失败。 –