POST操作的正确REST Urlpattern是什么

时间:2014-07-04 15:49:13

标签: asp.net-mvc rest asp.net-web-api asp.net-web-api2

我有休息网址支持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都没有任何保证是相同的。所以我怀疑是什么是正确的网址模式,以保存一个国家在特定国家/地区发送请求?

2 个答案:

答案 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中传递它的所有成员。