Ol√° pessoal, hoje eu gostaria de falar e mostrar como customizar as pesquisas no Web API, ou seja, saindo um pouco da rotina j√° criada pela ferramenta Visual Studio da Microsoft, vamos criar outros m√©todos dentro do Web API para pesquisas. √Č importante entender que al√©m do trivial que s√£o os m√©todos PUT, DELETE e GET, existe a possibilidade de criarmos outros usando outros nomes na assinatura do m√©todo.

Utilizei:
- Ferramenta: Visual Studio 
- Linguagem C#
- Tecnologia Web API / REST
- Busca no banco de dados: Linq

Esse m√©todo que vou criar fica dispon√≠vel para ser chamado por outras aplica√ß√Ķes sem qualquer problema. Pode ser chamado at√© pela pr√≥pria aplica√ß√£o que est√° usando a tecnologia. A assinatura do m√©todo faz com que a busca de um modo geral passe par√Ęmetros como ‚Äú?‚ÄĚ interroga√ß√£o e ‚Äú&‚ÄĚ comercial.

Lembre-se de ler todos os artigos anteriores que falei sobre Web API, cada passo é importante até chegar aqui. Segue os links abaixo dos artigos anteriores:

Criando e Consumindo Web API Parte 1

Criando e Consumindo Web API Parte 2

Criando e Consumindo Web API Parte 3

Criando e Consumindo Web API Parte 4

Criei dentro da classe ‚Äúcontroller‚ÄĚ para determinado contexto um m√©todo que soma valores. O m√©todo recebe dois par√Ęmetros do tipo ‚ÄúInt‚ÄĚ e retorna um do tipo ‚ÄúInt32‚ÄĚ. Esse m√©todo n√£o √© um padr√£o do Web API, pra isso coloquei o nome de GetUsuariosByIdade. Veja a listagem 1.

Listagem 1. Criando método que soma valores

       public Int32 GetUsuariosByIdade(int idade, int soma)
        {
            return idade + soma;
        }

Como esse m√©todo est√° no contexto de usu√°rio, para acess√°-lo basta digitar o endere√ßo api/usuario/?idade=10&soma=10. Note que n√£o coloco o nome do m√©todo, passo apenas os par√Ęmetros com os nomes iguais. Em resumo, √© assim que funciona quando criamos algum m√©todo que n√£o √© padr√£o.

Outro exemplo √© a busca pelo nome da pessoa. Por padr√£o, a busca de forma geral √© sem a passagem de par√Ęmetros, por exemplo: GetUsuarios(). Caso queira pegar um usu√°rio pelo nome passando o par√Ęmetro, √© necess√°rio gerar outro m√©todo. A listagem 2 mostra como buscar os usu√°rios pelo nome usando Linq.

Listagem 2. Buscando os usu√°rios pelo nome.

public IEnumerable GetUsuarioByName(string name)
        {
            var usuario = db.Usuarios.Where(x => x.Nome.Contains(name)).AsEnumerable();
            if(usuario == null)
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));

            return usuario;
        }

Note que na listagem 2, o nome do m√©todo √© GetUsuarioByName recebe um par√Ęmetro do tipo ‚Äústring‚ÄĚ chamado ‚Äúname‚ÄĚ. Na primeira linha do m√©todo eu busco a tabela de usu√°rios where o campo ‚ÄúNome‚ÄĚ cont√©m o valor da vari√°vel ‚Äúname‚ÄĚ. Isso significa que, se a vari√°vel ‚Äúname‚ÄĚ tiver o valor de ‚ÄúMau‚ÄĚ e retornar√° todos os nomes que come√ßam ou terminam com esse valor, depois os dados ser√£o armazenados na vari√°vel usuario que √© verificada logo em seguida. Se o valor for igual a null, faz com que um erro retorne. No final do m√©todo o comando ‚Äúreturn usuario‚ÄĚ retorna os dados do tipo ‚ÄúIEnumerable ‚ÄĚ.¬†

Para acessar esse m√©todo via browser ou no momento de consumir usando qualquer linguagem de programa√ß√£o, √© necess√°rio chamar o seguinte endere√ßo: ‚Äúapi/usuario/?name=valor‚ÄĚ. Seguindo o nosso exemplo citado acima, seria: ‚Äúapi/usuario/?name=Mau‚ÄĚ.

Uma dica importante √© n√£o colocar os par√Ęmetros com o mesmo nome, assim voc√™ pode criar v√°rios m√©todos sem qualquer problema de conflito. Isso porque os m√©todos s√£o identificados pelos par√Ęmetros passados.¬†

Veja o resultado da pesquisa na imagem 1.


Imagem 1 ‚Äď Pesquisando nomes

A pesquisa √© realizada quando o usu√°rio digita o valor no campo e clica no bot√£o pesquisar. A listagem 3 mostra o que foi feito no bot√£o pesquisar para consumir o m√©todo usando par√Ęmetros.

Listagem 3. Consumindo os dados por par√Ęmetro.

protected void cmdPesquisar_Click(object sender, EventArgs e)
        {
            System.Net.Http.HttpResponseMessage response = client.GetAsync("api/usuario/?name=" + txtNome.Text).Result;
            if (response.IsSuccessStatusCode)
            {
                usuariosUri = response.Headers.Location;
                var usuarios = response.Content.ReadAsAsync>().Result;

                GridView1.DataSource = usuarios;
                GridView1.DataBind();
            }
            else
                Response.Write(response.StatusCode.ToString() + " - " + response.ReasonPhrase);
        }

Espero que tenham entendido como usar e como chamar, qualquer d√ļvida pode entrar em contato pelo site www.mauriciojunior.org. Em breve publico mais um artigo e uma s√©rie de v√≠deos mostrando na pr√°tica. Abra√ßo a todos.