如何将不同类型的参数传递给 ASP.NET Core 5 Web API

问题描述 投票:0回答:2

我正在创建一个 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中做到这一点,我想知道是否有人可以帮助我。

c# asp.net-core asp.net-core-webapi asp.net-core-5.0
2个回答
3
投票

正如你在 get 方法中看到的,我输入了“[Route]”来设置路线并 在post方法中我将路线放在

[HttpPost("")]
中,但我不能 传递参数,我已经尝试在 Get 方法中使用路由 像这样:
[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查看,结果如下:

enter image description here

如果你使用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>

结果如下:

enter image description here


2
投票

.Net 5 中关于带有属性路由的 REST API 的变化很小。 我强烈建议您仔细阅读以下内容:

ASP.NET Web API 2 中的属性路由

在 ASP.NET Web API 2 中创建具有属性路由的 REST API

没有提及任何更改:

.NET 5 中的重大更改

对于如下配置的路由

[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
(一般来说)

© www.soinside.com 2019 - 2024. All rights reserved.