用asp.net core查询参数路由
Query parameter routing with asp .net core
我想使用 url 查询参数而不是使用 .net 核心的路径参数 API。
控制器
[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();
}
我的 swagger 请求看起来像这样
我的邮递员请求在这里
我想更改我的 GetAllTranslations 以接受查询参数而不是路径参数,但是当我将邮递员查询更改为
http://localhost:42677/api/Translate/GetAllTranslations?languageCode=en
我会收到错误 404 Not found 很明显我的控制器路径设置不正确,但我不知道该怎么做...有什么想法吗?
我已经尝试删除 [HttpGet("{languageCode}")] 属性,但我总是得到 null 参数而不是值。
这就是您要找的东西
public IActionResult GetAllTranslations([FromQuery]string languageCode)
@jcmontx 的答案有效,但没有解释为什么需要显式设置参数 bindind。我仍然不确定是否以及为什么会强制执行此操作,
但一个原因是,如果未明确设置绑定参数,它会打开 API 以按预期方式使用,这不是很安全,也不是一个好习惯。
我想使用 url 查询参数而不是使用 .net 核心的路径参数 API。
控制器
[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();
}
我的 swagger 请求看起来像这样
我的邮递员请求在这里
我想更改我的 GetAllTranslations 以接受查询参数而不是路径参数,但是当我将邮递员查询更改为
http://localhost:42677/api/Translate/GetAllTranslations?languageCode=en
我会收到错误 404 Not found 很明显我的控制器路径设置不正确,但我不知道该怎么做...有什么想法吗?
我已经尝试删除 [HttpGet("{languageCode}")] 属性,但我总是得到 null 参数而不是值。
这就是您要找的东西
public IActionResult GetAllTranslations([FromQuery]string languageCode)
@jcmontx 的答案有效,但没有解释为什么需要显式设置参数 bindind。我仍然不确定是否以及为什么会强制执行此操作, 但一个原因是,如果未明确设置绑定参数,它会打开 API 以按预期方式使用,这不是很安全,也不是一个好习惯。