我的ASP.NET核心应用程序中有一个简单的控制器。想法是控制器被称为CreditData
,我的端点可以是/api/creditdata/
,然后它应该具有默认的预期API方法。
我有两种方法:
/api/creditdata
,它应该有一个查询,例如/api/creditdata?query=text1,text2
/api/creditdata/value
,/api/creditdata/text1
之类的查询应该正常工作我试图将其设置如下:
[Route("api/[controller]")]
public class CreditDataController : Controller
{
private CreditDataService _creditDataService;
public CreditDataController()
{
_creditDataService = new CreditDataService();
}
// GET: api/CreditData?query=text1,text2
[HttpGet("{query}", Name = "Get")]
public List<CreditData> Get([FromQuery] string query)
{
// code
}
// GET: api/CreditData/GetByRegistration/33514322
[HttpGet("{query}", Name= "GetByRegistration")]
public CreditData GetByRegistration(string query)
{
// code
}
}
我有一个非常标准的Startup.cs
文件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true,
ReactHotModuleReplacement = true
});
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
}
但两种方式都不是我想要的。我已经习惯了ASP.NET MVC 4/5方式,但逻辑似乎有所不同。
如何设置正确的网址?
答案 0 :(得分:3)
使用[HttpGet("{query}", Name = "Get")]
,您可以说明网址必须是:
API / CreditData /查询
你真正想要的只是:
// GET: api/CreditData?query=text1,text2
[HttpGet(Name = "Get")]
public List<CreditData> Get([FromQuery] string query)
在{query}
属性中提供HttpGet
指定它必须是路线的一部分,这不是您想要的,所以我已将其删除。
您的第二个[HttpGet]
是完全相同的路线。为此,您需要:
// GET: api/CreditData/GetByRegistration/33514322
[HttpGet("GetByRegistration/{query}", Name= "GetByRegistration")]
public CreditData GetByRegistration(string query)
在这里,我添加了GetByRegistration
来表明它是路线的静态部分。在这种情况下,由于我上面提到的规则,您的query
参数将从路径中填充。
注意:除非您在其他地方按名称引用路线,否则您不需要Name
属性。