Как вызвать другую функцию с помощью функции Azure
Я написал 3 функции следующим образом
- создавать пользователей в БД
- получить пользователей из БД
- пользователи процесса
В функции [3] я буду вызывать функцию [2], чтобы получить пользователей, использующих URL-адрес функции Azure, как показано ниже: -
https://hdidownload.azurewebsites.net/api/getusers
Есть ли другой способ вызвать функцию Azure в другой функции Azure без полного пути, как описано выше?
Ответы
Ответ 1
В приложениях функций нет ничего встроенного для вызова одной функции HTTP из других функций без фактического выполнения вызова HTTP.
Для простых случаев использования я просто придерживаюсь вызова по полному URL.
Для более сложных рабочих процессов взгляните на Durable Functions, особенно Chain Function.
Ответ 2
Все предыдущие ответы верны, но, как уже упоминалось в комментариях, в начале этого года (Q1/Q2 2018) была введена концепция Durable Functions. Короче говоря, долговечные функции:
... позволяет писать функции с состоянием в среде без сервера. Расширение управляет состоянием, контрольными точками и перезапускается для вас.
Это фактически означает, что теперь вы также можете объединить несколько функций в цепочку. Он управляет состоянием, когда он вытекает из функции A => B => C, если вам потребуется это.
Он работает путем установки расширения Durable Functions для вашего приложения Function. Благодаря этому у вас есть несколько новых привязок контекста, где, например, в С# вы можете сделать что-то вроде (псевдокод):
[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;
}
Вот некоторые приятные аспекты:
- Основная последовательность объединяет две дополнительные функции, которые запускаются одна за другой
- Когда выполняется внешняя функция, основная последовательность переводится в спящий режим; это означает, что вам не будет выставлен счет дважды, если внешняя функция занята обработкой
Это позволяет вам одновременно запускать несколько функций в последовательности друг друга (например, связывание функций) или выполнять несколько функций параллельно и ожидать завершения всех из них (разветвление/разветвление).
Некоторые дополнительные справочные ссылки по этому вопросу:
Ответ 3
Я знаю, что у нас есть Durable Functions, но я вызываю свои функции как обычный статический метод, и он работает, вот пример:
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;
}
}
Ответ 4
Вы не можете сделать это напрямую, но у вас есть 2 варианта:
- Отправьте HTTP-запрос на публичный URL другой функции.
- Поместите сообщение в очередь Azure и позвольте другой функции Azure обработать его. (Microsoft рекомендует это решение)
Что касается первого варианта, в С# вы можете сделать это так:
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
// 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();
}
Ответ 5
Я не найду никаких хороших источников, я сделал это ниже, он работал нормально.
Для вызова другой функции с ее URL-адресом ниже формата:
https://my-functn-app-1.azurewebsites.net/some-path-here1?code=123412somecodehereemiii888ii88k123m123l123k1l23k1l3==
В Node.js, я назвал следующее:
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
});
Работал без проблем.
Он должен работать аналогично для других языков программирования.
Надеюсь это поможет.