Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

WebAPI 2 .NET GET com e sem paremetro erro

public class CarrinhoController : ApiController
{
    [HttpGet]
    public Carrinho Get(int id)
    {
        return BDFake.Carrinhos.Where(c => c.Id == id).FirstOrDefault();
    }

    [HttpGet]
    public List<Carrinho> Get()
    {
        List<Carrinho> carrinhos_de_compra = BDFake.Carrinhos.ToList();

        return carrinhos_de_compra;
    }
}

http://localhost:49403/Api/Carrinho/1 - Esse funciona perfeitamente http://localhost:49403/Api/Carrinho/Get?id=1 - Esse funciona perfeitamente

http://localhost:49403/Api/Carrinho/Get - Esse não funciona. erro:

<Error>
<Message>A solicitação é inválida.</Message>
<MessageDetail>
O dicionário de parâmetros contém uma entrada nula para o parâmetro 'id' de tipo que não permite valor anulável 'System.Int32' para o método 'LojaAPI.Models.Carrinho Get(Int32)' em 'LojaAPI.Controllers.CarrinhoController'. Um parâmetro opcional deve ser um tipo de referência, um tipo que permite valor anulável ou declarado como opcional.
</MessageDetail>
</Error>

Ja assim funciona o metodo GET sem parametro

public class CarrinhoController : ApiController
{
    /*[HttpGet]
    public Carrinho Get(int id)
    {
        return BDFake.Carrinhos.Where(c => c.Id == id).FirstOrDefault();
    }*/

    [HttpGet]
    public List<Carrinho> Get()
    {
        List<Carrinho> carrinhos_de_compra = BDFake.Carrinhos.ToList();

        return carrinhos_de_compra;
    }
}

http://localhost:49403/Api/Carrinho/Get - Esse funciona perfeitamente

2 respostas

Olá Cesar,

quando estava com os dois métodos o problema é que ele se perdeu nas rotas. Mesmo sem passar parâmetro, ele acaba batendo no Get que recebe um id, mas como não veio nenhum id ele solta o erro.

solução!
        public HttpResponseMessage Get(int id)
        {
            try
            {
                Carrinho carrinho = BDFake.Carrinhos.Where(c => c.Id == id).FirstOrDefault();

                if(carrinho == null)
                    throw new System.ArgumentException("Parameter cannot be null", "original");

                return Request.CreateResponse(HttpStatusCode.OK, carrinho);
            }
            catch (Exception ex)
            {
                string mensagem = "o carrinho " + id + " não foi encontrado";
                HttpError error = new HttpError(mensagem);
                return Request.CreateResponse(HttpStatusCode.NotFound, error);
            }

        }

        [Route("api/carrinho/get")]
        public HttpResponseMessage Get()
        {
            return Request.CreateResponse(HttpStatusCode.OK, BDFake.Carrinhos.ToList());
        }

Exatamente , tipo que mexer na rota para solucionar esse problema

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software