web-dev-qa-db-fra.com

Comment appeler une autre fonction avec dans une fonction Azure

J'ai écrit 3 fonctions comme suit

  1. créer des utilisateurs dans db
  2. récupérer les utilisateurs de db
  3. utilisateurs de processus

Dans la fonction [3], j'appellerai la fonction [2] pour que les utilisateurs utilisent l'URL de la fonction Azure comme ci-dessous: -

https://hdidownload.azurewebsites.net/api/getusers

Existe-t-il un autre moyen d'appeler la fonction Azure avec une autre fonction Azure sans chemin d'accès complet comme ci-dessus?

18
Galet

Il n'y a rien de intégré dans les applications de fonction pour appeler une fonction HTTP à partir d'autres fonctions sans réellement passer l'appel HTTP.

Pour les cas d'utilisation simples, je me contenterais d'appeler par URL complète.

Pour des workflows plus avancés, jetez un œil à Fonctions durables , en particulier Chaînage de fonctions .

12
Mikhail Shilkov

Toutes les réponses précédentes sont valables mais, comme cela a également été mentionné dans les commentaires, plus tôt cette année (T1/T2 2018), le concept de Fonctions durables a été introduit. En bref, des fonctions durables:

... vous permet d'écrire des fonctions avec état dans un environnement sans serveur. L'extension gère pour vous l'état, les points de contrôle et les redémarrages.

Cela signifie que vous pouvez désormais également chaîner plusieurs fonctions ensemble. Il gère l'état lorsqu'il découle de la fonction A => B => C, si vous en avez besoin.

Cela fonctionne en installant l'extension de fonctions durables sur votre application de fonction. Avec cela, vous avez de nouvelles liaisons de contexte disponibles où, par exemple en C #, vous pouvez faire quelque chose comme (pseudo code):

[FunctionName("ExpensiveDurableSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] DurableOrchestrationTrigger context)
{
    var response = new List<Order>();

    // Call external function 1 
    var token = await context.CallActivityAsync<string>("GetDbToken", "i-am-root");

    // Call external function 2
    response.Add(await context.CallActivityAsync<IEnumerable<Order>>("GetOrdersFromDb", token));

    return response;
}

[FunctionName("GetDbToken")]
public static string GetDbToken([ActivityTrigger] string username)
{
    // do expensive remote api magic here
    return token;
}

[FunctionaName("GetOrdersFromDb")]
public static IEnumerable<Order> GetOrdersFromDb([ActivityTrigger] string apikey)
{
    // do expensive db magic here
    return orders;
}

Voici quelques aspects intéressants:

  • La séquence principale enchaîne deux fonctions supplémentaires qui sont exécutées l'une après l'autre
  • Lorsqu'une fonction externe est exécutée, la séquence principale est mise en veille; cela signifie que vous ne serez pas facturé deux fois une fois qu'une fonction externe est en cours de traitement

Cela vous permet à la fois d'exécuter plusieurs fonctions en séquence les unes par rapport aux autres (par exemple, le chaînage de fonctions), ou d'exécuter plusieurs fonctions en parallèle et d'attendre qu'elles se terminent toutes (fan-out/fan-in).

Quelques références supplémentaires à ce sujet:

7
Juliën

Je sais que nous avons des fonctions durables mais j'appelle mes fonctions comme une méthode statique normale et cela fonctionne, voici un exemple:

public static class Helloworld
{
    [FunctionName("Helloworld")]
    public static string Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log)
    {
        return "Hello World";
    }

}

public static class HelloWorldCall
{
    [FunctionName("HelloWorldCall")]
    public static string Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log)
    {
        var caller = Helloworld.Run(req, log);
        return caller;
    }

}
2
Juan Mitchell

Vous ne pouvez pas le faire directement, mais vous avez 2 options:

  1. Envoyez une requête HTTP à l'URL publique d'une autre fonction.
  2. Placez un message dans une file d'attente Azure et laissez l'autre fonction Azure le traiter. (Microsoft recommande cette solution)

Quant à la première option, en C # vous pouvez le faire comme ceci:

static HttpClient client = new HttpClient();
[FunctionName("RequestImageProcessing")]
public static async Task RequestImageProcessing([HttpTrigger(WebHookType = "genericJson")]
    HttpRequestMessage req)
{

        string anotherFunctionSecret = ConfigurationManager.AppSettings
            ["AnotherFunction_secret"];
        // anotherFunctionUri is another Azure Function's 
        // public URL, which should provide the secret code stored in app settings 
        // with key 'AnotherFunction_secret'
        Uri anotherFunctionUri = new Uri(req.RequestUri.AbsoluteUri.Replace(
            req.RequestUri.PathAndQuery, 
            $"/api/AnotherFunction?code={anotherFunctionSecret}"));

        var responseFromAnotherFunction = await client.GetAsync(anotherFunctionUri);
        // process the response

}

[FunctionName("AnotherFunction")]
public static async Task AnotherFunction([HttpTrigger(WebHookType = "genericJson")]
HttpRequestMessage req)
{
    await Worker.DoWorkAsync();
}
1
Artemious

Je n'ai pas trouvé de bonnes sources, j'ai fait ci-dessous, cela a bien fonctionné.

Pour appeler une autre fonction avec son URL, du format ci-dessous:

https://my-functn-app-1.azurewebsites.net/some-path-here1?code=123412somecodehereemiii888ii88k123m123l123k1l23k1l3==

Dans Node.js, j'ai appelé comme ci-dessous:

let request_options = {
        method: 'GET',
        Host: 'my-functn-app-1.azurewebsites.net',
        path: '/path1/path2?&q1=v1&q2=v2&code=123412somecodehereemiii888ii88k123m123l123k1l23k1l3',
        headers: {
            'Content-Type': 'application/json'
        }
};
require('https')
    .request(
         request_options,
         function (res) {
               // do something here
         });

Fonctionné sans problème.
Cela devrait fonctionner de manière similaire pour les autres langages de programmation.
J'espère que cela t'aides.

0