我在visualstudio中生成了一个WebApi,用于角度前端。它用于存储和提供有关会议的数据。每次会议都可以有一个或多个议程点。现在HTTP GET给了我JSON,如:
[
{
"Agendapunten": [
{
"Id": 1,
"Omschrijving": "Omschrijving 1",
"VolgNr": 2,
"VergaderingenId": 1
},
{
"Id": 3,
"Omschrijving": "Omschrijving 2",
"VolgNr": 1,
"VergaderingenId": 1
}
],
"Id": 1,
"Datum": "2014-02-05T00:00:00",
"Status": 5
},
{
"Agendapunten": [
{
"Id": 11,
"Omschrijving": "Omschrijving 3",
"VolgNr": 4,
"VergaderingenId": 20
}
],
"Id": 20,
"Datum": "2014-02-05T00:00:00",
"Status": 5
}
]
当我使用POST添加会议或使用PUT更新会议字段时,一切正常。作为一个WebApi / JSON newby,我期望以几乎相同的方式更新agendapoints(agendapunten in dutch):在上面提到的JSON结构中放入一个新值并将其发送到WebApi ...发送此请求后数据库中没有任何变化。
有人能指出我正确的方向吗?我怀疑我必须构建一个单独的WebApi来检索和更新agendapoints。或者使用不同的调用方法做一些事情,比如
http://webserveraddress/api/meeting/1/agendapoints (GET)
Http://webserveraddress/api/meeting/1/agendapoints/1 { new values} (PUT)
我希望我的问题很清楚,尽管我的英语很差......
答案 0 :(得分:1)
简短回答:不,您不必为议程定义单独的API服务。您可以通过会议资源与其进行交互:
e.g。 api / meetings / {id} 服务将采用您的会议对象(包括议程)并保存会议,但也会注意找出对象中不再包含哪些议程,从而将其从db,哪些是新的,因此添加它们,哪些被更改,从而更新它们。 E.g。
//api/meetings/{id} - PUT
public HttpResponse Update(int id, Meeting meeting)
{
db.update(id, meeting);
foreach (var agenda in meeting.agendas)
{
if (db.exists(agenda))
{
agenda.update()
}
else
{
agenda.insert()
}
//also take care of deleting agendas no longer there
}
}
有些人可能反对这种方法并建议定义一个单独的资源Url;其他人可能同意并说,其核心议程实际上只是会议的延伸,这意味着如果议程发生变化,会议就会发生变化。
要将议程作为单独的资源,您需要定义一个全新的Agendas控制器,该控制器将与 api / agendas / {id} url上的议程进行交互。 E.g。
public class AgendasController
{
//api/agendas/{agendaId} - PUT
public HttpResponse Update(int agendaId, Agenda agenda)
{
db.update(agendaId, agenda);
}
}
您可能还希望在MeetingsController上使用议程方法,并将路线定义为 api / meetings / {meetingId} / agendas / {agendaId} - 就像您在问题的底部一样。如果您使用基于约定的路由,则定义路线可能有点棘手。在Web API 2中,您可以使用属性路由来简化这种路由。
有关属性路由的详细信息,请参阅此文章:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2