Creare un'API senza server mediante Funzioni di AzureCreate a serverless API using Azure Functions

In questa esercitazione si apprenderà come Funzioni di Azure consente di creare API altamente scalabili.In this tutorial, you will learn how Azure Functions allows you to build highly scalable APIs. Funzioni di Azure include una raccolta di trigger HTTP e binding integrati che semplificano la creazione di un endpoint in una varietà di linguaggi, inclusi Node.JS, C# e altri.Azure Functions comes with a collection of built-in HTTP triggers and bindings, which make it easy to author an endpoint in a variety of languages, including Node.JS, C#, and more. In questa esercitazione si personalizzerà un trigger HTTP per gestire azioni specifiche nella progettazione dell'API.In this tutorial, you will customize an HTTP trigger to handle specific actions in your API design. Ci si preparerà inoltre a far crescere l'API integrandola con i proxy di Funzioni di Azure e a configurare API fittizie.You will also prepare for growing your API by integrating it with Azure Functions Proxies and setting up mock APIs. Tutto ciò avviene nell'ambiente di calcolo senza server di Funzioni di Azure, pertanto non è necessario preoccuparsi della scalabilità delle risorse ma è possibile concentrarsi semplicemente sulla logica di API.All of this is accomplished on top of the Functions serverless compute environment, so you don't have to worry about scaling resources - you can just focus on your API logic.

prerequisitiPrerequisites

Questo argomento usa per iniziare le risorse create in Creare la prima funzione nel portale di Azure.This topic uses as its starting point the resources created in Create your first function from the Azure portal. Se queste procedure non sono state ancora completate, completarle ora per creare l'app per le funzioni.If you haven't already done so, please complete these steps now to create your function app.

La funzione risultante sarà utilizzata per il resto dell'esercitazione.The resulting function will be used for the rest of this tutorial.

Accedere ad AzureSign in to Azure

Aprire il Portale di Azure.Open the Azure portal. Accedere a tale scopo all'indirizzo https://portal.azure.com con il proprio account Azure.To do this, sign in to https://portal.azure.com with your Azure account.

Personalizzare la funzione HTTPCustomize your HTTP function

Per impostazione predefinita, la funzione attivata da HTTP è configurata per accettare qualsiasi metodo HTTP.By default, your HTTP-triggered function is configured to accept any HTTP method. È inoltre disponibile un URL predefinito nel formato http://<yourapp>.azurewebsites.net/api/<funcname>?code=<functionkey>.There is also a default URL of the form http://<yourapp>.azurewebsites.net/api/<funcname>?code=<functionkey>. Se è stata seguita la guida introduttiva, <funcname> probabilmente ha un aspetto simile a "HttpTriggerJS1".If you followed the quickstart, then <funcname> probably looks something like "HttpTriggerJS1". In questa sezione si modificherà la funzione in modo che risponda solo alle richieste GET indirizzate verso la route /api/hello.In this section, you will modify the function to respond only to GET requests against /api/hello route instead.

  1. Accedere alla funzione nel portale di Azure.Navigate to your function in the Azure portal. Selezionare Integra nel pannello di navigazione a sinistra.Select Integrate in the left navigation.

    Personalizzazione di una funzione HTTP

  2. Usare le impostazioni di trigger HTTP come specificato nella tabella.Use the HTTP trigger settings as specified in the table.

    CampoField Valore di esempioSample value DESCRIZIONEDescription
    Metodi HTTP consentitiAllowed HTTP methods Metodi selezionatiSelected methods Determina quali metodi HTTP possono essere usati per chiamare questa funzioneDetermines what HTTP methods may be used to invoke this function
    Metodi HTTP selezionatiSelected HTTP methods GETGET Consente di usare solo i metodi HTTP selezionati per chiamare questa funzioneAllows only selected HTTP methods to be used to invoke this function
    Modello di routeRoute template /hello/hello Determina quale route viene usata per chiamare questa funzioneDetermines what route is used to invoke this function
    Livello di autorizzazioneAuthorization Level AnonimaAnonymous Facoltativo: rende una funzione accessibile senza una chiave APIOptional: Makes your function accessible without an API key

    Nota

    Si noti che non è stato incluso il prefisso del percorso base /api nel modello di route e l'operazione viene gestita da un'impostazione globale.Note that you did not include the /api base path prefix in the route template, as this is handled by a global setting.

  3. Fare clic su Save.Click Save.

