---
title: Implantar Ferramentas de API com Cloudflare Workers
slug: implantar-ferramentas-de-api-com-cloudflare-workers
createdAt: 2024-09-02T18:54:52.397Z
---

## Início Rápido

Como a Extensão de API do Paragraph requer um endereço de internet publicamente acessível como um Endpoint de API, precisamos implantar nossa extensão de API em um endereço público na internet.&#x20;

Abra o arquivo `wrangler.toml` e modifique `name` e `compatibility_date` para o nome e a data de compatibilidade da sua aplicação.

Uma configuração importante aqui é o `TOKEN` em `vars`, que você precisará fornecer ao adicionar a extensão de API no Paragraph. Por razões de segurança, é recomendável usar uma string aleatória como o Token. Você não deve escrever o Token diretamente no código-fonte, mas passá-lo através de variáveis de ambiente. Portanto, não faça commit do seu `wrangler.toml` no seu repositório de código.

```toml
name = "extension-example"
compatibility_date = "2023-01-01"

[vars]
TOKEN = "bananaiscool"
```

Esta extensão de API retorna uma citação aleatória de "Breaking Bad". Você pode modificar a lógica desta extensão de API em `src/index.ts`. Este exemplo mostra como interagir com uma API de terceiros.

```typescript
// ⬇️ implemente sua lógica aqui ⬇️
// point === "app.external_data_tool.query"
// https://api.breakingbadquotes.xyz/v1/quotes
const count = params?.inputs?.count ?? 1;
const url = `https://api.breakingbadquotes.xyz/v1/quotes/${count}`;
const result = await fetch(url).then(res => res.text())
// ⬆️ implemente sua lógica aqui ⬆️
```

Este repositório simplifica todas as configurações, exceto para a lógica de negócios. Você pode usar diretamente os comandos npm para implantar sua extensão de API.

```bash
npm run deploy
```

Após a implantação bem-sucedida, você obterá um endereço público na internet, que poderá adicionar no Paragraph como um Endpoint de API. Observe para não esquecer o caminho do endpoint.

![](https://api.archbee.com/api/optimize/NB-ulyH02IT7Ep_VosDsd/Z5GGmVcXYUHlpgwIVqi75_captura-de-tela-2024-09-03-as-94112-am.png)

### Adicionando Endpoint de API no Paragraph

![](https://api.archbee.com/api/optimize/NB-ulyH02IT7Ep_VosDsd/-_wc40b2oxICKX3N2QXUN_captura-de-tela-2024-09-03-as-94417-am.png)

```typescript
import { bearerAuth } from "hono/bearer-auth";

(c, next) => {
    const auth = bearerAuth({ token: c.env.TOKEN });
    return auth(c, next);
},
```

Nossa lógica de autenticação Bearer é mostrada acima. Usamos o pacote `hono/bearer-auth` para autenticação Bearer. Você pode usar `c.env.TOKEN` em `src/index.ts` para obter o Token.

## Sobre Validação de Parâmetros

```typescript
import { z } from "zod";
import { zValidator } from "@hono/zod-validator";

const schema = z.object({
  point: z.union([
    z.literal("ping"),
    z.literal("app.external_data_tool.query"),
  ]), // Restringe 'point' a dois valores específicos
  params: z
    .object({
      app_id: z.string().optional(),
      tool_variable: z.string().optional(),
      inputs: z.record(z.any()).optional(),
      query: z.any().optional(),  // string ou null
    })
    .optional(),
});
```

Usamos `zod` para definir os tipos de parâmetros. Você pode usar `zValidator` em `src/index.ts` para validação de parâmetros. Obtenha parâmetros validados através de `const { point, params } = c.req.valid("json");`. Nosso `point` tem apenas dois valores, então usamos `z.union` para definição. `params` é um parâmetro opcional, definido com `z.optional`. Inclui um parâmetro `inputs`, do tipo `Record<string, any>` representando um objeto com chaves string e valores de qualquer tipo. Esse tipo pode representar qualquer objeto. Você pode obter o parâmetro `count` em `src/index.ts` usando `params?.inputs?.count`.

## Acessando Logs do Cloudflare Workers

```bash
wrangler tail
```

