如何通过restful api传递部分对象(json)

Posted

技术标签:

【中文标题】如何通过restful api传递部分对象(json)【英文标题】:How to pass in part of object(json) by restful api 【发布时间】:2018-09-07 03:39:08 【问题描述】:

现在,我有一个具有三个必需属性的用户对象: 名, 姓, 创建时间 。

现在我开发了一个 API 来创建用户。我想使用 POST /api/users。

我应该传入 Jason 数据,它包含我要发布的数据。

如果我传入 FirstName=abc, LastName=abc, CreatedTime=sometime,它可以工作,但如果我错过任何属性,比如只传入 firstname=abc,它会抛出异常。

我在下面粘贴了我的方法。

    [Route("api/users")]
    public User CreateUser(User user)
    
        if (!ModelState.IsValid)
            throw  new HttpResponseException(HttpStatusCode.BadRequest);

        user.FirstName = String.IsNullOrEmpty(user.FirstName) ? "Undefined" : user.FirstName;
        user.LastName = String.IsNullOrEmpty(user.LastName) ? "Undefined" : user.LastName;
        user.UserName = String.IsNullOrEmpty(user.UserName) ? "Undefined" : user.UserName;
        user.ModifiedAt = DateTime.Now;
        user.CreatedAt = DateTime.Now;
        _context.Users.Add(user);
        _context.SaveChanges();

        return user;
    

我的问题是:有什么方法可以传入用户的部分属性?比如 firstname=abc。

这种技术也可以用作 PUT(更新用户方法)。

提前致谢。

【问题讨论】:

您的 User 对象是否用于需要所有属性的任何其他 API? @Dishant 不,这是我在这个项目中唯一的 api。 比@Mohammad Nikravesh 提到的那种情况下的解决方案更适合你。 @Dishant 这行得通,谢谢。但是,如果我使用 JsonIgnore,它将忽略该属性的所有出现。如果我调用 /api/users/1,它也会隐藏该属性。有什么办法让它只忽略输入而不是输出? @WilliamShu 我得到了你想要的,你可能需要覆盖 defaultcontractresolver,看看这个***.com/a/20963058/4189817 【参考方案1】:

1) 插入记录时,只需将 CreatedAtModifiedAt 属性标记为 [JsonIgnore] 属性

[Required] 
[JsonIgnore] 
public DateTime CreatedAt  get; set;  

[Required] 
[JsonIgnore] 
public DateTime ModifiedAt  get; set;  

2) 当您尝试获取数据时,您的 api 方法将是

[HttpGet]
[Route("ById/id=id")]
public IHttpActionResult GetUser(int? id)

    if (id == null)
        return NotFound();

    User user = _context.Users.SingleOrDefault(c => c.UserId == id.Value);

    if (user == null)
        return BadRequest("User not exist in our database");

    var returnedData = new  FirstName = user.FirstName, LastName = user.LastName, UserName = user.UserName, CreatedAt = DateTime.Now, ModifiedAt = DateTime.Now ;
    return Ok(returnedData);

我们只使用返回 Anonymous Type 来自定义返回数据。

试一次可能对你有帮助

【讨论】:

【参考方案2】:

这取决于您的属性数据类型,如果它们可以为空,那么您可以在发送消息中将它们留空或为空,但如果它们不可为空,您必须提供值,否则您将在目的地(您的 wep- api 动作)。 所以现在如果你想避免传递值,即使是不可为空的属性,你可以在你的属性上使用[JsonIgnore] 属性(属于Newtonsoft.Json)。像这样:

using Newtonsoft.Json;

public class User

   //...
   [JsonIgnore]
   public DateTime CreatedAt   get; set; 
   //...

【讨论】:

行得通!但是有什么办法我仍然可以从 api 获取数据?例如,如果我调用 /api/users/1 并且它将返回该用户拥有的所有属性,包括 json 忽略的属性。 您可以将参数类型从“用户用户”更改为“对象用户”,然后您将完整的 JSON 对象作为输入参数,然后您可以手动对其进行序列化

以上是关于如何通过restful api传递部分对象(json)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 传递给 REST API (IBKR)

如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?

如何在Erlang中创建Json对象并在Rest Api中传递它

如何使用JSON正文在REST API POST方法中传递多个记录

通过 DocuSign Rest API 创建 DocuSign 信封时出错(包含多个文档和多个收件人)

如何在 REST API 中传递多个参数