Altre informazioni sulla personalizzazione delle funzioni HTTP sono riportate in Binding Azure HTTP e webhook di Funzioni di Azure.You can learn more about customizing HTTP functions in Azure Functions HTTP and webhook bindings.

Testare l'APITest your API

Testare quindi la funzione per verificarne il funzionamento con la nuova superficie dell'API.Next, test your function to see it working with the new API surface.

  1. Passare alla pagina di sviluppo facendo clic sul nome della funzione nel riquadro di spostamento sinistro.Navigate back to the development page by clicking on the function's name in the left navigation.
  2. Fare clic su Recupera URL della funzione e copiare l'URL.Click Get function URL and copy the URL. Si dovrebbe vedere che a questo punto usa la route /api/hello.You should see that it uses the /api/hello route now.
  3. Copiare l'URL in una nuova scheda del browser o nel client REST preferito.Copy the URL into a new browser tab or your preferred REST client. I browser useranno GET per impostazione predefinita.Browsers will use GET by default.
  4. Aggiungere parametri alla stringa di query nell'URL, ad esempio /api/hello/?name=JohnAdd parameters to the query string in your URL e.g. /api/hello/?name=John
  5. Premere "Invio" per confermare che è in corso.Hit 'Enter' to confirm that it is working. Verrà visualizzata la risposta "Hello John"You should see the response "Hello John"
  6. È anche possibile chiamare l'endpoint con un altro metodo HTTP per confermare che non viene eseguita la funzione.You can also try calling the endpoint with another HTTP method to confirm that the function is not executed. A tale scopo è necessario usare un client REST, ad esempio cURL, Postman o Fiddler.For this, you will need to use a REST client, such as cURL, Postman, or Fiddler.

Panoramica dei proxyProxies overview

Nella sezione successiva si esporrà l'API tramite un proxy.In the next section, you will surface your API through a proxy. Proxy di Funzioni di Azure consente di inoltrare le richieste ad altre risorse.Azure Functions Proxies allows you to forward requests to other resources. Si definisce un endpoint HTTP come con il trigger HTTP, ma anziché scrivere codice da eseguire quando viene chiamato tale endpoint si fornisce un URL a un'implementazione remota.You define an HTTP endpoint just like with HTTP trigger, but instead of writing code to execute when that endpoint is called, you provide a URL to a remote implementation. Ciò consente di comporre più origini di API in una singola superficie API facile da consumare per i client.This allows you to compose multiple API sources into a single API surface which is easy for clients to consume. Questo è particolarmente utile se si desidera compilare le API come microservizi.This is particularly useful if you wish to build your API as microservices.

Un proxy può puntare a qualsiasi risorsa HTTP, ad esempio:A proxy can point to any HTTP resource, such as:

Per altre informazioni sui proxy, vedere Uso dei proxy di Funzioni di Azure.To learn more about proxies, see Working with Azure Functions Proxies.

Creare il primo proxyCreate your first proxy

In questa sezione si creerà un nuovo proxy che funge da front-end per l'API complessiva.In this section, you will create a new proxy which serves as a frontend to your overall API.

Configurazione dell'ambiente front-endSetting up the frontend environment

