# Como chamar uma API externa a partir do agilityflow

Este exemplo mostra como fazer uma requisição HTTP `POST` para uma API externa no contexto do AgilityFlow.


#### Importante sobre `CancellationToken`

O método `PostAsync` **deve sempre utilizar** um `CancellationToken` para garantir que a requisição seja cancelável, evitando problemas em fluxos interrompidos ou expirados.

Para recuperar o `CancellationToken`, utilize o método adequado ao **contexto em que o código está sendo executado**. Alguns exemplos:

- Em **regras de negócio** do formulário:  
    `FormContext.GetCurrentCancellationToken()`
- Em chamadas feitas dentro de uma **API customizada**:  
    `ApiContext.GetCurrentCancellationToken()`
- Em **componentes Razor (.cshtml)** do formulário:  
    `PageContext.GetCurrentCancellationToken()`
- E assim por diante, conforme o contexto (`GlobalContext`,`CustomPageContext`,`CardContext`, etc.)

> Basta utilizar o método `GetCurrentCancellationToken()` do contexto atual.


#### Observação

- Troque `<<URL_DA_API>>` pela URL real da API que deseja acionar.

### Como chamar a api em cada contexto?

#### No FormContext

Crie uma regra de negócio e dentro da regra de Programação em C#, utilize o código abaixo

```c#
public async Task ExecuteAsync()
{
    var formId = FormContext.FormId.Value.ToString();
    await CallExternalApiAsync(formId);
}

public async Task CallExternalApiAsync(string qualquerParametro)
{
    if (string.IsNullOrWhiteSpace(qualquerParametro)) return;

    var payload = new
    {
        parametroParaApi = qualquerParametro
    };

    using (var httpClient = new HttpClient())
    {
        var content = new StringContent(
            JsonConvert.SerializeObject(payload),
            Encoding.UTF8,
            "application/json"
        );

        await httpClient.PostAsync("<<URL_DA_API>>", content, FormContext.GetCurrentCancellationToken());
    }
}
```

#### Na ApiContext

Na programação em C#

```c#
public async Task RunAsync()
{
    await CallExternalApiAsync("exemplo de parametro");
}

public async Task CallExternalApiAsync(string qualquerParametro)
{
    if (string.IsNullOrWhiteSpace(qualquerParametro)) return;

    var payload = new
    {
        parametroParaApi = qualquerParametro
    };

    using (var httpClient = new HttpClient())
    {
        var content = new StringContent(
            JsonConvert.SerializeObject(payload),
            Encoding.UTF8,
            "application/json"
        );

        await httpClient.PostAsync("<<URL_DA_API>>", content, ApiContext.GetCurrentCancellationToken());
    }
}
```

#### No PageContext dos componentes Cshtml do formulário

Na programação em C# razor dos componente

```c#
@{
   
    string qualquerParametro = "";
    if (!string.IsNullOrWhiteSpace(qualquerParametro)){
      var payload = new
      {
          parametroParaApi = qualquerParametro
      };
  
      using (var httpClient = new HttpClient())
      {
          var content = new StringContent(
              JsonConvert.SerializeObject(payload),
              Encoding.UTF8,
              "application/json"
          );
  
          await httpClient.PostAsync("<<URL_DA_API>>", content, PageContext.GetCurrentCancellationToken());
      }
    }
}
```

#### No GlobalContext

Na programação em C#

```c#
public async Task CallExternalApiAsync(string qualquerParametro)
{
    if (string.IsNullOrWhiteSpace(requestId)) return;

    var payload = new
    {
        parametroParaApi = qualquerParametro
    };

    using (var httpClient = new HttpClient())
    {
        var content = new StringContent(
            JsonConvert.SerializeObject(payload),
            Encoding.UTF8,
            "application/json"
        );

        await httpClient.PostAsync("<<URL_DA_API>>", content, GlobalContext.GetCurrentCancellationToken());
    }
}
```

#### No CustomPageContext

Na programação em C# do custom page context

```c#
public async Task CallExternalApiAsync(string qualquerParametro)
{
    if (string.IsNullOrWhiteSpace(requestId)) return;

    var payload = new
    {
        parametroParaApi = qualquerParametro
    };

    using (var httpClient = new HttpClient())
    {
        var content = new StringContent(
            JsonConvert.SerializeObject(payload),
            Encoding.UTF8,
            "application/json"
        );

        await httpClient.PostAsync("<<URL_DA_API>>", content, CustomPageContext.GetCurrentCancellationToken());
    }
}
```