人。我只想在asp .net核心控制器中询问有关json传输的问题。
我知道我是否想要像
那样阅读json{
FirstName: "Zhen",
LastName: "Wang"
}
来自request.body的,我需要将它绑定到像这样的对象:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PersonController : ApiController
{
[HttpPost]
public Person Index([FromBody]Person person)
{
return person;
}
}
但是,如果json中不仅有一个Person,而且还有一个像:
这样的建筑物 {
Person: {
FirstName: "Zhen",
LastName: "Wang"
},
Building:{
Address:"Willis Street"
}
}
我是否必须构建一个PersonAndBuilding以从request.body中获取人员并构建数据?
public class PersonAndBuilding
{
public Person Person { get; set; }
public Building Building { get; set; }
}
public class PersonController : ApiController
{
[HttpPost]
public Person Index([FromBody]PersonAndBuilding personAndBuilding )
{
return personAndBuilding.Person;
}
}
我认为这很奇怪,因为这意味着我必须在程序中为每个POST控制器构建一个新类。
有人可以给我一些想法吗?
答案 0 :(得分:0)
不,你可以这样做:
public class PersonController : ApiController
{
[HttpPost]
public Person Index(Person Person, Building Building)
{
return Person;
}
}
这取决于你在传递之前序列化json的方式。
答案 1 :(得分:0)
你发布的数据是在a few ways之一中传输的,尽管正文/表格或网址(或两者都是!)是最常见的。请求正文的内容通常只能读取一次,这就是为什么每个参数只能有一个FromBody属性的原因。
在向/从WebAPI发送数据或从WebAPI接收数据时,通常使用DTO(数据传输对象)。 DTO负责处理所需的数据,而不需要不必要的数据库垃圾,或者您不需要/想要暴露的字段。
在这种情况下,是的,你需要一个专门包含一个建筑物和一个人的类。为简单起见,您可以在同一个类/文件中定义DTO,或者在./DTOs/或./Models/DTOs/中定义DTO的更优雅和有条理的解决方案。
稍微替代方法是修改您的REST结构,以便您的Person对象由Id标识,这样您的Route看起来像download.file('http://www.cpppc.org:8082/efmisweb/ppp/projManage/xsg_perview.do?tokenid=undefined&fileName=20170317105445289.pdf',destfile = "Download", mode="wb")
。然后你的方法签名看起来像......
/api/Person/{personId}