如何在Web API上向GET请求添加Query参数

时间:2014-12-03 18:24:24

标签: c# asp.net .net web asp.net-web-api

我知道如何在GET请求中向端点/resources添加对Query参数的支持。那将是:

[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是网址的一部分,用于指定资源的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路径的一部分。

是否可以将查询参数添加到此类网址,并且能够同时检索id和这些参数?

我期待能够呼叫端点:/resources/2?lang=en

2 个答案:

答案 0 :(得分:1)

实现目标的一种方法是手动阅读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属性。它可以填充它!

答案 1 :(得分: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方法装饰每个操作。您不必直接修改路由或在控制器操作中执行任何额外的参数解析。