【问题标题】:Routing and multiple parameters in a web api controllerWeb api 控制器中的路由和多个参数
【发布时间】:2018-08-21 19:09:46
【问题描述】:

我知道这个问题已经被问过很多次了,但没有人真正总结出来。

我目前正在使用具有 Web api 控制器的 .NET Core 后端。

我知道在 .NET Core 中有多种处理路由的方法,例如

使用约束

[HttpGet("{id:int}")]
public string GetById(int id)
{
    return "item " + id;
}

创建默认路由

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

构建 RESTful 路由

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] {"hello", "world!"};
    }

    // POST api/values
    [HttpPost]
    public void PostCreate([FromBody] string value)
    {
    }
}

还有更多选择。

但是我就是不知道如何在一个路由中传递多个参数。

在我的情况下,我必须同时更新两个不同的对象,并且必须使用 HTTP Patch 或 HTTP Put 请求。

我可以使用 api/ExampleName/Id 之类的东西,但我需要的是 api/ExampleName/ObjectOneID&ObjectTwoID

有人知道如何构建这样的东西吗?

我想过在启动文件中创建一个默认路由并在此处进行配置。但是我想它需要一个特定的语法来读取多个参数

【问题讨论】:

    标签: c# rest asp.net-core routes


    【解决方案1】:

    您可以在 URI 本身中使用参数 - 例如 http://myapi.com/api/{controller}/{action}?id=someId&amp;anotherId=someOtherId

    你的操作方法会像

    public void PostCreate([FromUri]Guid someId, [FromUri]Guid anotherId)

    【讨论】:

      【解决方案2】:
      [HttpPatch]
      public async Task<string> Patch([FromBody] Model request)
      

      Model 在哪里

      class Model 
      {
         public int ObjectOneID {get; set;}
         public int ObjectTwoID {get; set;}
      }
      

      要使用它,只需使用包含 ObjectOneIDObjectTwoID 的正文创建请求

      PATCH api/ExampleName
      Content-Type: application/json
      {
         "ObjectOneID":1,
         "ObjectTwoID":2
      }
      

      【讨论】:

      • 我想我应该更好地解释一下我的情况。我必须更新同一类的两个对象。两个对象在数据库中都已经有一个唯一的 ID。我期望的是接收具有两个不同主体的两个对象并创建一个 Sql 语句,该语句根据主体更改这两个对象的数据
      • @Ekos 好的,很好,但是关于“Routing 和 web api 控制器中的多个参数”的问题。不是关于更新数据库中的实体
      • 更新实体只是我现在想要实现的结果。我必须建立一条路线,因此使用多个参数进行路由。换句话说,我无法让我的控制器识别不同的参数。我只是不知道如何建立这样的路线
      【解决方案3】:

      在这种情况下,我建议将 POST/PUT 与模型一起使用

      [Route("dummy")]
      [HttpPost]
      public async Task<IHttpActionResult> Dummy(Foo req)
      {
          //logic
      }
      
      public class Foo
      {
          public CustomObjectBody ObjectOneID {get;set;}
          public CustomObjectBody ObjectTwoID {get;set;}
      }
      
      public class CustomObjectBody
      {
          public int Property1 {get;set;}
          public int Property2 {get;set;}
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-04
        • 2014-11-07
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 2014-02-04
        • 1970-01-01
        • 2020-01-04
        相关资源
        最近更新 更多