如何通过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) 插入记录时,只需将 CreatedAt
和 ModifiedAt
属性标记为 [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)的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?
如何在Erlang中创建Json对象并在Rest Api中传递它
如何使用JSON正文在REST API POST方法中传递多个记录