gpt4 book ai didi

使用 PUT 的 ASP.NET Web API 路由

转载 作者:行者123 更新时间:2023-12-01 05:23:09 26 4
gpt4 key购买 nike

我正在尝试为我认为非常简单的事情设置 Web API 路由。但是,Web API 中的路由似乎与不同的 HTTP 动词不一致。假设我有这些 Action 的 Controller ......

public class AvalancheController : ApiControllerBase
{

// GET api/avalanche
public IEnumerable<Avalanche> Get() {}

// GET api/avalanche/5
public Avalanche Get(int id) {}

// GET api/avalanche/ActionTest/5
[ActionName("ActionTest")]
public Avalanche GetActionTest(int id) {}

// GET api/avalanche/ActionTest/2
[ActionName("ActionTest2")]
public Avalanche GetActionTest2(int id) {}

// POST api/avalanche
public void Post([FromBody]Avalanche value) {}

// PUT api/avalanche/5
public void Put(int id, [FromBody]Avalanche value) {}

// PUT api/avalanche/test/5
[ActionName("Test")]
public void PutTest(int id, [FromBody]Avalanche value) {}

// DELETE api/avalanche/5
public void Delete(int id) {}
}

我定义了以下路线...
    config.Routes.MapHttpRoute(
name: "ActionRoutes",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new
{
controller = "Avalanche",
action = "(ActionTest|ActionTest2|Test)"
}
);


config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

然后我最终定义了以下路线......
GET api/Avalanche/ActionTest/{id}
GET api/Avalanche/ActionTest2/{id}
PUT api/Avalanche/Test/{id}
GET api/Avalanche
POST api/Avalanche
DELETE api/Avalanche/{id}

为什么没有选择默认的 PUT 路由?默认GET和默认PUT的路由有什么不同?我尝试以各种可以想象的方式装饰函数,但得到了相同的结果。

主要是我想知道如何获取默认的 PUT 路由。如果您对如何修改这些路由有任何建议,这样我就不必为每个 Controller 指定一个路由来指定同样棒的 Action 名称。

谢谢!

伊恩

编辑:我今天早上注意到以下路线也没有被定义..
GET api/Avalanche/{id}

最佳答案

很高兴您找到了解决问题的方法。但我会根据我对 REST 服务的学习提供我的反馈。 REST webservice 的想法是将每个 url 解析为资源(或实体),并根据 HttpVerb 决定操作。在这种情况下,您有三个 GET 操作,可以很好地进行修改。

但我认为 Controller 也可以重新安排为具有单一的 GET 操作和单一的责任,从而更好的可维护性。例如:

雪崩 Controller

public class AvalancheController : ApiControllerBase
{
public IEnumerable<Avalanche> GET()
{

}

public void POST(Avalanche avalanche)
{

}
}

可以假设在顶层处理所有雪崩,以下是要定义的操作。

GET : 返回所有雪崩
POST:插入新的雪崩
PUT:未使用
删除:未使用

AvalancheDetailsController
public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(int id)
{

}


public int PUT(int id)
{

}

public int DELETE(int id)
{

}
}

可以假设处理单个雪崩,以下是要定义的操作。

GET : 返回单个雪崩
POST:未使用
PUT:更新单个雪崩
DELETE:删除单个雪崩

现在我假设我们在 Controller 之间有明确的区别。在您提到的 OP 中,可以有不同的 GET 操作,但它只返回单个 Avalanche .因此,我将更改 GET 方法以将对象作为输入并检查值,即
public class AvalanceRequest
{
public int? Id {get;set;}
public string Name {get;set;}
}


public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(AvalanceRequest request)
{
//write business logic based on parameters
if(request.Id.HasValue)
//return avalanche;
if(request.Name.IsNullOrEmpty())
//return avalanche
}
//other methods
}

处理 URL 时,我并没有真正使用 WebAPI,而是尝试使用 ServiceStack 来开发 REST 服务。它允许附加 url 独立于 Controller 名称。

网址
api/Avalanche --> AvalancheController(基于HttpVerb调用操作)
api/Avalanche/Id --> AvalancheDetailsController(基于HttpVerb调用操作)

我不知道是否可以在 WebAPI 中同样附加 url,否则您最终会使用默认配置并通过调用。 api/Avalanche 和 api/AvalancheDetails/id。
 config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

我很抱歉长帖子,希望它是有道理的。

关于使用 PUT 的 ASP.NET Web API 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15402674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com