C# 需要帮助调用Web Api控制器方法来检索数据吗
我不熟悉Web Api(这里可能缺少一些非常简单的东西)我有一个带有C# 需要帮助调用Web Api控制器方法来检索数据吗,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我不熟悉Web Api(这里可能缺少一些非常简单的东西)我有一个带有ProductsController.cs的Web Api项目,该项目的属性类型为List,我只想在浏览器中调用Api,例如localhost/Api/products/1或/Api/products/getproduct/1,以检索url中指定Id的产品响应,但我无法获取任何响应数据。每次都会出现“未找到”错误。我缺少什么来让它找到数据并检索响应 我尝试了以下方法: public IHttpActionResult Get(i
ProductsController.cs
的Web Api项目,该项目的属性类型为List
,我只想在浏览器中调用Api,例如localhost/Api/products/1
或/Api/products/getproduct/1
,以检索url中指定Id的产品响应,但我无法获取任何响应数据。每次都会出现“未找到”错误。我缺少什么来让它找到数据并检索响应
我尝试了以下方法:
public IHttpActionResult Get(int id)
{
var product = products.FirstOrDefault(p => p.Id == id);
if (product == null)
{
return NotFound();
}
else
{
return Ok(product);
}
}
甚至以下仍然返回未找到的内容:
public string Get(int id)
{
return "product test";
}
确保路由配置正确 WebApiConfig.cs
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
从那里,您有两个选择路由到操作
以公约为基础
public class ProductsController : ApiController {
//...constructor code removed for brevity
[HttpGet] // Matches GET api/products
public IHttpActionResult GetAllProducts() {
return Ok(products);
}
[HttpGet] // Matches GET api/products/1
public IHttpActionResult GetProduct(int id) {
var product = products.FirstOrDefault(p => p.Id == id);
if (product == null) {
return NotFound();
}
return Ok(product);
}
}
或属性路由
[RoutePrefix("api/products")]
public class ProductsController : ApiController {
//...constructor code removed for brevity
[HttpGet]
[Route("")] // Matches GET api/products
public IHttpActionResult GetAllProducts() {
return Ok(products);
}
[HttpGet]
[Route("{id:int}")] // Matches GET api/products/1
public IHttpActionResult GetProduct(int id) {
var product = products.FirstOrDefault(p => p.Id == id);
if (product == null) {
return NotFound();
}
return Ok(product);
}
}
在您的方法上面,您需要添加如下内容:
[HttpPost][Route(“~/api/products/”)
我也不知道这些行的名称,不过…@MauricioAriasOlave感谢您的评论。我想这叫做属性路由。谢谢你的回答,我稍后会试试。就最佳实践而言,使用属性路由方法还是基于约定的方法更好?如果两者同时使用会发生什么情况?@Theomax这完全取决于开发者的偏好。每种选择都有其利弊。应用程序可以跨多个控制器利用/混合这两个选项。但是,单个控制器使用基于约定的路由或属性路由。将[HttpGet]添加到GetProducts(int id)对于URL/api/products/1是有效的,尽管我不明白为什么,因为它没有引用该方法名称,而事实上它是一个接受int参数的HttpGet方法。我尝试对一个名为GetAllProducts()的方法执行相同的操作,该方法应返回整个产品集合,但是显然它不能用/api/products/GetAllProducts调用-我需要在routeconfig中映射它吗?@Theomax因为控制器中有多个GET,所以必须在两个操作GetAllProducts
和GetProducts
上指定HttpGet
GetAllProducts
将映射到“/api/products”,因为{id}
是可选的GetProducts(intid)
将映射到`/api/products/1`