2013-08-29 53 views
2

我一直在關注http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api並創建以下控制器後,我收到意想不到的結果...操作在MVC 4的WebAPI

public class ProductsController : ApiController 
{ 
    Product[] products = new Product[] 
    { 
     new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
     new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
     new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
    }; 

    public IEnumerable<Product> GetAllProducts() 
    { 
     return products; 
    } 

    public Product GetProductById(int id) 
    { 
     var product = products.FirstOrDefault((p) => p.Id == id); 
     if (product == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     return product; 
    } 
} 

我希望能夠做出這樣的呼籲:

/API /產品/ GetAllProducts

但是,這是行不通的。相反,我可以簡單地調用:

/API /產品

這確實會GetAllProducts()描述的過程。爲什麼不按預期工作?

回答

1

隨着Url/api/products/GetAllProducts這是行不通的,因爲你的網絡API僅僅只支持默認路由:

configuration.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

爲了使其作爲你的期望的工作,你需要添加更多的途徑來支持action頂部:

configuration.Routes.MapHttpRoute(
      name: "CustomizedApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 

至於第二URL/api/products,它的工作原理是因爲:

默認路由中的id是可選的(RouteParameter.Optional)。

而且從link

該框架僅選擇所述請求,確定爲匹配HTTP方法(GET,POST,PUT,DELETE),其操作如下:

  • HTTP方法的屬性:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。如果控制器方法的名稱以「Get」,「Post」,「Put」,「Delete」,「Head」,「Options」或「Patch」開頭,那麼按照約定,動作支持該HTTP方法。

  • 如果以上都不是,則該方法支持POST。

在你的情況,如果您從瀏覽器的請求時,它應該是一個GET請求,所以這個請求將映射到與Get(方法GetAllProducts

3

因爲在WebApi框架中它是假設你想要「Get」方法。

你是否熟悉不同的http動詞?發佈,獲取,放入,刪除?當您在瀏覽器中輸入網址時,它會發出Get請求。該框架可以看到並假設你想要GetAllProducts。

如果你有一個DeleteAllProducts,併發出一個刪除請求/api/products它會運行那一個。

如果您有GetProduct(int id)併發出Get請求(例如,通過在瀏覽器地址欄中鍵入)到api/products/1它將執行GetProcuct(1)

認爲是更多的基於CRUD的控制器。您只需要執行Get,Post,Put,Delete等操作即可運行基於所使用的http動詞的動作。想更新產品?這將是類似public ActionResult Post(int id, [FromBody]Product p)的東西,您可以通過POST請求將其稱爲/ api/products/1。當然,產品Json/XML需要在請求主體中發送以便序列化工作。

+1

細節開始行動這裏:[ASP.NET Web API中的路由](http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api) – Alex

+0

謝謝,@Alex我正在尋找類似的東西來添加。 – Joe