Ripetere i passaggi per creare un'app per le funzioni, creando una nuova app per le funzioni in cui verrà creato il proxy.Repeat the steps to Create a function app to create a new function app in which you will create your proxy. L'URL della nuova app servirà come front-end per l'API e l'app per le funzioni modificata in precedenza servirà come back-end.This new app's URL will serve as the frontend for our API, and the function app you were previously editing will serve as a backend.

  1. Passare alla nuova app per le funzioni front-end nel portale.Navigate to your new frontend function app in the portal.
  2. Selezionare Funzionalità della piattaforma e scegliere Impostazioni applicazione.Select Platform Features and choose Application Settings.
  3. Scorrere verso il basso fino a Impostazioni applicazione dove sono archiviate le coppie chiave-valore e creare una nuova impostazione con la chiave "HELLO_HOST".Scroll down to Application settings where key/value pairs are stored and create a new setting with key "HELLO_HOST". Impostare il suo valore all'host dell'app per le funzioni di back-end, ad esempio <YourBackendApp>.azurewebsites.net.Set its value to the host of your backend function app, such as <YourBackendApp>.azurewebsites.net. Fa parte dell'URL copiato in precedenza durante il test della funzione HTTP.This is part of the URL that you copied earlier when testing your HTTP function. Si farà riferimento a questa impostazione nella configurazione in un secondo momento.You'll reference this setting in the configuration later.

    Nota

    Le impostazioni di app sono consigliate perché la configurazione dell'host eviti una dipendenza di ambiente hard-coded per il proxy.App settings are recommended for the host configuration to prevent a hard-coded environment dependency for the proxy. Usare le impostazioni dell'app significa che è possibile spostare la configurazione del proxy tra ambienti e saranno applicate le impostazioni dell'app specifiche dell'ambiente.Using app settings means that you can move the proxy configuration between environments, and the environment-specific app settings will be applied.

  4. Fare clic su Save.Click Save.

Creazione di un proxy nel front-endCreating a proxy on the frontend

  1. Passare all'app per le funzioni front-end nel portale.Navigate back to your frontend function app in the portal.
  2. Nel riquadro di spostamento sinistro fare clic sul segno "+" accanto a "Proxy".In the left-hand navigation, click the plus sign '+' next to "Proxies". Creazione di un proxyCreating a proxy
  3. Usare le impostazioni specificate nella tabella.Use proxy settings as specified in the table.

    CampoField Valore di esempioSample value DESCRIZIONEDescription
    NOMEName HelloProxyHelloProxy Nome descrittivo utilizzato solo per la gestioneA friendly name used only for management
    Modello di routeRoute template /api/hello/api/hello Determina quale route viene usata per chiamare questo proxyDetermines what route is used to invoke this proxy
    URL back-endBackend URL https://%HELLO_HOST%/api/hellohttps://%HELLO_HOST%/api/hello Specifica l'endpoint a cui la richiesta deve essere trasmessa tramite proxySpecifies the endpoint to which the request should be proxied
  4. Si noti che Proxy non fornisce il prefisso del percorso di base /api e questo deve essere incluso nel modello di route.Note that Proxies does not provide the /api base path prefix, and this must be included in the route template.

  5. La sintassi %HELLO_HOST% fa riferimento all'impostazione di app creata in precedenza.The %HELLO_HOST% syntax will reference the app setting you created earlier. L'URL risolto punterà alla funzione originale.The resolved URL will point to your original function.
  6. Fare clic su Crea.Click Create.
  7. È possibile provare il nuovo proxy copiando l'URL del proxy e testandolo nel browser o con il proprio client HTTP preferito.You can try out your new proxy by copying the Proxy URL and testing it in the browser or with your favorite HTTP client.
    1. Per usare una funzione anonima:For an anonymous function use:
      1. https://YOURPROXYAPP.azurewebsites.net/api/hello?name="Proxies"
    2. Per usare una funzione con autorizzazione:For a function with authorization use:
      1. https://YOURPROXYAPP.azurewebsites.net/api/hello?code=YOURCODE&name="Proxies"

Creare un'API fittiziaCreate a mock API

Quindi si userà un proxy per creare un'API fittizia per la soluzione.Next, you will use a proxy to create a mock API for your solution. Questo consente allo sviluppo client di procedere, senza bisogno della completa implementazione del back-end.This allows client development to progress, without needing the backend fully implemented. In un secondo momento della fase di sviluppo è possibile creare una nuova app per le funzioni che supporta questa logica e reindirizzare il proxy a essa.Later in development, you could create a new function app which supports this logic and redirect your proxy to it.

