Нужна помощь в вызове методов контроллера Web Api для получения данных

Я новичок в Web Api (я, вероятно, здесь упускаю что-то очень простое) У меня есть проект Web Api с ProductsController.cs который имеет свойство типа List<Product> и я просто хочу вызвать API в браузере, например localhost/api/products/1 или же /api/products/getproduct/1 чтобы получить ответ продукта для указанного идентификатора в URL, но я не могу получить его для получения каких-либо данных. Я получаю ошибку "не найден" каждый раз. Чего мне не хватает, чтобы заставить его найти данные и получить ответ?

Я пробовал следующее:

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";
}

1 ответ

Решение

Убедитесь, что маршрутизация настроена правильно

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);
    }
}
Другие вопросы по тегам