# Programação em C# - Na API de integração (POST) As informações descritas abaixo referem-se as APIs de **POST**
IMPORTANTE: as variáveis e métodos descritos aqui só funcionarão na programação C# na **API de integração**. Para a programação C# nas Regras de Negócio de um formulário [clique aqui](https://wiki.agilityflow.io/books/manual-de-customiza%C3%A7%C3%A3o/page/programa%C3%A7%C3%A3o-em-c---na-regra-de-neg%C3%B3cio "Programação em C# - Na Regra de Negócio")
O agilityflow permite a customização da API em C#, além de já disponibilizar diversas bibliotecas e funções para facilitar sua programação, incluindo acesso a dados, validações, envio de e-mail, notificação, entre outras.Para cada requisição na API é criada uma transação de banco de dados, essa transação é única em toda execução da API e é gerenciada automaticamente pelo Agilityflow, caso você prefira, você pode fazer esse gerenciamento seguindo esses passos, [veja mais detalhes aqui](https://wiki.agilityflow.io/link/90#bkmrk-%E2%A0-15)
Abaixo mostramos alguns exemplos, se o material abaixo não for suficiente , entre em contato com nossa equipe. #### Variáveis disponíveis**Variável** | **Tipo** | |
content | string | Conteúdo enviado no Body da API
No caso se ser enviado uma string com o JSON, por exemplo no formato:
{ nome: 'José', email: 'jose@xxxx.com'}
Você pode converter essa string para JSON e utilizá-la como object
`var json = Newtonsoft.Json.JsonConvert.DeserializeObject |
**Método** | **Retorno** | |
**HasProperty**(dynamic json, string nomePropriedade) | bool (true or false) | Testa se o JSON tem uma determinada propriedade. Por exemplo, a sua API espera receber o JSON no formato: { nome: 'José', email: 'jose@xxxx.com'} Porém recebe o JSON formato: { nomecompleto: 'José da Silva', idade: '21'} Como a propriedade NOME e EMAIL não existem no JSON recebido, o seu programa pode dar erro. Para evitar o erro, utilize o método HasProperty(...) Como no exemplo abaixo: `if (json != null)` `{` `if (JsonHelper.HasProperty(json, "nome") && JsonHelper.HasProperty(json, "email") ){` `var nome = json["nome"].ToString();` `var email= json["email"].ToString();` `}` `}` |
`Newtonsoft.Json.JsonConvert.DeserializeObject | dynamic | converte o conteúdo string para json
`var content = "{ nome: 'José', email: 'jose@xxxx.com'}";`
`var json = Newtonsoft.Json.JsonConvert.DeserializeObject |
**Método** | **Retorno** | |
**await ApiContext.GetDataTableAsync**(string sql, params DbParameter\[\] parameters) | DataTable | Recuperar informações dos bancos de dados através de uma query sql. [Veja exemplo](https://wiki.agilityflow.io/link/90#bkmrk-recuperando-dados-do "Veja exemplo") |
**await ApiContext.SaveEntityAsync**(Guid estruturaformularioid\_ASerCriadoOuAtualizado, DataDictionary campos\_e\_valores) | Guid | Salva as informações de um formulário no bancos de dados. Obs: Para cadastrar valores numéricos, o números devem estar no formato com ponto no separador decimal: 999999.99 sem utilização de virgulas. Caso seja necessário, utilizar o .ToString() para formatar um campo decimal, não use. Utilize a conversão usando o string.Format, como no exemplo abaixo: `string.Format(new System.Globalization.CultureInfo("en-gb"), "{0:F2}", json["valor"]);` [Veja exemplo](https://wiki.agilityflow.io/link/90#bkmrk-salvando-os-dados-re "Veja exemplo") |
**await ApiContext.ApproveEntityAsync**(Guid estruturaformularioid\_ASerAprovado, DataDictionary campos\_e\_valores) | Guid | Avança uma etapa em um formulário com Workflow. As regras de usuário aprovador, permissão de aprovação e responsabilidade por uma etapa devem ser validadas antes desse método ser executado. Obs: Para cadastrar valores numéricos, o números devem estar no formato com ponto no separador decimal: 999999.99 sem utilização de virgulas. Caso seja necessário, utilizar o .ToString() para formatar um campo decimal, não use. Utilize a conversão usando o string.Format, como no exemplo abaixo: `string.Format(new System.Globalization.CultureInfo("en-gb"), "{0:F2}", json["valor"]);` [Veja exemplo](https://wiki.agilityflow.io/link/90#bkmrk-aprovando-uma-etapa-) |
**await ApiContext.DeleteEntityAsync(Guid formularioId)** | void | deletar um formulario |
**ApiContext.GetEnvironmentVariable**(string nomeVariavel) ou **ApiContext.GetEnvironmentVariable\_Text**(string nomeVariavel) \*\* | string | Recupera o Valor de uma variável de ambiente. \*\* Recupera a Descrição (texto), no caso de variáveis do Tipo "Que |
**await ApiContext.LogAsync(string log, string logTipo)** | void | Cria um log na tabela de log geral, o log pode ser consultado entrando na Área de Customização e clicando na opção "Log Geral >> consultar Log" \*\* Além do Log Padrão da API que o sistema gera, você pode gerar esses Logs customizados para o seu próprio controle. |
**await ApiContext.DbTransaction\_BeginTransactionAsync()** **await ApiContext.DbTransaction\_CommitAsync()** **await ApiContext.DbTransaction\_RollbackAsync()** | void | Para gerenciar a transação de banco de dados manualmente. Leia os detalhes [aqui mais abaixo ](https://wiki.agilityflow.io/link/90#bkmrk-%E2%A0-15) |
**ApiContext.GetUrlBase()** | void | Retorna a URL base da sua aplicação exemplo: [https://suaempresa.agilityflow.io/](https://suaempresa.agilityflow.io/) \*A url sempre virá com uma barra no final **/** |
**Método** | **Retorno** | |
**EmailSender.SendToGrupoUsuario**(Guid grupoUsuarioId, string subject, string htmlContent) | void | Enviar um e-mail para um determinado Grupo de Usuario |
**EmailSender.SendEmail**(string toEmail, string subject, string htmlContent) | void | Enviar um e-mail |
**EmailSender.SendEmail(**string toEmail, string subject, string htmlContent, string ccEmail) | void | Enviar um e-mail, com copia (CC) |
Atenção: Configuração recomendada apenas para especialista.
1. **ApiContext.DbTransaction\_BeginTransaction()** Para abrir uma transação, antes de iniciar as alterações no banco de dados 2. **ApiContext.DbTransaction\_Commit()** Para finalizar e confirmar com sucesso as alterações no banco de dados 3. **ApiContext.DbTransaction\_Rollback()** Para finalizar e desfazer as alterações no banco de dados Exemplo de uso:Atenção: Utilize as transactions sempre dentro de TRY e CATCH
Podem ser abertas uma ou mais transações na mesma API. Você ficará responsável por todas as aberturas e encerramentos das transações criadas.
```C# public async Task RunAsync(){ //converte o conteúdo enviado no body da API para JSON var json = Newtonsoft.Json.JsonConvert.DeserializeObject