REST e rotas de função

Concluído

Você criou uma API maravilhosa. Ela não faz muita coisa, mas existe. Isso é mais do que as pessoas que não estão criando APIs no momento podem dizer.

Migração para APIs RESTful

Você tem pontos de extremidade chamados CreateProduct, GetProducts, UpdateProduct e DeleteProduct. Os pontos de extremidade nomeados dessa forma seguem um padrão de nomenclatura tradicional de API: Ação/recurso.

O padrão de nomenclatura Ação/Recurso é adequado para APIs menores. No entanto, lembre-se que, nesta simulação, a Tailwind Traders é uma gigante da Internet. A API de Produtos pode sair de controle rapidamente. Por exemplo, você pode imaginar que pode ter um método chamado "GetProductByIdAndQuantityAndDate". Esses tipos de nomes de método não são apenas detalhados, mas também fazem com que o código que os consome pareça confuso. Com nomes de API longos, os desenvolvedores também têm dificuldade para descobrir como usar a API em seus projetos.

O que você precisa fazer é tornar essa API limpa e intuitiva. Para isso, você usará o padrão REST.

Rotas do Azure Functions e métodos de solicitação HTTP

No Azure Functions, por padrão, qualquer função de gatilho HTTP responde às solicitações GET e POST. Ele também define a URL da função como o nome da função com o prefixo "/api". Você configurará ambos para adotar um padrão RESTful.

Aplicativos empresariais

A definição HTTP de uma API no modelo de programação do Azure Functions v4, neste aplicativo de exemplo, é encontrada em ./api/src/index.ts e segue o padrão de:

const { app } = require('@azure/functions');

app.http('FunctionName',{
    methods: ['GET', 'POST'], 
    authLevel: 'anonymous', 
    route: 'routeName',
    handler: handlerFunction
});

A função do manipulador é separada da definição do gatilho HTTP. Isso oferece muita flexibilidade na forma como você define suas funções. Você pode definir a função do manipulador em um arquivo separado e importá-la para o arquivo index.ts. Esse formato é mais fácil de manter ou gerar a documentação do OpenAPI ou Swagger.

Aplicativos menores

Aplicativos menores podem se beneficiar da integração do código do manipulador diretamente na chamada app, usando o método do aplicativo para especificar o método HTTP. Você ainda pode separar a função do manipulador ou integrar o código.

Use o método app.get para especificar o método HTTP e a função do manipulador.

const { app } = require('@azure/functions');

app.get('FunctionName', handlerFunction);

Um formato alternativo, ideal para aplicativos de função com uma única função, é integrar o código do manipulador diretamente à chamada app, usando o método do aplicativo para especificar o método HTTP. Por exemplo:

const { app } = require('@azure/functions');

app.get('helloWorld',{
    handler: (request: HttpRequest, context: InvocationContext) => {
        return {
            status: 200,
            body: "Hello World"
        }
    }
}

Parâmetros de rota

Você também pode usar parâmetros de rota para definir uma rota que aceite um parâmetro. Por exemplo, o código a seguir define uma rota que aceita um parâmetro name:

route: "products"

A definição de rota completa é:

app.http('GetProducts', {
    methods: ['GET', 'POST'],
    route: 'products',          // <- route: /api/products
    authLevel: 'anonymous',
    handler: GetProducts
});

A especificação de uma rota altera tudo após a seção api da URL. No arquivo de configuração anterior, a rota para a função GetProducts passou a ser http://localhost:7071/api/products.

Você pode passar parâmetros junto com uma rota. Os parâmetros assumem a forma de {parameterName}. Isso significa que, para passar um parâmetro chamado id para o ponto de extremidade product, você especificaria a rota a seguir.

route: "products/{id}"

Equipado com esse novo conhecimento da REST e de como implementá-lo no Azure Functions, você já pode transformar a API complicada de Produtos em uma RESTful. É exatamente isso que você fará no próximo exercício.