WebApi 中的默认 HTTP 动词是什么?获取或发布
本文关键字:获取 是什么 默认 HTTP WebApi | 更新日期: 2023-09-27 18:37:26
只是古玩。我正在互联网上查看其中一个网络项目。
代码流是这样的:
[RoutePrefix("/person")]
public class PersonController : ApiController
{
//....
[Route("/register")]
public IHttpACtionResult RegisterPerson(PersonDto personDto)
{
//....
}
//....
}
你注意到上面的代码了吗?没有指定[HttpGet()]
或[HttpPost()]
。然而,上面的代码对于GET
调用失败,但适用于POST
调用。
任何想法如何解决此方法的HTTP动词?
注意:我知道如果方法名以 GET
或 POST
开头,那么相应地通过 HTTPGet
或 HTTPPost
调用该方法。但是这里的方法名称以 Register...
开头。
知道这是如何工作的吗?
如果方法名称与任何HTTPVerb不匹配,则默认值为[HTTPPost]。
操作选择通过 ReflectedHttpActionDescriptor 类的 GetSupportedHttpMethods() 进行。
请参考以下链接中的代码:https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Controllers/ReflectedHttpActionDescriptor.cs
if (supportedHttpMethods.Count == 0)
{
// Use POST as the default HttpMethod
supportedHttpMethods.Add(HttpMethod.Post);
}
这取决于您的操作名称,如果它与 http 动词上的任何操作名称匹配。例如
在我的 API 中,我使用了一个操作来获取供应商列表,现在看看它是如何工作的:
[Route("Get")]
public IHttpActionResult GetVendor()
{
var vendor = _ivs.GetVendorDetails();
return Ok(vendor);
}
现在,当我使用HttpPost点击api时,我收到以下消息:
{ "消息":"请求的资源不支持 http 方法'POST'。}
但是,如果我使用 HttpGet 点击 API,我正在获取数据
{
"VendorId": "cc0e7ea1-4751-467b-b60b-be9b5202a511",
"VendorCode": "Vend1",
"VendorName": "testvendor",
"AddressLine1": "AddressLine1",
"AddressLine2": "AddressLine2",
"AddressLine3": "AddressLine3",
"City": "City ",
"PINCode": "12345 ",
"province": "province ",
"Phone1": "Phone1",
"Phone2": "Phone2",
"Phone3": "Phone3",
"PrimaryPhone": "Phone3 ",
"CreatedDate": "2017-06-21T15:49:30.207",
"CreatedBy": "e465e3e2-4156-434e-a444-f9a9626e1cf6",
"UpdatedDate": "1900-01-01T00:00:00",
"UpdatedBy": null,
"IsActive": true
}
现在我正在更改方法名称
[Route("Get")]
public IHttpActionResult Vendor()
{
var vendor = _ivs.GetVendorDetails();
return Ok(vendor);
}
并使用 HttpGet 访问 API
现在我的回应是:
{ "消息": "请求的资源不支持 http 方法 'GET'。
因为你的方法有一个参数(PersonDto)(RegisterPerson)...它必须"发布"某些内容,否则您将无法访问水合的 DTO 对象。
虽然这是关于WCF的,但有一段揭示了一点。特别是关于GET的性质
https://msdn.microsoft.com/en-us/library/bb628610(v=vs.110).aspx
ASP.NET AJAX 支持使用 HTTP POST 和 HTTP GET 谓词的操作,HTTP POST 是默认的。创建没有副作用并返回很少或从不更改的数据的操作时,请改用 HTTP GET。可以缓存 GET 操作的结果,这意味着对同一操作的多次调用可能只导致对服务的一个请求。缓存不是由 WCF 完成的,但可以在任何级别(在用户的浏览器中、代理服务器和其他级别)进行。如果要提高服务性能,则缓存是有利的,但如果数据频繁更改或操作执行某些操作,则可能无法接受缓存。
在您的示例中,Web API 将使用媒体类型格式化程序从请求正文中读取 POST 的PersonDto
值,即 POST,如果它来自 URL,它是 GET,您可以使用[FromBody]
或[FromUri]
显式强制 WebApi 使用其中一个,如下所示:
public HttpResponseMessage GetSample([FromUri] SomeObject foo) { ... }
或
public HttpResponseMessage PostSample([FromBody] SomeObject foo) { ... }
默认情况下,Web API 首先查看路由 URL ([Route]) 数据,如果无法从请求 URI 获取值,则尝试将其与路由匹配,当参数是复杂类型 Web API 使用媒体类型格式化程序从请求正文读取值时,可能会发生这种情况。