我在ASP.Net Core WebAPI Controller中有一个操作,该操作采用一个参数。我正在尝试将其配置为能够以以下形式调用它:
public function profile(Request $request) {
$user = $request->user();
// do something
我似乎无法正确选择路由,因为我只能使一种形式被识别。 (简化的)动作签名如下所示:api/{controller}/{action}/{id}
api/{controller}/{action}?id={id}
。这些是我尝试过的路线:
public ActionResult<string> Get(Guid id)
-映射到[HttpGet("Get")]
api/MyController/Get?id=...
-映射到[HttpGet("Get/{id}")]
api/MyController/Get/...
如何配置要使用这两种URL形式调用的操作?
答案 0 :(得分:0)
将该参数设为可选
[Route("api/MyController")]
public class MyController: Controller {
//GET api/MyController/Get
//GET api/MyController/Get/{285A477F-22A7-4691-AA51-08247FB93F7E}
//GET api/MyController/Get?id={285A477F-22A7-4691-AA51-08247FB93F7E}
[HttpGet("Get/{id:guid?}"
public ActionResult<string> Get(Guid? id) {
if(id == null)
return BadRequest();
//...
}
}
但是,这意味着您需要对操作中的参数进行一些验证,以说明由于操作本身可以接受api/MyController/Get
而可以将其作为null传递的事实。
答案 1 :(得分:0)
如果要使用路由模板 您可以在Startup.cs这样的配置方法中提供一个:
app.UseMvc(o =>
{
o.MapRoute("main", "{controller}/{action}/{id?}");
});
现在您可以使用两个请求地址。
如果要使用属性路由,可以使用相同的方式:
[HttpGet("Get/{id?}")]
public async ValueTask<IActionResult> Get(
Guid id)
{
return Ok(id);
}