我在一本书中看到了这个代码,作为在客户端提供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);
}
答案 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
注意:我正在填写
FirstName
和LastName
个名称,但他们需要匹配模型类的public
个属性。
有关详细信息,请参阅Parameter Binding in ASP.NET Web API。