【问题标题】:Query parameter routing with asp .net core用asp .net core查询参数路由
【发布时间】:2017-04-22 17:20:21
【问题描述】:

我想使用 .net 核心 API 使用 url 查询参数而不是路径参数。

控制器

[Route("api/[controller]/[action]")]
public class TranslateController : Controller
{
    [HttpGet("{languageCode}")]
    public IActionResult GetAllTranslations(string languageCode)
    {
        return languageCode;
    }
}

startup.cs 仅使用默认设置

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc()
            .AddJsonOptions(jsonOptions =>
            {
                jsonOptions.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
                jsonOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                jsonOptions.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            });

    services.AddLogging();
    services.AddSingleton<IConfiguration>(Configuration);

    services.AddSwaggerGen(c =>
    {
        c.SingleApiVersion(new Info
        {
            Version = "v1",
            Title = "Translate API",
            Description = "bla bla bla description",
            TermsOfService = "bla bla bla terms of service"
        });
    });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseMvc();

    app.UseSwagger();
    app.UseSwaggerUi();
}

我的招摇请求看起来像这样

我的邮递员请求在这里

我想将我的 GetAllTranslations 更改为接受查询参数而不是路径参数,但是当我将邮递员查询更改为

http://localhost:42677/api/Translate/GetAllTranslations?languageCode=en

我会得到错误 404 Not found 所以很明显我的控制器路径设置不正确,但我不知道如何做到这一点......有什么想法吗?

我已尝试删除 [HttpGet("{languageCode}")] 属性,但我不断收到 null 参数而不是值。

【问题讨论】:

    标签: asp.net-core asp.net-core-routing


    【解决方案1】:

    @jcmontx 的答案有效,但它没有解释为什么需要显式设置参数 bindind。我仍然不确定是否以及为什么要强制执行, 但一个原因是,如果没有明确设置绑定参数,它会打开 API 以不按预期方式使用,这不是很安全,也不是一个好的做法。

    【讨论】:

      【解决方案2】:

      这就是你要找的东西

      public IActionResult GetAllTranslations([FromQuery]string languageCode)
      

      【讨论】:

      • 谢谢。这行得通,但为什么与 asp.net web api 相比必须明确声明?
      • 这可能更像是一个标准问题;出于多种原因,RESTful 服务比基于查询的 URL 更常见。就个人而言,我认为这是人类可读的事情。 /api/translate/getalltranslations/en 比 /api/translate/getalltranslations?languagecode=en 更容易阅读。
      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2019-09-16
      • 2021-04-13
      • 2023-01-27
      • 1970-01-01
      相关资源
      最近更新 更多