2014-12-03 69 views
0

例如,我知道如何將對GET請求的查詢參數的支持添加到端點/resources。這將是:如何將查詢參數添加到Web API的GET請求中

[HttpGet] 
public async Task<IHttpActionResult> GetAll([FromUri] QueryData queryData) { 
    //... Do some stuff 
} 

在我的例子,QueryData將包含類的所有我支持的查詢參數:

public class QueryParam { 
    public int Page { get; set; } 
    public int Size { get; set; } 
} 

話,那我可以叫端點:/resources?page=2&size=4,併成功取回這些參數。

但是,如何做同樣的,但在終點:/resources/2 ??

2是URL的一部分,它指定資源的id

此刻,我的處理方法如下:

[HttpGet] 
public async Task<IHttpActionResult> Get(int id) { 
    //Do some stuff... 
} 

這工作得很好,但後來我試圖修改爲:

[HttpGet] 
public async Task<IHttpActionResult> Get(int id, [FromUri] QueryData queryData) { 
    //Do some stuff... 
} 

我希望它會工作,因爲它在另一種方法上做了,但事實並非如此。可能是因爲id,它不是由查詢參數檢索,而是作爲URL路徑的一部分。

是否可以向這樣的URL添加查詢參數,並且能夠檢索id和那些參數?

我很期待能夠調用端點:/resources/2?lang=en

回答

0

一種方式來實現你想要的是手動讀取id,就像這樣:

[HttpGet] 
public async Task<IHttpActionResult> Get(int id, [FromUri]QueryData queryData) { 
    id = RouteData.Values["id"]; 
} 

[HttpGet] 
public async Task<IHttpActionResult> Get([FromUri]QueryData queryData) { 
    var id = RouteData.Values["id"]; 
} 

如果MVC大嚷大約含糊不清,請添加像這樣的路由約束:

routes.MapRoute(
    "Product", 
    "Product/{productId}", 
    new {controller="Product", action="Details"}, 
    new {productId = @"\d+" } 
); 

您可以嘗試的另一件事是將ID添加爲QueryData屬性。它可以填充它!

+0

我想過這個,但是Web API會在'GetAll(QueryData)'和'Get(QueryData)'方法之間找到一個不明確的地方,因爲它們都採用相同的參數,並且都綁定到'HttpGet' – 2014-12-03 18:38:47

+0

總是爲id添加一個約束爲int。 – 2014-12-03 18:39:10

+0

有一些資源具有字符串ID,因此不幸的是這不會是一個選項 – 2014-12-03 18:39:54

0

我能得到的Web API 2.2正確解析路徑值,並用下面的代碼查詢字符串值:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web.Http; 
using WebAPITest.Models; 

namespace WebAPITest.Controllers 
{ 
    public class ValuesController : ApiController 
    { 
     // GET api/values/5 
     public async Task<IHttpActionResult> Get(int id, [FromUri] QueryParam queryData) 
     { 
      return Ok("value"); 
     }  
    } 
} 

型號:

using System; 

namespace WebAPITest.Models 
{ 
    public class QueryParam 
    { 
     public int Page { get; set; } 

     public int Size { get; set; } 

    } 
} 

我調整了默認ValuesController到使用IHttpActionResult而不是字符串。如果您想區分路線,您可以添加屬性路線並用各自的HTTP方法修飾每個動作。你不應該直接修改你的路由或者在你的控制器動作中執行任何額外的參數解析。

相關問題