如何将查询参数添加到 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
实现
所需目标的一种方法是手动读取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 方法修饰每个操作。您不必直接修改路由或在控制器操作中执行任何额外的参数分析。