C# - Consumindo APIs com Flurl \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 16 Horas 

 13 Min 

 20 Seg 

   Tempo restante da oferta: 16 13 20 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) C# - Consumindo APIs com Flurl  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# C# - Consumindo APIs com Flurl

 Veja como consumir dados de uma API no C#, utilizando a biblioteca Flurl.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/c-sharp-consumindo-apis-com-flurl.png)  

Com a diversificação do acesso, está se tornando um padrão a criação de back-end, [APIs](https://www.treinaweb.com.br/blog/o-que-e-uma-api/), que posteriormente serão consumidas por outras aplicações. Por isso, atualmente é imprescindível saber realizar este procedimento. Felizmente, no C#, a biblioteca Flurl facilita, e muito, este processo.

## Flurl

Criada por Todd Menier, [Flurl ](https://flurl.dev/) é uma biblioteca open source para .NET. Ela se define como um builder de URL, moderno, assíncrono, fluent, portável, testável, entre outras buzzword e uma biblioteca de requisições HTTP.

De forma simples, ela nos permite criar requisições HTTP que são facilmente testáveis. Entretanto, não abordaremos este detalhe aqui. Neste arquivo, veremos apenas a criação de requisições.

[  ![C# (C Sharp) Intermediário](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) Intermediário Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-intermediario)

## Aplicação base

Para exemplificar o uso da biblioteca, irei utilizar como base a aplicação demonstrada no artigo da biblioteca [RepoDB](https://www.treinaweb.com.br/blog/utilizando-o-hybrid-orm-repodb-em-uma-aplicacao-asp-net-core/) e o pacote [Tw Dev Server](https://www.treinaweb.com.br/blog/tw-dev-server-como-ele-pode-te-ajudar-a-estudar-programacao/) do [Akira Hanashiro](https://www.treinaweb.com.br/blog/author/akira-hanashiro/).

## Consumindo dados da API

No momento, ao executar a aplicação, os produtos são listados do banco:

![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/list_products.png)

Iremos alterá-la pra que esses dados sejam obtidos pela API.

Por esta aplicação adotar o padrão repository, as principais alterações serão realizadas nesta camada. As demais sofrerão apenas adaptações pontuais.

A primeira coisa à ser feita é adicionar a biblioteca Flurl:

```shell
dotnet add package Flurl.Http

```

Por ser uma biblioteca fluent, seus métodos são de extensão. Assim, inicialmente iremos definir a url:

```csharp
 const string url = "http://localhost:3002/api/products";

```

Em seguida iremos alterar o método `FindAll`, que no momento tem o conteúdo abaixo:

```csharp
public IEnumerable FindAll()
{
    return QueryAll();
}

```

A obtenção de dados é feita através de uma requisição GET. Como os dados da nossa API são retornados como JSON, a Flurl possui o método de extensão `GetJsonAsync` que já cria esta requisição e parseia os dados:

```csharp
public async Task FindAll()
{
    return await url.GetJsonAsync();
}

```

Como `GetJsonAsync` é assíncrono, note que foi necessário definir o `FindAll() `como assíncrono. Com isso, será necessário modificar a interface:

```csharp
Task FindAll();

```

E o controller:

```csharp
public async Task Index()
{
    return View((await productRepository.FindAll()).ToList());
}

```

Também será necessário modificar o model, porque os ids criados pela API são GUID:

```csharp
public class Product
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
    public double Price { get; set; }
}

```

Como a API não possui nenhum dado, por enquanto a listagem não mostra nada:

![Listagem de produtos com nenhum item](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/listagem_vazia.png)

## Enviando dados para a API

Com a listagem pronta, vamos enviar dados para a API. Isso é feito via uma requisição POST. Assim, como a GET, a biblioteca possui o método de extensão `PostJsonAsync` que já facilita a criação desta requisição:

```csharp
public async Task Add(Product item)
{
    await url.PostJsonAsync(item);
}

```

Também é necessário modificar a interface:

```csharp
Task Add(T item);

```

E o controller:

```csharp
public async Task Create([Bind("Id,Name,Quantity,Price")] Product product)
{
    if (ModelState.IsValid)
    {
        await productRepository.Add(product);
        return RedirectToAction("Index");
    }

    return View(product);
}

```

Agora podemos adicionar dados na API e consumi-los:

![Listagem de produtos com um item](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/listagem_com_um_item.png)

## Atualizando dados da API

O processo de atualização ocorre em duas etapas. Inicialmente é necessário obter os dados do registro que será atualizado. Para isso, deve ser feita uma requisição GET, passando o id do registro:

```csharp
public async Task FindByID(string id)
{
    return await url
                .SetQueryParams(new { id = id })
                .GetJsonAsync();
}

```

Note que estamos utilizando o método `SetQueryParams` passar o id via querystring. No final, teremos uma URL no seguinte formato: `http://localhost:3002/api/products?id=`.

Assim como antes, também é necessário mudar a interface:

```csharp
Task FindByID(string id);

```

E o controller:

```csharp
public async Task Edit(string id)
{
    if (id == null)
    {
        return StatusCode(StatusCodes.Status400BadRequest);
    }
    Product product = await productRepository.FindByID(id);
    if (product == null)
    {
        return StatusCode(StatusCodes.Status404NotFound);
    }
    return View(product);
}

```

Aproveite e altere o método de detalhes:

```csharp
public async Task Details(string id)
{
    if (id == null)
    {
        return StatusCode(StatusCodes.Status404NotFound);
    }
    Product product = await productRepository.FindByID(id);
    if (product == null)
    {
        return StatusCode(StatusCodes.Status404NotFound);
    }
    return View(product);
}

```

Agora ao clicar no link de edição (ou detalhes), os dados do produto serão mostrados:

![Tela de edição mostrando os detalhes de um produto](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/edic%CC%A7a%CC%83o.png)

A atualização dos dados é realizada via uma requisição PUT e como deve imaginar, a Flurl também fornece um método de extensão que facilita a implementação desta requisição:

```csharp
public async Task Update(Product item)
{
    await url
            .SetQueryParams(new { id = item.Id })
            .PutJsonAsync(item);
}

```

Note que também é necessário passar o ID via querystring, pois esta é uma especificação da API.

Não se esqueça de mudar a interface:

```csharp
Task Update(T item);

```

E o controller:

```csharp
public async Task Edit([Bind("Id,Name,Quantity,Price")] Product product)
{
    if (ModelState.IsValid)
    {
        await productRepository.Update(product);
        return RedirectToAction("Index");
    }
    return View(product);
}

```

Agora, poderemos alterar os nossos registros:

![Listagem de produtos exibindo um produto alterado](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/listagem_com_um_item_alterado.png)

## Excluindo dados da API

Para finalizar, falta implementar apenas a exclusão dos dados. Isso é feito via uma requisição DELETE, que pode ser implementada via o método de extensão `DeleteAsync`:

```csharp
public async Task Remove(string id)
{
    await url
            .SetQueryParams(new { id = id })
            .DeleteAsync();
}

```

Não se esqueça que é necessário alterar a interface:

```csharp
Task Remove(string id);

```

E o controller:

```csharp
public async Task DeleteConfirmed(string id)
{
    await productRepository.Remove(id);
    return RedirectToAction("Index");
}

```

Ao remover o único registro da nossa lista, ela voltará a ficar vazia:

![Listagem de produtos com nenhum item](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/listagem_vazia.png)

[  ![React Native - Componentes nativos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/react-native.svg)   Curso React Native - Componentes nativos Conhecer o curso ](https://www.treinaweb.com.br/curso/react-native-componentes-nativos)

## Conclusão

Note que com poucas alterações, conseguimos alterar a fonte de dados da aplicação para uma API. E esta comunicação com a API foi facilitada graças a biblioteca Flurl.

Esta biblioteca fornece uma grande gama de recursos e opções que conheceremos em artigos futuros. Entretanto, caso necessite trabalhar com API no .NET, não deixe de dar uma olhada [na sua documentação](https://flurl.dev/docs/fluent-http/). Tenho certeza que ela irá facilitar, e muito, o seu trabalho.

- [ #C# ](https://www.treinaweb.com.br/blog/tag/csharp)
- [ #API ](https://www.treinaweb.com.br/blog/tag/api)
- [ #Flurl ](https://www.treinaweb.com.br/blog/tag/flurl)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/12/CAPA-PYTHON-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Como trabalhar com data e hora no Python ](https://www.treinaweb.com.br/blog/como-trabalhar-com-data-e-hora-no-python) 

     Como trabalhar com data e hora no Python com Datetime. No decorrer deste artigo, veremos exemplos de como utilizar o módulo datetime...

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/07161700/gerenciamento-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     4 anos atrás

    ##  [ Empacotando e publicando pacotes Python no PyPi ](https://www.treinaweb.com.br/blog/empacotando-e-publicando-pacotes-python-no-pypi) 

     Neste artigo iremos aprender como funciona o processo de empacotar e distribuir nossos próprios pacotes Python no PyPi.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/ASP-NET-ODATA-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Adicionando OData em uma API ASP.NET Core ](https://www.treinaweb.com.br/blog/adicionando-odata-em-uma-api-asp-net-core) 

     OData é um padrão de boas práticas para a criação de API. Veja os recursos que este padrão fornece para uma API ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/10/30133314/swagger-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Documentando uma ASP.NET Core Web API com o Swagger ](https://www.treinaweb.com.br/blog/documentando-uma-asp-net-core-web-api-com-o-swagger) 

     Aprenda a documentar uma aplicação ASP .NET Core Web API com o Swagger.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/consumindo-api-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     6 anos atrás

    ##  [ Consumindo APIs com Python - Parte 2 ](https://www.treinaweb.com.br/blog/consumindo-apis-com-python-parte-2) 

     Veja neste artigo como consumir APIs com Python.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/consumindo-api-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     6 anos atrás

    ##  [ Consumindo APIs com Python - Parte 1 ](https://www.treinaweb.com.br/blog/consumindo-apis-com-python-parte-1) 

     Veja neste artigo como consumir APIs com Python.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/04/LAYOUT-FLUTTER-RESPONSIVO-400x280.png)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     5 anos atrás

    ##  [ Como construir um layout Flutter responsivo ](https://www.treinaweb.com.br/blog/como-construir-um-layout-flutter-responsivo) 

     Neste artigo veremos algumas das abordagens e widgets que são usados no desenvolvimento de aplicativos responsivos com Flutter .

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/como-instalar-o-java-e-nosso-primeiro-exemplo-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Conheça o recurso de Records no Java ](https://www.treinaweb.com.br/blog/conheca-o-recurso-de-records-no-java) 

     Neste artigo, vamos aprender sobre o recurso de Records no Java. Veremos como utilizar esse recurso, suas vantagens e desvantagens.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/ARTIGO-DART-400x280.jpg)  [ Dart ](https://www.treinaweb.com.br/blog/categoria/dart) 

     4 anos atrás

    ##  [ Guia da linguagem dart ](https://www.treinaweb.com.br/blog/guia-da-linguagem-dart) 

     Nesse guia da linguagem Dart você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação Dart.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/PUB-DEV-400x280.jpg)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     4 anos atrás

    ##  [ Gerenciador de pacotes Dart e Flutter ](https://www.treinaweb.com.br/blog/gerenciador-de-pacotes-dart-e-flutter) 

     Saiba o que é o gerenciador de pacotes Dart e Flutter, como utilizar um pacote, biblioteca instalada por ele e sobre o pubspec.yaml.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/12150130/MATERIAL-DESIGN-400x280.png)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     7 anos atrás

    ##  [ O que é Material Design? ](https://www.treinaweb.com.br/blog/o-que-e-material-design) 

     Se você deseja criar rapidamente aplicações bonitas e utilizáveis, dê uma conferida no Material Design.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/04/13172051/CORS-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     7 anos atrás

    ##  [ O que é CORS e como resolver os principais erros ](https://www.treinaweb.com.br/blog/o-que-e-cors-e-como-resolver-os-principais-erros) 

     Nesse artigo vamos entender o que é CORS, quais os principais erros relacionados com ele, suas principais causas e como resolve-los corretamente.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **16h 13min 20s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
