2016-03-04 83 views
2

只是好奇心。我正在看网上的一个网络项目。WebApi中的默认HTTP动词是什么? GET还是POST?

和代码流程是这样的:

[RoutePrefix("/person")] 
public class PersonController : ApiController 
{ 

    //.... 
    [Route("/register")] 
    public IHttpACtionResult RegisterPerson(PersonDto personDto) 
    { 
     //.... 
    } 
    //.... 
} 

你有没有注意到上面的代码?没有指定[HttpGet()][HttpPost()]。然而,上述代码未能通过GET呼叫,但可用于呼叫POST

任何想法,这种方法的HTTP动词是怎么解决的?

注:我知道,如果一个方法名与GETPOST开始,然后相应的方法是通过HTTPGetHTTPPost调用。但此处的方法名称始于Register...

任何想法是如何工作的?

回答

3

因为你有你的方式(RegisterPerson)的参数(PersonDto)...它有“后”的东西,否则你将无法访问水合DTO对象。

虽然这是关于WCF,一个段落鸡舍一点light..especially上的性质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完成的,但可以发生在任何级别(在用户的浏览器,代理服务器和其他级别上)。如果要提高服务性能,缓存是有利的,但如果数据更改可能不可接受频繁地或者如果操作执行一些动作。

+0

哈哈!我的天啊!没有在第一时间罢工。谢谢:) –

2

在你的榜样的Web API将使用的媒体类型的格式从请求主体意义POST阅读PersonDto的值,如果它是从它让你可以明确地强制的WebAPI使用一个或另一个网址通过使用[FromBody][FromUri]像:

public HttpResponseMessage GetSample([FromUri] SomeObject foo) { ... } 

public HttpResponseMessage PostSample([FromBody] SomeObject foo) { ... } 

默认的Web API着眼于路由URL第一([路径])的数据,并试图与之相匹配的途径,如果不能从请求URI得到的值,这可能发生在参数是一个复杂类型的Web API使用媒体类型格式化程序从请求主体读取值。

3

默认为[HTTPPost]如果方法名称不匹配任何HTTPVerb。

动作选择发生通过GetSupportedHttpMethods()ReflectedHttpActionDescriptor类的。

请参考代码下面的链接: 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); 
      } 
+0

写得很好用内幕信息 –

+0

尼斯发现:如果(supportedHttpMethods.Count == 0){ // 使用POST作为默认列举HTTPMethod supportedHttpMethods.Add(HttpMethod.Post); } – granadaCoder

1

这取决于你的行动名称,如果它匹配任何在HTTP动词。例如

在我的API我用行动来获得供应商的名单,现在看到它是如何工作的:

[Route("Get")] 
    public IHttpActionResult GetVendor() 
    { 
     var vendor = _ivs.GetVendorDetails(); 

     return Ok(vendor); 
    } 

现在,当我使用打API HttpPost我收到以下消息:

{ “消息”:“请求的资源不支持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我的回应是:

{“Message”:“T他要求资源不支持http方法'GET'。“ }