Как вызвать другую функцию с помощью функции Azure

Я написал 3 функции следующим образом

  1. создавать пользователей в БД
  2. получить пользователей из БД
  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 варианта:

  1. Отправьте HTTP-запрос на публичный URL другой функции.
  2. Поместите сообщение в очередь 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
         });

Работал без проблем.
Он должен работать аналогично для других языков программирования.
Надеюсь это поможет.