我正在创建一个 ASP.NET Core 5 Web API,我的控制器有两种方法,第一个是像这样的 Get 方法:
[Route("GetRankingByListIdAll/{ListId}")]
[HttpGet]
public async Task<ActionResult> GetRankingByListIdAll([FromQuery] string ListId)
{
var result = await _userService.GetRankingByListIdAll(ListId);
return Ok(result);
}
另一种方法是这样的
POST
方法:
[HttpPost("AddUser")]
public async Task<ActionResult> AddUser([FromBody] Model model)
{
bool userInList = await _usersService.validateEmailInUsers(model.email, model.otherProperty);
if (!userInList)
{
var result = await _userService.addUser(model.property, model.otherProperty,model.proper);
return Ok(result);
}
else
{
return BadRequest("message");
}
}
正如你所看到的,在get方法中我放置了“[Route]”来设置路线,在post方法中我将路线放在
[HttpPost("")]
中,但是我无法传递参数,我在Get方法中尝试过使用路线是这样的:
[HttpGet("GetRankingByListIdAll/{ListId}")]
但它也不起作用。
在 Get 方法中我使用此请求:
https://localhost:44340/api/User/GetUserByListId/ListId=59D512FB-1CCF-47E2-8E85-B4F76192D941
我的控制器称为“UserController”,我的 API 已使用 JWT 进行授权。
在.NET Core 2.2中这个API工作正常,但我还没有找到如何在.NET Core 5中做到这一点,我想知道是否有人可以帮助我。
正如你在 get 方法中看到的,我输入了“[Route]”来设置路线并 在post方法中我将路线放在
中,但我不能 传递参数,我已经尝试在 Get 方法中使用路由 像这样:[HttpPost("")]
但确实如此 也不行。[HttpGet("GetRankingByListIdAll/{ListId}")]
在 Get 方法中我使用此请求:
https://localhost:44340/api/User/GetUserByListId/ListId=59D512FB-1CCF-47E2-8E85-B4F76192D941
我的控制器名为“UserController”并且我的API具有授权 使用智威汤逊。
在.NET Core 2.2中这个API工作正常,但我还没有找到怎么做 它在.NET Core 5中,我想知道是否有人可以帮助我。
[HttpGet("GetRankingByListIdAll/{ListId}")]
[Route("GetRankingByListIdAll/{ListId}")]
当您如上使用
Route
属性和 HttpGet
方法时,由于参数是从路由中传递过来的,所以如果您在 Get 方法中使用 [FormBody]
属性,则无法获取该值。
要解决这个问题,可以使用
[FromRoute]
属性,代码如下:
[HttpGet]
[Route("GetRankingByListIdAll/{ListId}")]
public async Task<ActionResult> GetRankingByListIdAll([FromRoute] string ListId)
{
var result = "Entered Id: " + ListId;
return Ok(result);
}
然后使用PostMan查看,结果如下:
如果你使用JQuery调用API方法,代码如下:
<input type="button" value="Call Get Method" id="btnGet" />
<input type="button" value="Call Post Method" id="btnPost" />
<div id="result"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(function () {
$("#btnGet").click(function () {
var listid = "Num1002";
$.ajax({
url: "/api/ToDo/GetRankingByListIdAll/" + listid, //The url like this: https://localhost:44355/api/ToDo/GetRankingByListIdAll/NV1003
method: "Get",
success: function (res) {
$("#result").html(res);
},
error: function (error) {
alert("error");
}
});
});
$("#btnPost").click(function () {
var user = {};
user.UserId = 1002;
user.UserName = "Tom";
$.ajax({
url: "/api/ToDo/AddUser", //the url like this:https://localhost:44355/api/ToDo/AddUser
method: "Post",
contentType: "application/json; charset=utf-8",
traditional: true, //if the user object is a complex objects, try to add this attribute.
data: JSON.stringify(user),
success: function (res) {
$("#result").html(res);
},
error: function (error) {
alert(error);
}
});
});
});
</script>
结果如下:
.Net 5 中关于带有属性路由的 REST API 的变化很小。 我强烈建议您仔细阅读以下内容:
在 ASP.NET Web API 2 中创建具有属性路由的 REST API。
没有提及任何更改:
对于如下配置的路由
[HttpGet("GetRankingByListIdAll/{ListId}")]
您的 http 请求应显示为
/GetUserByListId/59D512FB-1CCF-47E2-8E85-B4F76192D941
您不应在 url 中指定参数名称。 由于参数不是来自 querystring,因此您也不应该指定 [FromQuery]
。
[Route("GetRankingByListIdAll/{ListId}")]
[HttpGet]
public async Task<ActionResult> GetRankingByListIdAll(string ListId)
{
//....
}
为了澄清,网址:
https:∕∕www.mydomain.com∕a∕b∕c∕1∕2∕3?z=1&b=2#tag
细分为:
Scheme: https //before the colon (:)
host: www //before the first period (.)
domain: mydomain.com //before the first slash (/)
path: /a/b/c/1/2/3 //before the question mark (?)
querystring: z=1&b=2 //before the hash/pound symbol (#)
fragment: tag //after the hash/pound symbol
(一般来说)