Web API 返回 405。它不应该是 404 吗?
Web API Returning a 405. Shouldn't it be a 404?
我有一个支持 GET(通过 id)和 POST(通过模型)的 VendorsController。当通过预期路线调用时,它们按预期工作。但是,我注意到如果我向 POST 路由添加一个 id(即向 "api/vendors" 添加“/5”),我会得到一个 405,其中
响应正文 =
{
"Message": "The requested resource does not support http method 'POST'."
}
这不应该是 404 Not Found 吗? VendorsController 确实支持 POST,但不支持 URL。
假设 404 是正确的,如何将我的路由更新为 return 404 而不是 405? 我相信我可以实现自定义 ActionSelector 来完成这个,但这感觉有点矫枉过正。
[RoutePrefix("api/Vendors")]
public class VendorsController : ApiController
{
[Route("")]
public IHttpActionResult PostVendor([FromBody]Vendor vendor)
{
var uri = Url.Link("GetVendorById", 1);
return Created(uri, vendor);
}
//GET by Id
[Route("{id:int:min(1)}", Name="GetVendorById")]
public IHttpActionResult GetVendor(int id)
{
return Ok(new Vendor() { Id = id });
}
}
URL return 一个 201: POST http://localhost/api/vendors
URL return 发送 405:POST http://localhost/api/vendors/5
Returns 带有和不带有请求正文的 405。
我认为 405 是正确的,因为您拥有可以处理该问题的资源 URL - 您的 GET。
如果您对该资源没有 GET,则 404 是正确的。
这并不是说 VendorController 不支持 POST,而是您尝试访问的特定资源不支持 POST。
我有一个支持 GET(通过 id)和 POST(通过模型)的 VendorsController。当通过预期路线调用时,它们按预期工作。但是,我注意到如果我向 POST 路由添加一个 id(即向 "api/vendors" 添加“/5”),我会得到一个 405,其中
响应正文 =
{ "Message": "The requested resource does not support http method 'POST'." }
这不应该是 404 Not Found 吗? VendorsController 确实支持 POST,但不支持 URL。
假设 404 是正确的,如何将我的路由更新为 return 404 而不是 405? 我相信我可以实现自定义 ActionSelector 来完成这个,但这感觉有点矫枉过正。
[RoutePrefix("api/Vendors")]
public class VendorsController : ApiController
{
[Route("")]
public IHttpActionResult PostVendor([FromBody]Vendor vendor)
{
var uri = Url.Link("GetVendorById", 1);
return Created(uri, vendor);
}
//GET by Id
[Route("{id:int:min(1)}", Name="GetVendorById")]
public IHttpActionResult GetVendor(int id)
{
return Ok(new Vendor() { Id = id });
}
}
URL return 一个 201: POST http://localhost/api/vendors
URL return 发送 405:POST http://localhost/api/vendors/5 Returns 带有和不带有请求正文的 405。
我认为 405 是正确的,因为您拥有可以处理该问题的资源 URL - 您的 GET。
如果您对该资源没有 GET,则 404 是正确的。
这并不是说 VendorController 不支持 POST,而是您尝试访问的特定资源不支持 POST。