如何将查询参数添加到 Web API 上的 GET 请求

本文关键字:API Web 上的 GET 请求 添加 查询 参数 | 更新日期: 2023-09-27 18:33:10

例如

,我知道如何在端点/resources的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

如何将查询参数添加到 Web API 上的 GET 请求

实现

所需目标的一种方法是手动读取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 属性。它可能会填充它!

我能够使用以下代码正确解析路由值和查询字符串值的 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; }
    }
}

我将默认的值控制器调整为使用IHttpActionResult而不是字符串。如果要区分路由,可以添加属性路由并使用各自的 HTTP 方法修饰每个操作。您不必直接修改路由或在控制器操作中执行任何额外的参数分析。