J'ai écrit 3 fonctions comme suit
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?
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 .
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:
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:
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;
}
}
Vous ne pouvez pas le faire directement, mais vous avez 2 options:
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();
}
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:
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.