ApiController получить с идентификатором не работает

Я только начал работать с ApiController. Я пытаюсь выполнить HTTP GET, отправив идентификатор, но он не работает.

Мой ApiController:

[Route("api/Test")]
public class TestController : ApiController
{
    private myEntity db = new myEntity();

    [HttpGet]
    public HttpResponseMessage GetAll()
    {
        // Get a list of customers
        IEnumerable<Customer> customers = db.Customers.ToList();

        // Write the list of customers to the response body
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, customers);

        return response;
    }

    [HttpGet]
    public HttpResponseMessage GetById(int id)
    {
        // Get Customer by id
        Customer customer = db.Customers.Where(x => x.Id == id).FirstOrDefault();

        HttpResponseMessage response;

        if (customer == null)
        {
            response = Request.CreateResponse(HttpStatusCode.NotFound);
            return response;
        } else
        {
            response = Request.CreateResponse(HttpStatusCode.OK, customer);
        }

        return response;
    }

Когда я запускаю его в браузере, метод GetAll работает отлично. Однако когда я пробую GetById:

http://localhost:53198/api/Test/1

Он возвращает:

No HTTP resource was found that matches the request URI http://localhost:53198/api/Test/1

Кто-нибудь знает, что я делаю не так?

Ваш URL неверен: http://localhost:53198/api/Test/GetById/1

DavidG 08.05.2018 18:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 681
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать либо

  • http://localhost:53198/api/Test/GetById/1 (как упоминал DavidG)

или же

Добавление [Route ("{id: int}")] не помогло мне. Та же ошибка

Max Boy 08.05.2018 19:05

@MaxBoy Можете ли вы обновить свой вопрос содержимым класса WebApiConfig

Reza 08.05.2018 19:06

Добавление RoutePrefix работает. Однако, если я отправляю идентификатор, которого нет в базе данных, он просто дает мне пустую страницу в браузерах, а не статус NotFound.

Max Boy 08.05.2018 19:08

@MaxBoy Вы должны вернуть 404, если вы не нашли запись с этим идентификатором в своей базе данных, она не делает это автоматически для вас

Reza 08.05.2018 19:10

Хм ... Я пытался сделать это с помощью response = Request.CreateResponse (HttpStatusCode.NotFound); Это неправильно?

Max Boy 08.05.2018 19:12

@MaxBoy return Request.CreateResponse(System.Net.HttpStatusCode.NotFound)

Reza 08.05.2018 19:39
Ответ принят как подходящий

Если вы используете маршрутизацию атрибутов, вам нужно будет внести несколько изменений, чтобы убедиться, что маршруты действий различны, чтобы избежать конфликтов маршрутов.

[RoutePrefix("api/Test")]
public class TestController : ApiController {
    private myEntity db = new myEntity();

    //GET api/Test
    [HttpGet]
    [Route("")]
    public IHttpActionResult GetAll() {
        // Get a list of customers
        var customers = db.Customers.ToList();    
        // Write the list of customers to the response body
        return OK(customers);
    }

    //GET api/Test/1
    [HttpGet]
    [Route("{id:int}")]
    public IHttpActionResult GetById(int id) {
        // Get Customer by id
        Customer customer = db.Customers.Where(x => x.Id == id).FirstOrDefault();
        if (customer == null) {
            return NotFound();
        }
        return Ok(customer);
    }
}

Предполагается, что маршрутизация атрибутов включена.

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

Ссылка Маршрутизация атрибутов в веб-API ASP.NET 2

RoutePrefix работает. Однако, если я отправляю идентификатор, которого нет в базе данных, он просто дает мне пустую страницу в браузерах, а не статус NotFound.

Max Boy 08.05.2018 19:47

Вам придется отредактировать функцию, чтобы она не возвращалась. Прямо сейчас на телефоне. Обновится, когда я вернусь к своей машине.

Nkosi 08.05.2018 21:18

Спасибо ... Жду. Idk, что такое "редактор функции"

Max Boy 08.05.2018 21:49

@MaxBoy проверяет обновления, используя рекомендованный синтаксис из документации.

Nkosi 09.05.2018 01:05

Спасибо ... Я заменил свой код на использование NotFound (); но это ничего не изменило. Когда я делаю запрос на получение с идентификатором, которого не существует, он просто возвращает пустую страницу. Я имею в виду, он не возвращает ошибку / предупреждение NotFound

Max Boy 09.05.2018 20:47

Другие вопросы по теме