0

Есть такой код:

    [HttpGet("{id}")]
    public async Task<IActionResult> GetID(int? id)
    {
        if (id == null || id <= 0)
        {
            return BadRequest();
        }
    var User = await _context.Users.FindAsync(id);

    if (User == null)
    {
        return NotFound();
    }

    return Ok(User);
}

По условию если id не поступает и остается пустым, должна быть 400 ошибка, а на деле выдает 404, как мне это исправить? Я пробовал вместо int использовать string, но это не помогло.

Зонтик
  • 2,262
  • 2
  • 11
  • 39
  • Вы уверены, что в id ничего не поступает? – T0xee.n17 Feb 12 '23 at 14:58
  • Если я правильно понимаю, что URL с пустым id выглядит так: https://localhost:44311/Api/User/ или https://localhost:44311/Api/User то уверен. Так как я новичок и это мой первый проект в web-api и вообще связанный в back-end, я могу что то путать и на самом деле это не пустое значение. – slabada Feb 12 '23 at 15:20
  • Вы возьмите дебаггер и проверьте, лежит ли в id что-нибудь – T0xee.n17 Feb 12 '23 at 15:31
  • Я ставил точку остановки, когда пишу localhost:44311/Api/User/ точка остановки просто НЕ срабатывает, то есть не поступает ровном счет ничего. А когда уже пишу localhost:44311/Api/User/2 точка остановки срабатывает и id становиться равным 2. Я не знаю, может я что то делаю не так, но облазив интернет я другого решения просто не нашел, как проверить на пустое значение id. – slabada Feb 12 '23 at 15:37
  • Стоп, если id - часть адреса, то ошибку 404 генерирует не ваш код, а сам сервер, ведь вы пытаетесь зайти по несуществующему адресу. В таком случае id лучше передавать через параметры. – T0xee.n17 Feb 12 '23 at 15:49
  • Эх, весь день убил на эту проблему, а решение оказалось таким простым. Спасибо за помощь. – slabada Feb 12 '23 at 15:59
  • Получается, что нельзя передать пустое значение через адрес никаким способом ? – slabada Feb 12 '23 at 16:05
  • Если это числовое значение, то можно передавать 0 или none например. Можно ещё повесить обработчик на адрес без значения, и в нём выкидывать ошибку. Однако обычно в таких случаях предпочтительнее использовать параметры, ведь для этого они и нужны. – T0xee.n17 Feb 12 '23 at 16:09

2 Answers2

0

int - это value type. Он не может принимать значение null нужно его привести к ссылочному

  • 1
    Вы не правы, тк id имеет ссылочный тип int?, который допускает значение null – T0xee.n17 Feb 12 '23 at 14:55
  • @T0xee.n17 int - это примитивный тип, и он не может иметь значение null, в ответе это сказано верно. – Зонтик Feb 12 '23 at 15:14
  • @user20769056 пожалуйста, постарайтесь писать более развёрнутые ответы. На данный момент ваш ответ не совсем понятен. – Зонтик Feb 12 '23 at 15:16
  • 1
    @Зонтик, не спорю, формально высказывание верное, однако оно не имеет отношения к ответу, т.к. там тип int? – T0xee.n17 Feb 12 '23 at 15:29
  • А, ой. Я невнимательно смотрел код. Прошу прощения – user20769056 Feb 13 '23 at 08:51
0

посмотрел на код... и на вскидку .. попробуйте проверять id перед его использованием в методе FindAsync.

Например, так:

[HttpGet("{id}")]
public async Task<IActionResult> GetID(int? id)
{
    if (!id.HasValue || id <= 0)
    {
        return BadRequest();
    }
var User = await _context.Users.FindAsync(id.Value);

if (User == null)
{
    return NotFound();
}

return Ok(User);

}

по идее теперь, если id пустой или не указан, будет выдаваться код ошибки 400 Bad Request.

надеюсь не много помог)

microup
  • 665