Criar um endpoint de API com funções do Edge

IMPORTANT
O AEM Edge Functions está atualmente na versão beta. Os recursos e a documentação podem mudar. Para receber comentários, contate aemcs-edgecompute-feedback@adobe.com.

Uma função do AEM Edge é um módulo do JavaScript executado no Adobe CDN (Fastly Compute). Você o expõe como um ou mais pontos de extremidade HTTP emparelhando as regras do seletor de origem CDN com um manipulador de eventos de busca em seu código.

Esta página aborda o contrato e os arquivos principais. Você pode gravar qualquer lógica no manipulador, incluindo chamadas de saída do fetch() para outros sistemas. Mantenha o manipulador rápido e de curta duração para que ele se ajuste ao tempo de execução da borda.

Pré-requisitos

  • Um projeto do AEM Edge Functions com base no modelo padronizado
  • Adobe CLI com o plug-in AEM Edge Functions instalado

Para configuração pela primeira vez, consulte Configurar no AEM as a Cloud Service ou Configurar no Edge Delivery Services.

Como uma solicitação HTTP atinge seu código

Uma solicitação atinge a função Edge do AEM em duas etapas: o seletor de origem CDN roteia o ponto de extremidade para a função e, em seguida, o manipulador de eventos de busca é executado.

Browser → CDN origin selector (cdn.yaml) → AEM Edge Function (index.js) → Your handler logic (optional fetch to other systems)
Camada
Arquivo
Responsabilidade
CDN
config/cdn.yaml
Corresponder um caminho e encaminhar a solicitação para a função Edge do AEM
Função
config/edgeFunctions.yaml
Declarar o nome da Função Edge do AEM e configs, secrets ou kvs opcionais
Código
src/index.js
Corresponder pontos de extremidade, executar lógica de manipulador e retornar um Response

O seletor de origem e o nome da função devem ser alinhados. Se edgeFunctions.yaml declara my-edge-function, o seletor de origem usa edgefunction-my-edge-function em cdn.yaml.

# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function #<name-of-the-function>
# config/cdn.yaml (origin selector excerpt)
kind: 'CDN'
version: '1'
data:
  originSelectors:
    rules:
      - name: route-status-endpoint-to-edge-function # logical name for the origin selector rule
        when: { reqProperty: path, equals: "/status" } # path to match
        action:
          type: selectAemOrigin
          originName: edgefunction-my-edge-function # edgefunction-<name-of-the-function>
          skipCache: false # false to use the CDN cache for this path
      - name: route-my-api-to-edge-function # logical name for the origin selector rule
        when: { reqProperty: path, equals: "/my-api" } # path to match
        action:
          type: selectAemOrigin
          originName: edgefunction-my-edge-function # edgefunction-<name-of-the-function>
          skipCache: true # true to bypass the CDN cache for this path

Cada ponto de extremidade precisa de sua própria regra de seletor de origem em cdn.yaml. Uma função Edge do AEM pode atender a vários endpoints, mas o CDN deve encaminhar cada caminho para essa função. Defina skipCache: false para permitir o armazenamento em cache do CDN para respostas estáveis, ou skipCache: true para ignorar o cache do CDN para respostas dinâmicas ou personalizadas.

Para opções do seletor de origem, consulte Seletores de origem.

Manipular solicitações

Cada função do AEM Edge registra um manipulador de eventos de busca. O Adobe CDN chama esse manipulador para cada solicitação correspondente. O manipulador lê o Request recebido, executa sua lógica e retorna um Response.

// src/index.js
import { myApiHandler } from "./my-api.js";
import * as response from "./lib/response.js";

// entry point for the AEM Edge Function
addEventListener("fetch", (event) => event.respondWith(handleRequest(event)));

