簡體   English   中英

.NET CORE Web API 路由

[英].NET CORE Web API Routing

I am new to .NET Core Web API and i'm trying to create Web API with 3 POST methods.

添加用戶 更新用戶 刪除用戶

我能夠使用 AddUser POST 方法創建一個 .NET 核心 web api 項目,並且工作正常,但我希望它是 uri 的方式

https://localhost:1234/api/Project/AddUser

https://localhost:1234/api/Project/UpdateUser

https://localhost:1234/api/Project/DeleteUser

當我在默認 swagger 中運行應用程序時,uri 顯示 POST /api/Project 即 https://localhost:1234/api/Project

我正在使用 .NET 核心 web api 5.0

這里的代碼來自我的 controller

namespace ProjectAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [ApiKeyAuth]
    public class ProjectController : ControllerBase
    {
        [HttpPost]
        public async Task<ActionResult<Response>> AddUser([FromBody] Request request)
        {            
            var _message = await DoSomething(request);
            Response response = new Response
            {
                Message = _message
            };
            return response;
        }      
    

        private async Task<string> DoSomething(Request request)
        {
            string msg = string.Format("Add user {0} to {2} is successful", request.User, request.FromRole, request.ToRole);
            return msg;
        }
    }
}

@joshykautz 是對的,您可以為每個操作添加路由

另一種方法是更改 controller 路由而不是觸摸動作:

[Route("api/[controller]/[action]")]
public class ProjectController : ControllerBase
....

但在此之后,如果您需要,您仍然可以為某些操作分配一個非常特殊的路線,例如

[Route("~/api/Project/AddNewUser")]
public async Task<ActionResult<Response>> AddUser( Request request)

不要錯過“~/”。 它適用於 url

https://localhost:1234/api/Project/AddNewUser

給每個動作一個路由屬性。

[HttpPost]
[Route("api/[controller]/AddUser")]
public async Task<ActionResult<Response>> AddUser([FromBody] Request request)
{            
    var _message = await DoSomething(request);
    Response response = new Response
    {
        Message = _message
    };
    return response;
}    

請記住刪除您為 class 定義的路由屬性。

您也可以使用[Route("api/[controller]/[action]")]因為您的方法已經命名為AddUser

[HttpPost]
[Route("api/[controller]/[action]")]
public async Task<ActionResult<Response>> AddUser([FromBody] Request request)
{            
    var _message = await DoSomething(request);
    Response response = new Response
    {
        Message = _message
    };
    return response;
}   

您可以在Microsoft Docs上閱讀更多信息

我建議不要在路由中使用../adduser../updateuser../deleteuser。 它還會導致安全漏洞。

您可以將 API 構建為 /user 並添加;

yourrouter.route('/user/:id?')
.get(user.get)
.post(user.post)
.put(user.put)
.delete(user.delete);

對於相同的 /user 路線。

這意味着,客戶端使用特定請求(GET、POST、PUT 等)以及 ID 和其他參數(如果需要)調用相同的./user。

You can test your API and routing via POSTMAN, by selecting the method when you call the API (eg https://yourdomain/api/user/{parameters})

[action]標記添加到您的 controller 路線將產生您想要的路線格式:

[Route("api/[controller]/[action]")]

但是,我不鼓勵在路由命名中使用動詞。 HTTP 方法已經充分描述了調用給定端點時所采取的操作。

  • POST /api/user創建一個新用戶。

  • GET /api/user獲取用戶。

  • PUT /api/user/{id}更新現有用戶。

  • DELETE /api/user/{id}刪除用戶。

在 RESTful 方法中,路由描述了您在服務器上與之交互的資源,使用的 HTTP 方法描述了操作。 將動作/動詞混合到您的路線中違背了這種心態。

在您的情況下,我會做的是創建一個新的UserController ,它將包含您的用戶資源的端點。 將它們放在ProjectController中,對我來說這聽起來像是應該處理項目、混合職責並使您的代碼難以理解的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM