我有休息网址支持POST请求。看起来像
api / country / {countryId} / state
使用在给定ID的国家/地区中创建州资源
但此网址的映射功能是
public HttpResponseMessage Post(int countryId,StateDto state)
{
var country = _countryAppService.AddNewState(state, countryId);
var message = Request.CreateResponse(HttpStatusCode.Created, country);
return message;
}
和给定网址的预期样本是一样的 api / country / 1 / state (在ID为1的国家/地区创建新状态)
但是这里我没有在上面的函数中使用url值(1)而不是在这里调用者需要通过请求体传递相应的countryId,即对url和post请求中的contryId都没有任何保证是相同的。所以我怀疑是什么是正确的网址模式,以保存一个国家在特定国家/地区发送请求?
答案 0 :(得分:1)
如果资源路径和请求正文中有相同的信息,那么它就是重复的信息;调用者永远不需要在同一个请求中两次传递相同的信息。
您应该选择一个作为权威来源而忽略另一个。由于您必须具有正确的资源地址才能执行操作,因此我建议您从该处获取值:
public HttpResponseMessage Post(int countryId,StateDto state)
{
// Compose the DTO from the route parameter.
state.CountryId = countryId;
var country = _countryAppService.AddNewState(state);
var message = Request.CreateResponse(HttpStatusCode.Created, country);
return message;
}
答案 1 :(得分:0)
你也可以在体内传递StateDto对象,它会进入body,id可以进入url
public HttpResponseMessage Post([FromUri]int countryId,[FromBody]StateDto state)
{
var country = _countryAppService.AddNewState(state, countryId);
var message = Request.CreateResponse(HttpStatusCode.Created, country);
return message;
}
只有一个参数可以来自身体,其他必须来自uri,你可以在这里阅读更多: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
在uri中传递stateDto也是一个选项,但是你必须在querystring中传递它的所有成员。