async function handleRequest(event) {
  // event.request is a standard Fetch API Request (method, URL, headers, body)
  const req = event.request;
  const url = new URL(req.url);

  try {
    // endpoint matching
    if (url.pathname === "/status" && req.method === "GET") {
      return new Response("OK", { status: 200 });
    } else if (url.pathname === "/my-api" && req.method === "GET") {
      return await myApiHandler(req, event.client);
    }
    // add more endpoints here

    return response.notFound();
  } catch (err) {
    console.log(err);
    return response.error();
  }
}

Pontos principais:

Conceito
Detalhe
Ponto de entrada
addEventListener("fetch", ...) conecta cada solicitação ao manipulador de eventos de busca, consulte FetchEvent.responseWith
Solicitar
event.request é uma API de busca padrão Request (método, URL, cabeçalhos, corpo), consulte Referência de solicitação
Resposta
Retorne new Response(body, { status, headers }) para controlar o status, o tipo de conteúdo e os cabeçalhos de cache. Consulte Referência de resposta
Correspondência de ponto de extremidade
Correspondência em url.pathname, método HTTP, cabeçalhos ou parâmetros de consulta dentro de handleRequest
Metadados do cliente
event.client expõe detalhes de conexão, como o endereço IP do cliente, consulte FetchEvent.client

O ponto de extremidade correspondente vive em index.js. Conforme seus pontos de extremidade crescem, mova a lógica do manipulador para arquivos separados e importe-os, como my-api.js faz no exemplo acima. Consulte Atender vários pontos de extremidade com funções do Edge para ver os padrões à medida que a superfície da API se expande.

Escreva a lógica do manipulador

Dentro de cada manipulador de endpoint, é possível executar qualquer JavaScript que se ajuste ao tempo de execução da borda. Mantenha o trabalho rápido e de curta duração. Prefira transformações leves, pesquisas geográficas, respostas simples de JSON ou HTML e pequenas agregações a computação pesada ou de longa duração.

Uma resposta mínima tem esta aparência:

if (url.pathname === "/status" && req.method === "GET") {
  return new Response("OK", { status: 200 });
}

Você pode retornar JSON, HTML ou texto sem formatação. Defina cabeçalhos no Response para controlar o tipo de conteúdo e o cache:

return new Response(JSON.stringify({ status: "ok" }), {
  status: 200,
  headers: {
    "Content-Type": "application/json",
    "Cache-Control": "public, max-age=300",
  },
});

Quando precisar de dados de outro sistema, chame-o com fetch(). Mantenha as credenciais na Função Edge do AEM. Não exponha segredos no JavaScript do cliente.

// src/my-api.js
async function myApiHandler(req, client) {
  const backendRequest = new Request("https://api.example.com/data");

  // optionally, you can add headers to the request
  // backendRequest.headers.set("Authorization", `Bearer <your-access-token>`);

  const backendResponse = await fetch(backendRequest);

  if (!backendResponse.ok) {
    return new Response("Backend error", { status: 502 });
  }

  const data = await backendResponse.json();

  return new Response(JSON.stringify(data), {
    status: 200,
    headers: {
      "Content-Type": "application/json",
      "Cache-Control": "max-age=300",
    },
  });
}

export { myApiHandler };

As chamadas de saída fetch() normalmente seguem este padrão:

  1. Derivar contexto da solicitação (headers, event.client, auxiliares de geolocalização do Fastly).
  2. Crie um Request para o outro sistema.
  3. Chamar await fetch(request) (opcionalmente com uma origem backend nomeada).
  4. Analise a resposta e retorne um novo Response ao cliente.

Limites de plataforma se aplicam. Cada invocação dá suporte a até 32 chamadas de busca de saída. Para comportamento de cache em chamadas de busca, consulte Armazenamento em cache em funções do AEM Edge.

Mais exemplos de código

Para obter exemplos completos de trabalho, consulte a descrição das Funções do AEM Edge:

Exemplo
Arquivo
O que ele mostra
Resposta simples
src/index.js
Correspondência de rota e uma resposta criada no manipulador
API externa
src/weather.js
Pesquisa geográfica mais saída fetch()

Recursos adicionais

recommendation-more-help
experience-manager-learn-help-cloud-service