REST e rotas das funções

Concluído

Criou uma API fantástica. Ainda não faz muita coisa, mas já existe, e isso é mais do que as pessoas que não estão a criar APIs neste momento podem dizer.

Migração para APIs RESTful

Tem pontos finais denominados CreateProduct, GetProducts, UpdateProduct e DeleteProduct. Os pontos de extremidade nomeados dessa forma seguem um padrão tradicional de nomenclatura de API: Ação/Recurso.

O padrão de nomenclatura Ação/Recurso é bom para APIs menores. Lembre-se, apesar de se tratar de uma simulação, a Tailwind Traders é um gigante da Internet. A API Produtos pode tornar-se difícil rapidamente. Por exemplo, você pode imaginar que pode ter um método chamado "GetProductByIdAndQuantityAndDate". Não só esses tipos de nomes de método são detalhados, mas eles fazem com que o código que os consome pareça confuso. Os nomes de API com muitas palavras também fazem com que seja mais difícil os programadores perceberem como utilizar a API nos projetos.

Assim, precisa de tornar esta API simples e intuitiva. Para isso, você usará o padrão REST.

Rotas das Funções do Azure e métodos de pedido 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 sua função para o nome dessa função prefixada por "/api". Você configurará ambos para mover para um padrão RESTful de movimento.

Aplicações Empresariais

A definição HTTP para 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. Isto permite-lhe muitas flexibilidades na forma como define as suas funções. Você pode definir a função do manipulador em um arquivo separado e importá-la para o index.ts arquivo. Este formato seria mais fácil de manter ou gerar para documentação OpenAPI ou Swagger.

Aplicações mais pequenas

Aplicativos menores podem ser melhor atendidos integrando o código do manipulador diretamente na app chamada, 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 app.get método para especificar o método HTTP e a função manipulador.

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

app.get('FunctionName', handlerFunction);

Outro formato alternativo, ideal para aplicativos Function com uma única função, é integrar o código do manipulador diretamente na app chamada, 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 name parâmetro:

route: "products"

A definição completa da rota é:

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

Especificar 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 agora http://localhost:7071/api/productsé .

Pode transmitir os parâmetros juntamente com a rota. Os parâmetros assumem a forma de {parameterName}. Isso significa que, para passar um parâmetro chamado id para o product ponto de extremidade, você deve especificar a rota a seguir.

route: "products/{id}"

Armado com esse novo conhecimento de REST e como implementá-lo no Azure Functions, agora você pode tornar essa pesada API de Produtos RESTful. É exatamente isso que vai fazer no próximo exercício.