这段代码是冗长的还是我误解了?

时间:2013-12-13 20:57:06

标签: c# rest asp.net-web-api httpresponse put

我在一本书中看到了这个代码,作为在客户端提供ID的情况下创建对象(在本例中为Employee)的示例:

public HttpResponseMessage Put(int id, Employee employee)
{
    if (!list.Any(e => e.Id == id)
    {
        list.Add(employee);

        var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee);

        string uri = Url.Link("DefaultApi", new { id = employee.Id });
        response.Headers.Location = new Uri(uri);
        return response;
    }
    return Request.CreateResponse(HttpStatusCode.NoContent);
}

我知道这是如何工作的,但下面的缩写代码也不会起作用:

public HttpResponseMessage Put(Employee employee)
{
    if (!list.Any(e => e.Id == employee.Id)
    {
        list.Add(employee);

        var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee);

        string uri = Url.Link("DefaultApi", new { id = employee.Id });
        response.Headers.Location = new Uri(uri);
        return response;
    }
    return Request.CreateResponse(HttpStatusCode.NoContent);
}

2 个答案:

答案 0 :(得分:2)

如果PUT的路径/ api方法定义为api/employee/{id},那么您需要传入id。但是,如果您的Employee对象已经拥有ID,然后您可以为api/employee动词设置PUT的路线,并像第二个示例所示接受Employee对象。

example for Web API,文档说明:

  

默认情况下,ASP.NET Web API框架采用简单的参数类型   来自请求体的路径和复杂类型。

答案 1 :(得分:1)

您建议的不太详细的解决方案没有错,它只是更改了ASP.NET Web API查找您传入的值的默认机制。

id是一个简单类型,因此ASP.NET Web API将在请求URI中查找值,而Employee是一个复杂类型,因此ASP.NET Web API需要查看在请求正文中。因此,如果您的路由设置要求id成为URI的一部分,那么将id作为单独的参数会更有意义,因为它会自动从URI中选取

您可以使用参数中的[FromUri]属性指示ASP.NET Web API查看请求URI,如下所示:

public HttpResponseMessage Put([FromUri]Employee employee)
{

}

现在,如果您在请求的查询字符串中传递Employee对象的组成部分,那么ASP.NET Web API将从中挑选出这些信息并构建Employee对象,像这样:

http://localhost/api/values/?FirstName=John8&LastName=Doe
  

注意:我正在填写FirstNameLastName个名称,但他们需要匹配模型类的public个属性。


有关详细信息,请参阅Parameter Binding in ASP.NET Web API