【问题标题】:Using MVC Core Api RequestModel with GET Request and how should URI look like?将 MVC Core Api RequestModel 与 GET 请求一起使用,URI 应该是什么样子?
【发布时间】:2018-12-11 16:37:36
【问题描述】:

考虑以下示例:

[HttpGet("api/values/{id}")]
public ActionResult<string> Get(int id)
{
    return id
}

以上内容可以毫无问题地工作,但是,我希望对其进行更改,以便允许为参数说 10 个参数。我试图在一个安静的 api 场景中理解这是如何完成的。

第一个问题是它在 URI 端的外观如何? api/values/5/testOne/TestTwo/?如果 testOne 为空怎么办?那么我应该使用查询参数吗? api/values/5/?testOne=abc&amp;testTwo=123

第二个是我可以将它包装在我所谓的请求模型中吗?例子: 假设我有一个这样的请求模型:

public class TestRequestModel
{
    public int Id { get; set; }
    public string TestOne { get; set; }
    public string TestTwo { get; set; }
}

假设我希望包含它:

[HttpGet("api/values/{id}/{testOne}/{testTwo}")]
public ActionResult<string> Get(TestRequestModel requestModel)
{
    return requestModel.Id
}

上面的 {id} 不会映射到 requestModle.Id,其他参数也不会。我的第二个问题是如何在 GET 请求中实现该绑定?

【问题讨论】:

  • 尝试api/values/5//TestTwo/null 传递给URL 中的testOne 参数。
  • 使用[FromRoute] TestRequestModel requestModel
  • @KirkLarkin 对查询字符串有效还是仅对设置路由有效?
  • 那是“设置路线”(你的第二个例子)。

标签: c# rest api asp.net-core-mvc restful-url


【解决方案1】:

在根据休息实践设置url的同时,你可以得到这样的url参数

[HttpGet("api/values/{id:int}/{testOne:(type)}/{testTwo(type)}")]

您应该设置类型类型,除非查询参数不是字符串。而且,你可以得到这样的值

HttpGet("api/values/{id:int}/{testOne:type}/{testTwo:type}")]
public ActionResult<string> Get(int id, type testOne, type testTwo)
{
    TestRequest model = new TestRequestModel();
    request.id = id;
    request.TypeOne = typeOne;
    .....
}

我们显式映射查询参数的原因是 .net 中不支持将查询参数映射到类。您还可以从类中获取所需的值并使用该类型来获取参数。但是通过这种方式,您应该在 FormData 中设置这些参数,而不是在查询字符串中。希望这会有所帮助。

【讨论】:

  • 在 MVC View 应用程序中你可以这样做,你是说在 API 应用程序中你不能?只是看起来不太对...
  • 我并不是说你不能这样做。两者都可以。
  • 好的,怎么样?我最初的问题是问你如何做到这一点。
  • 使用我在评论中演示的代码,您可以实现我想的。无论是 mvc 端点还是 api 端点,通常的做法是在 url 中添加控制器的唯一标识符。在你的情况下,我相信它是 id 变量。此外,您的代码中的变量(testOne,testTwo)被映射到输入参数(正如我在评论中所展示的那样),但同样,我不认为您可以将这些变量直接映射到您的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2021-09-18
相关资源
最近更新 更多