Триггер HTTP в Функциях Azure
Триггер HTTP позволяет вызвать функцию с помощью HTTP-запроса. Триггер HTTP можно использовать для создания независимых от сервера API-интерфейсов и для ответа веб-перехватчикам.
Возвращаемое по умолчанию значение для функции, активируемой по HTTP:
HTTP 204 No Content
с пустым телом в Функциях 2.x и более поздних версий;HTTP 200 OK
с пустым телом в Функциях 1.x.
Чтобы изменить HTTP-ответ, настройте выходную привязку.
Дополнительные сведения о привязках HTTP см. в обзорной статье и справочнике по выходным привязкам.
Совет
Если вы планируете использовать привязки HTTP или веб-перехватчика, спланируйте работу так, чтобы избежать нехватки портов, которая может возникнуть в результате неправильной установки HttpClient
. См. дополнительные сведения об управлении подключениями в службе "Функции Azure".
Внимание
В этой статье используются вкладки для поддержки нескольких версий модели программирования Node.js. Модель версии 4 общедоступна и предназначена для более гибкого и интуитивно понятного интерфейса для разработчиков JavaScript и TypeScript. Дополнительные сведения о том, как работает модель версии 4, см. в руководстве разработчика по Функции Azure Node.js. Дополнительные сведения о различиях между версиями 3 и 4 см. в руководстве по миграции.
Функции Azure поддерживает две модели программирования для Python. Способ определения привязок зависит от выбранной модели программирования.
Модель программирования Python версии 2 позволяет определять привязки с помощью декораторов непосредственно в коде функции Python. Дополнительные сведения см. в руководстве разработчика Python.
Эта статья поддерживает обе модели программирования.
Пример
Функцию C# можно создать с помощью одного из следующих режимов C#:
- Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework. Расширения для изолированных рабочих процессов используют
Microsoft.Azure.Functions.Worker.Extensions.*
пространства имен. - Модель внутрипроцессного процесса: скомпилированная функция C#, которая выполняется в том же процессе, что и среда выполнения Функций. В варианте этой модели функции можно запускать с помощью скриптов C#, которая поддерживается главным образом для редактирования портала C#. Расширения для функций в процессе используют
Microsoft.Azure.WebJobs.Extensions.*
пространства имен.
Внимание
Поддержка будет завершена для модели в процессе 10 ноября 2026 г. Настоятельно рекомендуется перенести приложения в изолированную рабочую модель для полной поддержки.
Весь код в этой статье по умолчанию использует синтаксис .NET Core, стандартный для Функций Azure версии 2.x и более поздних. Сведения о синтаксисе версии 1.x см. на странице с соответствующими шаблонами функций.
В следующем примере показан триггер HTTP, который возвращает ответ hello, world в качестве IActionResult, используя интеграцию ASP.NET Core в .NET Isolated:
[Function("HttpFunction")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req)
{
return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
}
В следующем примере показан триггер HTTP, который возвращает ответ "hello world" в виде объекта HttpResponseData.
[Function(nameof(HttpFunction))]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger(nameof(HttpFunction));
logger.LogInformation("message logged");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString("Welcome to .NET isolated worker !!");
return response;
}
Этот раздел содержит следующие примеры.
- Чтение параметра из строки запроса
- Чтение текста из запроса POST
- Чтение параметра из маршрута
- Чтение текста POJO из запроса POST
Этот тип привязки HTTP представлен в следующих примерах.
Чтение параметра из строки запроса
Этот пример считывает параметр с именем id
из строки запроса и использует его, чтобы создать документ JSON, возвращаемый клиенту, с типом содержимого application/json
.
@FunctionName("TriggerStringGet")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Item list
context.getLogger().info("GET parameters are: " + request.getQueryParameters());
// Get named parameter
String id = request.getQueryParameters().getOrDefault("id", "");
// Convert and display
if (id.isEmpty()) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Document not found.")
.build();
}
else {
// return JSON from to the client
// Generate document
final String name = "fake_name";
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
return request.createResponseBuilder(HttpStatus.OK)
.header("Content-Type", "application/json")
.body(jsonDocument)
.build();
}
}
Чтение текста из запроса POST
Этот пример считывает текст из запроса POST как String
и использует его, чтобы создать документ JSON, возвращаемый клиенту, с типом содержимого application/json
.
@FunctionName("TriggerStringPost")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Item list
context.getLogger().info("Request body is: " + request.getBody().orElse(""));
// Check request body
if (!request.getBody().isPresent()) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Document not found.")
.build();
}
else {
// return JSON from to the client
// Generate document
final String body = request.getBody().get();
final String jsonDocument = "{\"id\":\"123456\", " +
"\"description\": \"" + body + "\"}";
return request.createResponseBuilder(HttpStatus.OK)
.header("Content-Type", "application/json")
.body(jsonDocument)
.build();
}
}
Чтение параметра из маршрута
Этот пример считывает обязательный параметр с именем id
и необязательный параметр name
из пути маршрута и использует их для создания документа JSON, возвращаемого клиенту, с типом содержимого application/json
.
@FunctionName("TriggerStringRoute")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "trigger/{id}/{name=EMPTY}") // name is optional and defaults to EMPTY
HttpRequestMessage<Optional<String>> request,
@BindingName("id") String id,
@BindingName("name") String name,
final ExecutionContext context) {
// Item list
context.getLogger().info("Route parameters are: " + id);
// Convert and display
if (id == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Document not found.")
.build();
}
else {
// return JSON from to the client
// Generate document
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
return request.createResponseBuilder(HttpStatus.OK)
.header("Content-Type", "application/json")
.body(jsonDocument)
.build();
}
}
Чтение текста POJO из запроса POST
Ниже приведен код для ToDoItem
класса, на который ссылается этот пример:
public class ToDoItem {
private String id;
private String description;
public ToDoItem(String id, String description) {
this.id = id;
this.description = description;
}
public String getId() {
return id;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "ToDoItem={id=" + id + ",description=" + description + "}";
}
}
Этот пример считывает текст запроса POST. Текст запроса автоматически десериализуется в объект ToDoItem
и возвращается к клиенту с типом содержимого application/json
. Параметр ToDoItem
сериализуется средой выполнения службы "Функции", так как он назначен свойству body
класса HttpMessageResponse.Builder
.
@FunctionName("TriggerPojoPost")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<ToDoItem>> request,
final ExecutionContext context) {
// Item list
context.getLogger().info("Request body is: " + request.getBody().orElse(null));
// Check request body
if (!request.getBody().isPresent()) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Document not found.")
.build();
}
else {
// return JSON from to the client
// Generate document
final ToDoItem body = request.getBody().get();
return request.createResponseBuilder(HttpStatus.OK)
.header("Content-Type", "application/json")
.body(body)
.build();
}
}
В следующем примере показана функция Триггера HTTP TypeScript. В функции выполняется поиск параметра name
в строке запроса или в тексте HTTP-запроса.
import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';
export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text()) || 'world';
return { body: `Hello, ${name}!` };
}
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: httpTrigger1,
});
В следующем примере показана функция JavaScript триггера HTTP. В функции выполняется поиск параметра name
в строке запроса или в тексте HTTP-запроса.
const { app } = require('@azure/functions');
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text()) || 'world';
return { body: `Hello, ${name}!` };
},
});
В следующем примере показаны привязка триггера в файле function.json и функция PowerShell. В функции выполняется поиск параметра name
в строке запроса или в тексте HTTP-запроса.
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
}
using namespace System.Net
# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)
# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."
# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
$name = $Request.Body.Name
}
$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
if ($name) {
$body = "Hello, $name. This HTTP triggered function executed successfully."
}
# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $body
})
В этом примере используются HTTP-потоки для возврата фрагментированных данных ответа.
import time
import azure.functions as func
from azurefunctions.extensions.http.fastapi import Request, StreamingResponse
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
def generate_sensor_data():
"""Generate real-time sensor data."""
for i in range(10):
# Simulate temperature and humidity readings
temperature = 20 + i
humidity = 50 + i
yield f"data: {{'temperature': {temperature}, 'humidity': {humidity}}}\n\n"
time.sleep(1)
@app.route(route="stream", methods=[func.HttpMethod.GET])
async def stream_sensor_data(req: Request) -> StreamingResponse:
"""Endpoint to stream real-time sensor data."""
return StreamingResponse(generate_sensor_data(), media_type="text/event-stream")
Дополнительные сведения о том, как включить http-потоки в проекте, см. в статье HTTP-потоки.
В этом примере показана привязка триггера и функция Python, использующая привязку. В функции выполняется поиск параметра name
в строке запроса или в тексте HTTP-запроса.
import azure.functions as func
import logging
app = func.FunctionApp()
@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
def test_function(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
return func.HttpResponse(
"This HTTP triggered function executed successfully.",
status_code=200
)
Атрибуты
И изолированная рабочая модель , и модель внутри процесса используют HttpTriggerAttribute
для определения привязки триггера. Вместо этого скрипт C# использует файл конфигурации function.json, как описано в руководстве по скриптам C#.
В изолированных приложениях-функциях HttpTriggerAttribute
рабочей модели поддерживаются следующие параметры:
Параметры | Description |
---|---|
AuthLevel | Определяет, какие ключи (если они требуются) должны присутствовать в запросе, чтобы вызвать функцию. Поддерживаемые значения см. на уровне авторизации. |
Методы | Массив методов HTTP, на которые отвечает функция. Если свойство не указано, функция отвечает на все методы HTTP. См. раздел Настройка конечной точки HTTP. |
Маршрут | Шаблон маршрута, определяющий URL-адреса запросов, на которые отвечает функция. Если значение не указано, по умолчанию используется <functionname> . См. раздел Настройка конечной точки HTTP. |
Декораторы
Применяется только к модели программирования Python версии 2.
Для функций Python версии 2, определенных с помощью декоратора, в декораторе определяются route
следующие свойства триггера, добавляющие привязку HttpTrigger и HttpOutput:
Свойство | Description |
---|---|
route |
Маршрут для конечной точки HTTP. Если значение None, оно будет задано в качестве имени функции, если оно присутствует или имя определяемой пользователем функции Python. |
trigger_arg_name |
Имя аргумента для HttpRequest. Значение по умолчанию — req. |
binding_arg_name |
Имя аргумента для HttpResponse. Значение по умолчанию — "$return". |
methods |
Кортеж методов HTTP, к которым отвечает функция. |
auth_level |
Определяет, какие ключи (если они требуются) должны присутствовать в запросе, чтобы вызвать функцию. |
Сведения о функциях Python, определенных с помощью function.json, см. в разделе "Конфигурация ".
Заметки
В библиотеке среды выполнения функций Java используйте заметку HttpTrigger, которая поддерживает следующие параметры:
Настройка
Применяется только к модели программирования Python версии 1.
В следующей таблице описываются свойства, которые можно задать для options
объекта, переданного методу app.http()
.
Свойство | Description |
---|---|
authLevel | Определяет, какие ключи (если они требуются) должны присутствовать в запросе, чтобы вызвать функцию. Поддерживаемые значения см. на уровне авторизации. |
methods | Массив методов HTTP, на которые отвечает функция. Если свойство не указано, функция отвечает на все методы HTTP. См. раздел Настройка конечной точки HTTP. |
маршрут | Шаблон маршрута, определяющий URL-адреса запросов, на которые отвечает функция. Если значение не указано, по умолчанию используется <functionname> . См. раздел Настройка конечной точки HTTP. |
В следующей таблице описываются свойства конфигурации триггера, задаваемые в файле function.json, который может отличаться в зависимости от версии.
В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.
Свойство в function.json | Описание |
---|---|
type | Обязательное. Необходимо задать значение httpTrigger . |
direction | Обязательное. Необходимо задать значение in . |
name | Обязательное. Имя переменной, из которой в коде функции можно получить запрос или текст запроса. |
authLevel | Определяет, какие ключи (если они требуются) должны присутствовать в запросе, чтобы вызвать функцию. Поддерживаемые значения см. на уровне авторизации. |
methods | Массив методов HTTP, на которые отвечает функция. Если свойство не указано, функция отвечает на все методы HTTP. См. раздел Настройка конечной точки HTTP. |
маршрут | Шаблон маршрута, определяющий URL-адреса запросов, на которые отвечает функция. Если значение не указано, по умолчанию используется <functionname> . См. раздел Настройка конечной точки HTTP. |
Использование
В этом разделе описано, как настроить привязку функции триггера HTTP.
Заметка HttpTrigger должна применяться к параметру метода одного из следующих типов.
- HttpRequestMessage<T>.
- Все собственные типы Java, такие как int, String, byte[].
- Значения, которые могут принимать значение NULL, являются необязательными.
- Любой обычный тип объекта Java (POJO).
Полезная нагрузка
Тип входных данных триггера объявлен как один из следующих типов:
Тип | Описание |
---|---|
HttpRequest | Использование этого типа требует, чтобы приложение было настроено с помощью интеграции ASP.NET Core в .NET Isolated. Это обеспечивает полный доступ к объекту запроса и общему httpContext. |
HttpRequestData | Проекция объекта запроса. |
Настраиваемый тип | Когда текст запроса — JSON, среда выполнения пытается проанализировать его, чтобы задать свойства объекта. |
Если параметр триггера имеет тип HttpRequestData
или HttpRequest
настраиваемые типы, можно также привязать к другим параметрам с помощью Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute
. Для использования этого атрибута требуется Microsoft.Azure.Functions.Worker.Extensions.Http
версия 3.1.0 или более поздняя. Этот тип отличается от аналогичного атрибута.Microsoft.AspNetCore.Mvc
При использовании интеграции ASP.NET Core требуется полная ссылка или using
инструкция. В этом примере показано, как использовать атрибут для получения только содержимого текста при наличии доступа к полной HttpRequest
интеграции с ASP.NET Core:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;
namespace AspNetIntegration
{
public class BodyBindingHttpTrigger
{
[Function(nameof(BodyBindingHttpTrigger))]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
[FromBody] Person person)
{
return new OkObjectResult(person);
}
}
public record Person(string Name, int Age);
}
Настройка конечной точки HTTP
По умолчанию при создании функции для триггера HTTP маршрут для ее адресации имеет следующий вид:
https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>
Этот маршрут можно настроить с помощью дополнительного свойства route
привязки для вывода триггера HTTP. Для параметров можно использовать любое ограничение маршрута веб-API.
Следующий код функции принимает два параметра category
и id
в маршруте и записывает ответ, используя оба параметра.
[Function("HttpTrigger1")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post",
Route = "products/{category:alpha}/{id:int?}")] HttpRequestData req, string category, int? id,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("HttpTrigger1");
logger.LogInformation("C# HTTP trigger function processed a request.");
var message = String.Format($"Category: {category}, ID: {id}");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString(message);
return response;
}
Параметры маршрута определяются с помощью параметра route
заметки HttpTrigger
. Следующий код функции принимает два параметра category
и id
в маршруте и записывает ответ, используя оба параметра.
package com.function;
import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
public class HttpTriggerJava {
public HttpResponseMessage<String> HttpTrigger(
@HttpTrigger(name = "req",
methods = {"get"},
authLevel = AuthorizationLevel.FUNCTION,
route = "products/{category:alpha}/{id:int}") HttpRequestMessage<String> request,
@BindingName("category") String category,
@BindingName("id") int id,
final ExecutionContext context) {
String message = String.format("Category %s, ID: %d", category, id);
return request.createResponseBuilder(HttpStatus.OK).body(message).build();
}
}
Например, следующий код TypeScript определяет route
свойство для триггера HTTP с двумя параметрами и category
id
. В примере считываются параметры из запроса и возвращаются их значения в ответе.
import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';
export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
const category = request.params.category;
const id = request.params.id;
return { body: `Category: ${category}, ID: ${id}` };
}
app.http('httpTrigger1', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'products/{category:alpha}/{id:int?}',
handler: httpTrigger1,
});
Например, следующий код JavaScript определяет route
свойство для триггера HTTP с двумя параметрами и category
id
. В примере считываются параметры из запроса и возвращаются их значения в ответе.
const { app } = require('@azure/functions');
app.http('httpTrigger1', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'products/{category:alpha}/{id:int?}',
handler: async (request, context) => {
const category = request.params.category;
const id = request.params.id;
return { body: `Category: ${category}, ID: ${id}` };
},
});
Например, следующий код определяет route
свойство триггера HTTP с двумя параметрами и category
id
:
Параметры маршрута, объявленные в файле function.json, доступны как свойство объекта $Request.Params
.
$Category = $Request.Params.category
$Id = $Request.Params.id
$Message = "Category:" + $Category + ", ID: " + $Id
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $Message
})
Контекст выполнения функции предоставляется с помощью параметра, объявленного как func.HttpRequest
. Этот экземпляр позволяет функции обращаться к параметрам маршрута данных, значениям строк запросов и методам, которые позволяют возвращать HTTP-ответы.
После определения параметры маршрута становятся доступными в функции путем вызова метода route_params
.
import logging
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
category = req.route_params.get('category')
id = req.route_params.get('id')
message = f"Category: {category}, ID: {id}"
return func.HttpResponse(message)
При такой конфигурации функция доступна по приведенному ниже маршруту вместо исходного.
https://<APP_NAME>.azurewebsites.net/api/products/electronics/357
Эта конфигурация позволяет коду функции поддерживать два параметра в адресе, категории и идентификаторе. Дополнительные сведения о том, как параметры маршрута маркеризированы в URL-адресе, см. в разделе "Маршрутизация" в ASP.NET Core.
По умолчанию все маршруты функций префиксируются с api
префиксом. Вы можете настроить или удалить этот префикс с помощью свойства extensions.http.routePrefix
в файле host.json. В следующем примере префикс маршрута удаляется api
с помощью пустой строки префикса в файле host.json .
{
"extensions": {
"http": {
"routePrefix": ""
}
}
}
Использование параметров маршрута
Каждой привязке доступны параметры маршрута, которые определяют шаблон route
для функции. Например, если маршрут определен как "route": "products/{id}"
, привязка к хранилищу таблиц может использовать в конфигурации привязки значение параметра {id}
.
В следующей конфигурации показано, как параметр {id}
передается в rowKey
привязки.
import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';
const tableInput = input.table({
connection: 'MyStorageConnectionAppSetting',
partitionKey: 'products',
tableName: 'products',
rowKey: '{id}',
});
export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
return { jsonBody: context.extraInputs.get(tableInput) };
}
app.http('httpTrigger1', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'products/{id}',
extraInputs: [tableInput],
handler: httpTrigger1,
});
const { app, input } = require('@azure/functions');
const tableInput = input.table({
connection: 'MyStorageConnectionAppSetting',
partitionKey: 'products',
tableName: 'products',
rowKey: '{id}',
});
app.http('httpTrigger1', {
methods: ['GET'],
authLevel: 'anonymous',
route: 'products/{id}',
extraInputs: [tableInput],
handler: async (request, context) => {
return { jsonBody: context.extraInputs.get(tableInput) };
},
});
{
"type": "table",
"direction": "in",
"name": "product",
"partitionKey": "products",
"tableName": "products",
"rowKey": "{id}"
}
При использовании параметров маршрута для вашей функции автоматически создается invoke_URL_template
. Клиенты могут использовать шаблон URL-адреса, чтобы понять, какие параметры им необходимо передать в URL-адресе при вызове вашей функции с использованием ее URL-адреса. Перейдите к одной из функций, выполняемых по протоколу HTTP, на портале Azure и выберите Получить URL-адрес функции.
Получить доступ к invoke_URL_template
можно с помощью программных интерфейсов списка функций или команды Получить функцию в Azure Resource Manager.
HTTP-потоки
Теперь вы можете передавать запросы к конечной точке HTTP и ответы в Node.js приложениях-функциях версии 4. Дополнительные сведения см. в разделе HTTP-потоков.
HTTP-потоки
Поддержка потоков HTTP в Python позволяет принимать и возвращать данные из конечных точек HTTP с помощью API запросов FastAPI и ответов, включенных в ваших функциях. Эти API позволяют узлу обрабатывать данные в HTTP-сообщениях как блоки вместо того, чтобы считывать все сообщение в память. Дополнительные сведения см. в статье HTTP-потоки в Python
Внимание
Поддержка потоков HTTP для Python в настоящее время доступна в предварительной версии и поддерживается только для модели программирования Python версии 2.
Работа с удостоверениями клиентов
Если в приложении-функции используется аутентификация и авторизация Службы приложений, сведения об аутентифицированных клиентах можно посмотреть прямо в коде. Эта информация доступна в виде заголовков запросов, которые вставляет платформа.
Эти сведения также можно считывать из данных привязки.
Примечание.
Доступ к данным клиента, прошедшим проверку подлинности, в настоящее время доступен только для языков .NET. Она также не поддерживается в среде выполнения функций версии 1.x.
Сведения о клиентах, прошедших проверку подлинности, доступны как ClaimsPrincipal, которые можно взять в контексте запроса, как показано в следующем примере.
Прошедший проверку подлинности пользователь доступен через заголовки HTTP.
Прошедший проверку подлинности пользователь доступен через заголовки HTTP.
Уровень авторизации
Уровень авторизации — это строковое значение, указывающее тип ключа авторизации, необходимый для доступа к конечной точке функции. Для функции, активированной через HTTP, уровень авторизации может принимать одно из следующих значений.
Значение уровня | Description |
---|---|
анонимное | Ключ доступа не требуется. |
function | Для доступа к конечной точке требуется ключ для конкретной функции. |
admin | Главный ключ необходим для доступа к конечной точке. |
Если уровень не задан явным образом, авторизация по умолчанию используется на function
уровне.
Если уровень не задан явным образом, авторизация по умолчанию зависит от версии модели Node.js:
По умолчанию авторизация выполняется на anonymous
уровне.
Ключи доступа к функции
Функции позволяют использовать ключи доступа, чтобы упростить доступ к конечным точкам функции. Если для триггерной функции HTTP не задан anonymous
уровень авторизации, запросы должны включать ключ доступа в запрос. Дополнительные сведения см. в статье "Работа с ключами доступа" в Функции Azure.
Авторизация ключа доступа
Большинству шаблонов триггеров HTTP требуется ключ доступа в запросе. Поэтому HTTP-запрос обычно выглядит как следующий URL-адрес:
https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?code=<API_KEY>
Ключ можно включить в переменную строки запроса с именем code
, как упоминалось ранее. Его также можно включить в заголовок HTTP x-functions-key
. Значением ключа может быть любой ключ функции, определенный для запрашиваемой функции, или любой ключ узла.
Вы можете разрешить анонимные запросы, которые не требуют ключей. Вы также можете указать, что используется главный ключ. Уровень авторизации по умолчанию можно изменить с помощью свойства authLevel
в объекте JSON для привязки.
Примечание.
При локальном выполнении функций авторизация всегда отключается, независимо от указанного параметра уровня аутентификации. После публикации в Azure в триггере применяется параметр authLevel
. Ключи по-прежнему требуются при локальном выполнении в контейнере.
Веб-перехватчики
Примечание.
Режим веб-перехватчика доступен только для версии 1.x среды выполнения функций. Это изменение внесено для повышения производительности триггеров HTTP в версии 2.x и более поздних версиях.
В версии 1.x шаблоны веб-перехватчиков предоставляют другую проверку полезных данных веб-перехватчика. В версии 2.x и более поздних версиях базовый триггер HTTP также работает, и мы рекомендуем использовать именно его для реализации веб-перехватчиков.
Тип веб-перехватчика
Свойство привязки webHookType
указывает тип, если веб-перехватчик поддерживается функцией, который также диктует поддерживаемые полезные данные. Тип веб-перехватчика может принимать одно из следующих значений:
Значение типа | Description |
---|---|
genericJson |
— конечная точка веб-перехватчика общего назначения без логики для конкретного поставщика. Этот параметр определяет, что принимаются только запросы HTTP POST с содержимым типа application/json . |
github |
Функция отвечает на веб-перехватчики GitHub. Не используйте свойство authLevel с веб-перехватчиками GitHub. |
slack |
Функция отвечает на веб-перехватчики Slack. Не используйте свойство authLevel вместе с веб-перехватчиками Slack. |
При задании свойства webHookType
не устанавливайте свойство methods
в привязке.
Веб-перехватчики GitHub
Чтобы настроить ответ на вызовы веб-перехватчика GitHub, прежде всего создайте функцию с триггером HTTP, для которого свойство webHookType будет иметь значение github
. Затем скопируйте его URL-адрес и ключ API в репозиторий GitHub, используя страницу Добавить веб-перехватчик.
Веб-перехватчики Slack
Webhook Slack создает маркер автоматически и не позволяет вам задать его, поэтому необходимо настроить ключ для конкретной функции с использованием маркера, предоставленного Slack. Ознакомьтесь с разделом Ключи авторизации.
Веб-перехватчики и ключи
Авторизация веб-перехватчика обрабатывается компонентом получателя веб-перехватчика, который входит в состав триггера HTTP. Механизм обработки различается в зависимости от типа веб-перехватчика. Каждый из этих механизмов зависит от ключей. По умолчанию используется ключ функции с именем default. Чтобы использовать другой ключ, необходимо настроить поставщик веб-перехватчика так, чтобы он отправлял имя ключа в составе запроса одним из следующих способов.
- В строке запроса: поставщик передает имя ключа в параметре
clientid
строки запроса, напримерhttps://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME>
. - В заголовке запроса: поставщик передает имя ключа в заголовке
x-functions-clientid
.
Типы содержимого
Передача двоичных данных и данных формы в функцию, отличную от C#, требует использования соответствующего заголовка типа содержимого. Поддерживаемые типы содержимого включают octet-stream
для двоичных данных и составные типы.
Известные проблемы
В функциях, отличных от C#, запросы, отправляемые с типом содержимого image/jpeg
, приводят к передаче значения string
в функцию. В подобных случаях можно вручную преобразовать значение string
в массив байтов для доступа к необработанным двоичным данным.
Ограничения
Длина HTTP-запроса ограничена 100 МБ (104 857 600 байт), а длина URL-адреса —4 КБ (4096 байт). Эти ограничения задает элемент httpRuntime
файла Web.config среды выполнения.
Если функция, которая использует триггер HTTP, выполняется дольше 230 секунд, допустимое время ожидания в Azure Load Balancer истекает и возвращается ошибка HTTP 502. Функция продолжит работу, но вернуть ответ HTTP будет невозможно. Для долго выполняющихся функций рекомендуем следовать асинхронным шаблонам и возвращать расположение, в котором можно проверить состояние запроса. Чтобы узнать, как долго может выполняться функция, см. раздел Масштабирование и размещение — план.