Per creare questa API fittizia, si creerà un nuovo proxy, questa volta usando l'Editor del servizio app.To create this mock API, we will create a new proxy, this time using the App Service Editor. Per iniziare passare all'app per le funzioni nel portale.To get started, navigate to your function app in the portal. Selezionare Funzionalità della piattaforma e sotto Strumenti di sviluppo trovare Editor del servizio app.Select Platform features and under Development Tools find App Service Editor. Facendo clic su questa opzione si apre l'Editor del servizio app in una nuova scheda.Clicking this will open the App Service Editor in a new tab.

Selezionare proxies.json nel riquadro di spostamento sinistro.Select proxies.json in the left navigation. Si tratta del file che memorizza la configurazione per tutti i proxy.This is the file which stores the configuration for all of your proxies. Se si usa uno dei metodi di distribuzione delle funzioni, questo è il file che si manterrà nel controllo sorgente.If you use one of the Functions deployment methods, this is the file you will maintain in source control. Per altre informazioni su questo file, vedere Configurazione avanzata.To learn more about this file, see Proxies advanced configuration.

Se la procedura è stata completata fino a questo punto, il file proxies.json dovrebbe essere simile al seguente:If you've followed along so far, your proxies.json should look like the following:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "HelloProxy": {
            "matchCondition": {
                "route": "/api/hello"
            },
            "backendUri": "https://%HELLO_HOST%/api/hello"
        }
    }
}

Ora si aggiungerà l'API fittizia.Next you'll add your mock API. Sostituire il file proxies.json con il seguente:Replace your proxies.json file with the following:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "HelloProxy": {
            "matchCondition": {
                "route": "/api/hello"
            },
            "backendUri": "https://%HELLO_HOST%/api/hello"
        },
        "GetUserByName" : {
            "matchCondition": {
                "methods": [ "GET" ],
                "route": "/api/users/{username}"
            },
            "responseOverrides": {
                "response.statusCode": "200",
                "response.headers.Content-Type" : "application/json",
                "response.body": {
                    "name": "{username}",
                    "description": "Awesome developer and master of serverless APIs",
                    "skills": [
                        "Serverless",
                        "APIs",
                        "Azure",
                        "Cloud"
                    ]
                }
            }
        }
    }
}

In questo modo viene aggiunto un nuovo proxy, "GetUserByName", senza la proprietà backendUri.This adds a new proxy, "GetUserByName", without the backendUri property. Invece di chiamare un'altra risorsa, viene modificata la risposta predefinita di Proxy usando un override della risposta.Instead of calling another resource, it modifies the default response from Proxies using a response override. È possibile anche usare gli override di richiesta e risposta in combinazione con un URL di back-end.Request and response overrides can also be used in conjunction with a backend URL. Ciò è particolarmente utile quando si esegue l'inoltro tramite proxy dei dati di un sistema legacy, in cui potrebbe essere necessario modificare le intestazioni, eseguire una query dei parametri e così via. Per altre informazioni sugli override di richiesta e risposta, vedere Modifica delle richieste e delle risposte.This is particularly useful when proxying to a legacy system, where you might need to modify headers, query parameters, etc. To learn more about request and response overrides, see Modifying requests and responses in Proxies.

Testare l'API fittizia chiamando l'endpoint <YourProxyApp>.azurewebsites.net/api/users/{username} mediante un browser o il client REST preferito.Test your mock API by calling the <YourProxyApp>.azurewebsites.net/api/users/{username} endpoint using a browser or your favorite REST client. Assicurarsi di sostituire {username} con un valore stringa che rappresenta un nome utente.Be sure to replace {username} with a string value representing a username.

Passaggi successiviNext steps

In questa esercitazione è stato illustrato come creare e personalizzare un'API in Funzioni di Azure.In this tutorial, you learned how to build and customize an API on Azure Functions. È stato inoltre illustrato come mettere insieme più API, incluse quelle fittizie, in una sola superficie API unificata.You also learned how to bring multiple APIs, including mocks, together as a unified API surface. È possibile usare queste tecniche per creare API di qualsiasi complessità, il tutto durante l'esecuzione del modello di calcolo senza server fornito da Funzioni di Azure.You can use these techniques to build out APIs of any complexity, all while running on the serverless compute model provided by Azure Functions.

I riferimenti seguenti possono essere utili quando si sviluppa ulteriormente l'API:The following references may be helpful as you develop your API further: