Pemicu HTTP Azure Functions

Pemicu HTTP memungkinkan Anda memanggil fungsi dengan permintaan HTTP. Anda dapat menggunakan pemicu HTTP untuk membuat API tanpa server dan merespons webhook.

Nilai pengembalian default untuk fungsi yang dipicu HTTP adalah:

  • HTTP 204 No Content dengan isi kosong di Functions 2.x dan versi yang lebih tinggi
  • HTTP 200 OK dengan isi kosong di Functions 1.x

Untuk mengubah respons HTTP, konfigurasikan pengikatan output.

Untuk informasi selengkapnya tentang pengikatan HTTP, lihat gambaran umum dan referensi pengikatan output.

Tip

Jika Anda berencana untuk menggunakan pengikatan HTTP atau WebHook, rencanakan untuk menghindari kekurangan port yang dapat disebabkan oleh pembuatan objek yang tidak tepat dari HttpClient. Untuk informasi selengkapnya, lihat Cara mengelola koneksi di Azure Functions.

Penting

Artikel ini menggunakan tab untuk mendukung beberapa versi model pemrograman Node.js. Model v4 umumnya tersedia dan dirancang untuk memiliki pengalaman yang lebih fleksibel dan intuitif untuk pengembang JavaScript dan TypeScript. Untuk detail selengkapnya tentang cara kerja model v4, lihat panduan pengembang Node.js Azure Functions. Untuk mempelajari selengkapnya tentang perbedaan antara v3 dan v4, lihat panduan migrasi.

Azure Functions mendukung dua model pemrograman untuk Python. Cara Anda menentukan pengikatan tergantung pada model pemrograman yang Anda pilih.

Model pemrograman Python v2 memungkinkan Anda menentukan pengikatan menggunakan dekorator langsung dalam kode fungsi Python Anda. Untuk informasi selengkapnya, lihat panduan pengembang Python.

Artikel ini mendukung kedua model pemrograman.

Contoh

Fungsi C# dapat dibuat dengan menggunakan salah satu mode C# berikut:

  • Model pekerja terisolasi: Fungsi C# terkompilasi yang berjalan dalam proses pekerja yang terisolasi dari runtime. Proses pekerja terisolasi diperlukan untuk mendukung fungsi C# yang berjalan pada versi LTS dan non-LTS .NET dan .NET Framework. Ekstensi untuk fungsi proses pekerja yang terisolasi menggunakan Microsoft.Azure.Functions.Worker.Extensions.* namespace layanan.
  • Model dalam proses: Fungsi C# yang dikompilasi yang berjalan dalam proses yang sama dengan runtime Functions. Dalam variasi model ini, Functions dapat dijalankan menggunakan scripting C#, yang didukung terutama untuk pengeditan portal C#. Ekstensi untuk fungsi dalam proses menggunakan Microsoft.Azure.WebJobs.Extensions.* namespace layanan.

Penting

Dukungan akan berakhir untuk model dalam proses pada 10 November 2026. Kami sangat menyarankan Agar Anda memigrasikan aplikasi Anda ke model pekerja yang terisolasi untuk dukungan penuh.

Kode dalam artikel ini kembali default ke sintaks .NET Core, digunakan dalam Functions versi 2.x dan yang lebih tinggi. Untuk informasi tentang sintaksis 1.x, lihat Templat fungsi 1.x.

Contoh berikut menunjukkan pemicu HTTP yang mengembalikan respons "hello, world" sebagai IActionResult, menggunakan integrasi ASP.NET Core di .NET Isolated:

[Function("HttpFunction")]
public IActionResult Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req)
{
    return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
}

Contoh berikut menunjukkan pemicu HTTP yang mengembalikan respons "halo dunia" sebagai objek 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;
}

Bagian ini berisi contoh-contoh berikut:

Contoh berikut menunjukkan pengikatan pemicu HTTP.

Membacakan parameter dari string kueri

Contoh ini membaca parameter, bernama id, dari string kueri, dan menggunakannya untuk membuat dokumen JSON yang dikembalikan ke klien, dengan tipe konten 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();
    }
}

Membaca isi dari permintaan POST

Contoh ini membaca isi permintaan POST, sebagai String, dan menggunakannya untuk membuat dokumen JSON yang dikembalikan ke klien, dengan tipe konten 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();
        }
    }

Membaca parameter dari rute

Contoh ini membaca parameter wajib, bernama id, dan parameter opsional name dari jalur rute, dan menggunakannya untuk membuat dokumen JSON yang dikembalikan ke klien, dengan jenis konten 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();
    }
}

Membaca isi POJO dari permintaan POST

Berikut adalah kode untuk kelas ToDoItem, yang direferensikan dalam contoh ini:


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 + "}";
  }
}

Contoh ini membaca isi permintaan POST. Isi permintaan secara otomatis diuraikan serialisasinya menjadi objek ToDoItem, dan dikembalikan ke klien, dengan jenis konten application/json. Parameter ToDoItem diserialisasikan oleh runtime Functions ketika ditetapkan ke body properti HttpMessageResponse.Builder kelas.

@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();
    }
}

Contoh berikut menunjukkan fungsi TypeScript pemicu HTTP. Fungsi ini mencari name parameter baik dalam string kueri atau isi permintaan 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,
});

Contoh berikut menunjukkan fungsi JavaScript pemicu HTTP. Fungsi ini mencari name parameter baik dalam string kueri atau isi permintaan 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}!` };
    },
});

Contoh berikut menunjukkan pengikatan pemicu di file function.json dan fungsi PowerShell. Fungsi ini mencari name parameter baik dalam string kueri atau isi permintaan 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
})

Contoh berikut menunjukkan pengikatan pemicu dan fungsi Python yang menggunakan pengikatan. Fungsi ini mencari name parameter baik dalam string kueri atau isi permintaan HTTP. Contohnya tergantung pada apakah Anda menggunakan model pemrograman Python v1 atau v2.

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
        )

Atribut

Pustaka C# proses dalam proses dan terisolasi menggunakan HttpTriggerAttribute untuk menentukan pengikatan pemicu. Skrip C# sebagai gantinya menggunakan file konfigurasi function.json seperti yang dijelaskan dalam panduan pembuatan skrip C#.

Dalam aplikasi fungsi proses pekerja yang HttpTriggerAttribute terisolasi, mendukung parameter berikut:

Parameter Deskripsi
AuthLevel Menentukan kunci apa, jika ada, yang perlu ada pada permintaan untuk menjalankan fungsi. Untuk nilai yang didukung, lihat Tingkat otorisasi.
Metode Larik metode HTTP yang direspons oleh fungsi. Jika tidak ditentukan, fungsi merespons semua metode HTTP. Lihat mengkustomisasi titik akhir HTTP.
Rute Mendefinisikan templat rute, mengontrol URL permintaan mana yang merespons fungsi Anda. Nilai default jika tidak ada yang disediakan adalah <functionname>. Untuk informasi selengkapnya, lihat mengkustomisasi titik akhir HTTP.

Dekorator

Hanya berlaku untuk model pemrograman Python v2.

Untuk fungsi Python v2 yang ditentukan menggunakan dekorator, properti berikut untuk pemicu ditentukan dalam route dekorator, yang menambahkan pengikatan HttpTrigger dan HttpOutput:

Properti Deskripsi
route Rute untuk titik akhir http. Jika Tidak Ada, itu akan diatur ke nama fungsi jika ada atau nama fungsi python yang ditentukan pengguna.
trigger_arg_name Nama argumen untuk HttpRequest. Nilai defaultnya adalah 'req'.
binding_arg_name Nama argumen untuk HttpResponse. Nilai defaultnya adalah '$return'.
methods Tuple metode HTTP tempat fungsi merespons.
auth_level Menentukan kunci apa, jika ada, yang perlu ada pada permintaan untuk menjalankan fungsi.

Untuk fungsi Python yang ditentukan dengan menggunakan function.json, lihat bagian Konfigurasi .

Anotasi

Di pustaka runtime fungsi Java, gunakan anotasi HttpTrigger, yang mendukung pengaturan berikut:

Konfigurasi

Hanya berlaku untuk model pemrograman Python v1.

Tabel berikut menjelaskan properti yang bisa Anda atur pada objek yang options diteruskan ke app.http() metode .

Properti Deskripsi
authLevel Menentukan kunci apa, jika ada, yang perlu ada pada permintaan untuk menjalankan fungsi. Untuk nilai yang didukung, lihat Tingkat otorisasi.
metode Larik metode HTTP yang direspons oleh fungsi. Jika tidak ditentukan, fungsi merespons semua metode HTTP. Lihat mengkustomisasi titik akhir HTTP.
rute Mendefinisikan templat rute, mengontrol URL permintaan mana yang merespons fungsi Anda. Nilai default jika tidak ada yang disediakan adalah <functionname>. Untuk informasi selengkapnya, lihat mengkustomisasi titik akhir HTTP.

Tabel berikut menjelaskan properti konfigurasi pemicu yang Anda atur di file function.json, yang berbeda berdasarkan versi runtime.

Tabel berikut menjelaskan properti konfigurasi pengikatan yang Anda atur di file function.json.

Properti function.json Deskripsi
jenis Wajib - harus diatur ke httpTrigger.
arah Wajib - harus diatur ke in.
nama Wajib - nama variabel yang digunakan dalam kode fungsi untuk permintaan atau isi permintaan.
authLevel Menentukan kunci apa, jika ada, yang perlu ada pada permintaan untuk menjalankan fungsi. Untuk nilai yang didukung, lihat Tingkat otorisasi.
metode Larik metode HTTP yang direspons oleh fungsi. Jika tidak ditentukan, fungsi merespons semua metode HTTP. Lihat mengkustomisasi titik akhir HTTP.
rute Mendefinisikan templat rute, mengontrol URL permintaan mana yang merespons fungsi Anda. Nilai default jika tidak ada yang disediakan adalah <functionname>. Untuk informasi selengkapnya, lihat mengkustomisasi titik akhir HTTP.

Penggunaan

Bagian ini menjelaskan cara mengonfigurasi pengikatan fungsi pemicu HTTP Anda.

Anotasi HttpTrigger harus diterapkan ke parameter metode dari salah satu jenis berikut:

  • HttpRequestMessage<T>.
  • Setiap jenis Java asli seperti int, String, byte[].
  • Nilai yang dapat diubah ke null menggunakan Opsional.
  • Jenis plain-old Java object (POJO).

Payload

Jenis input pemicu dinyatakan sebagai salah satu jenis berikut:

Tipe Deskripsi
HttpRequest Penggunaan jenis ini mengharuskan aplikasi dikonfigurasi dengan integrasi ASP.NET Core di .NET Isolated.
Ini memberi Anda akses penuh ke objek permintaan dan HttpContext secara keseluruhan.
HttpRequestData Proyeksi objek permintaan.
Jenis kustom Ketika isi permintaan adalah JSON, runtime akan mencoba mengurainya untuk mengatur properti objek.

Ketika parameter pemicu adalah HttpRequestDataHttpRequestjenis kustom , juga dapat terikat ke parameter tambahan menggunakan Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute. Penggunaan atribut ini memerlukan Microsoft.Azure.Functions.Worker.Extensions.Http versi 3.1.0 atau yang lebih baru. Perhatikan bahwa ini adalah jenis yang berbeda dari atribut serupa di Microsoft.AspNetCore.Mvc, dan saat menggunakan integrasi ASP.NET Core, Anda akan memerlukan referensi atau using pernyataan yang sepenuhnya memenuhi syarat. Contoh berikut menunjukkan cara menggunakan atribut untuk mendapatkan konten isi saja sambil masih memiliki akses ke lengkap HttpRequest, menggunakan integrasi 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);
}

Mengkustomisasi titik akhir HTTP

Secara default saat Anda membuat fungsi untuk pemicu HTTP, fungsi tersebut dapat diatasi dengan rute formulir:

https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>

Anda dapat menyesuaikan rute ini menggunakan properti route opsional pada pengikatan input pemicu HTTP. Anda dapat menggunakan Batasan Rute API Web apa pun dengan parameter Anda.

Kode fungsi berikut menerima dua parameter category dan id dalam rute dan menulis respons menggunakan kedua parameter.

[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;
}

Parameter rute ditentukan menggunakan pengaturan route dari anotasi HttpTrigger. Kode fungsi berikut menerima dua parameter category dan id dalam rute dan menulis respons menggunakan kedua parameter.

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();
    }
}

Sebagai contoh, kode TypeScript berikut menentukan route properti untuk pemicu HTTP dengan dua parameter, category dan id. Contoh membaca parameter dari permintaan dan mengembalikan nilainya dalam respons.

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,
});

Sebagai contoh, kode JavaScript berikut mendefinisikan route properti untuk pemicu HTTP dengan dua parameter, category dan id. Contoh membaca parameter dari permintaan dan mengembalikan nilainya dalam respons.

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}` };
    },
});

Sebagai contoh, kode berikut menentukan route properti untuk pemicu HTTP dengan dua parameter, category dan id:

@app.function_name(name="httpTrigger")
@app.route(route="products/{category:alpha}/{id:int?}")

Parameter rute yang dinyatakan dalam file function.json dapat diakses sebagai properti objek $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
})

Konteks eksekusi fungsi diekspos melalui parameter yang dinyatakan sebagai func.HttpRequest. Instans ini memungkinkan suatu fungsi untuk mengakses parameter rute data, nilai string kueri, dan metode yang memungkinkan Anda mengembalikan respons HTTP.

Setelah didefinisikan, parameter rute tersedia untuk fungsi dengan memanggil metoderoute_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)

Dengan menggunakan konfigurasi ini, fungsi ini sekarang dapat diatasi dengan rute berikut, alih-alih rute asli.

https://<APP_NAME>.azurewebsites.net/api/products/electronics/357

Konfigurasi ini memungkinkan kode fungsi untuk mendukung dua parameter dalam alamat, kategori, dan ID. Untuk informasi selengkapnya tentang bagaimana parameter rute ditokenisasi dalam URL, lihat Perutean di ASP.NET Core.

Secara default, semua rute fungsi diawali dengan prefiks api. Anda juga dapat menyesuaikan atau menghapus awalan menggunakan properti extensions.http.routePrefix di file host.json Anda. Contoh berikut menghapus prefiks rute api dengan menggunakan string kosong untuk prefiks di file host.json.

{
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    }
}

Menggunakan parameter rute

Parameter rute yang mendefinisikan pola route fungsi tersedia untuk setiap pengikatan. Misalnya, jika Anda memiliki rute yang ditetapkan sebagai "route": "products/{id}" maka pengikatan penyimpanan tabel dapat menggunakan nilai parameter {id} dalam konfigurasi pengikatan.

Konfigurasi berikut menunjukkan bagaimana {id}parameter diteruskan ke pengikatan rowKey.

@app.table_input(arg_name="product", table_name="products", 
                 row_key="{id}", partition_key="products",
                 connection="AzureWebJobsStorage")
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}"
}

Saat Anda menggunakan parameter rute, sebuah invoke_URL_template secara otomatis dibuat untuk fungsi Anda. Klien Anda dapat menggunakan templat URL untuk memahami parameter yang mereka butuhkan untuk meneruskan URL saat memanggil fungsi Anda menggunakan URL-nya. Navigasi ke salah satu fungsi yang dipicu HTTP Anda di portal Microsoft Azure dan pilih Dapatkan URL fungsi.

Anda dapat mengakses invoke_URL_template secara terprogram dengan menggunakan API Azure Resource Manager untuk Fungsi Daftar atau Fungsi Get.

Aliran HTTP (pratinjau)

Anda sekarang dapat melakukan streaming permintaan ke dan respons dari titik akhir HTTP Anda di aplikasi fungsi Node.js v4. Untuk informasi selengkapnya, lihat Aliran HTTP.

Bekerja dengan identitas klien

Jika aplikasi fungsi Anda menggunakan Autentikasi/Otorisasi App Service,Anda dapat melihat informasi tentang klien yang diautentikasi dari kode Anda. Informasi ini tersedia sebagai header permintaan yang disuntikkan oleh platform.

Anda juga dapat membaca informasi ini dari data pengikatan. Kemampuan ini hanya tersedia untuk runtime Functions di 2.x dan versi yang lebih tinggi. Saat ini juga hanya tersedia untuk bahasa .NET.

Informasi mengenai klien yang diautentikasi tersedia sebagai ClaimsPrincipal, yang tersedia sebagai bagian dari konteks permintaan seperti yang ditunjukkan pada contoh berikut:

Pengguna yang diautentikasi tersedia melalui Header HTTP.

Pengguna yang diautentikasi tersedia melalui Header HTTP.

Tingkat otorisasi

Tingkat otorisasi adalah nilai string yang menunjukkan jenis kunci otorisasi yang diperlukan untuk mengakses titik akhir fungsi. Untuk fungsi yang dipicu HTTP, tingkat otorisasi dapat berupa salah satu dari nilai berikut:

Nilai tingkat Deskripsi
anonim Tidak diperlukan kunci API. Ini adalah nilai default ketika tingkat tidak diatur secara khusus.
fungsi Diperlukan kunci API khusus fungsi.
admin Kunci utama diperlukan.
Nilai tingkat Deskripsi
anonim Tidak diperlukan kunci API.
fungsi Diperlukan kunci API khusus fungsi. Ini adalah nilai default ketika tingkat tidak diatur secara khusus.
admin Kunci utama diperlukan.

Kunci akses fungsi

Azure Functions memungkinkan Anda menggunakan kunci untuk mempersulit akses titik akhir fungsi HTTP Anda selama pengembangan. Kecuali tingkat akses HTTP pada fungsi yang dipicu HTTP diatur ke anonymous, permintaan harus menyertakan kunci akses API dalam permintaan.

Meskipun kunci menyediakan mekanisme keamanan default, Anda mungkin ingin mempertimbangkan opsi lain untuk mengamankan titik akhir HTTP dalam produksi. Misalnya, ini bukan praktik yang baik untuk mendistribusikan rahasia bersama di aplikasi publik. Jika fungsi Anda dipanggil dari klien publik, Anda mungkin ingin mempertimbangkan untuk menerapkan mekanisme keamanan lain. Untuk mempelajari lebih lanjut, lihat Mengamankan titik akhir HTTP dalam produksi.

Saat memperpanjang nilai kunci fungsi, Anda harus mendistribusikan ulang nilai kunci yang diperbarui secara manual ke semua klien yang memanggil fungsi Anda.

Cakupan otorisasi (tingkat fungsi)

Ada dua ruang lingkup akses untuk kunci tingkat fungsi:

  • Fungsi: Kunci ini hanya berlaku untuk fungsi tertentu di mana kunci tersebut ditentukan. Ketika digunakan sebagai kunci API, ini hanya memungkinkan akses ke fungsi tersebut.

  • Host: Kunci dengan lingkup host dapat digunakan untuk mengakses semua fungsi dalam aplikasi fungsi. Saat digunakan sebagai kunci API, ini memungkinkan akses ke fungsi apa pun dalam aplikasi fungsi.

Setiap kunci diberi nama untuk referensi, dan ada kunci default (bernama "default") di tingkat fungsi dan host. Kunci fungsi lebih diprioritaskan daripada kunci host. Ketika dua kunci didefinisikan dengan nama yang sama, kunci fungsi selalu digunakan.

Kunci master (tingkat admin)

Setiap aplikasi fungsi juga memiliki kunci host tingkat admin bernama _master. Selain menyediakan akses tingkat host ke semua fungsi di aplikasi, kunci master juga menyediakan akses administratif ke API REST runtime. Kunci ini tidak dapat dicabut. Ketika Anda mengatur tingkat akses admin, permintaan harus menggunakan kunci master; kunci lainnya mengakibatkan kegagalan akses.

Perhatian

Karena izin yang ditinggikan di aplikasi fungsi yang diberikan oleh kunci master, Anda tidak boleh berbagi kunci ini dengan pihak ketiga atau mendistribusikannya di aplikasi klien asli. Berhati-hatilah saat memilih tingkat akses admin.

Mendapatkan kunci

Kunci disimpan sebagai bagian dari aplikasi fungsi Anda di Azure dan dienkripsi saat istirahat. Untuk melihat kunci Anda, buat kunci baru, atau ubah kunci ke nilai baru, navigasikan ke salah satu fungsi yang dipicu HTTP Anda di portal Microsoft Azure dan pilih Kunci Fungsi.

Anda juga dapat mengelola kunci host. Navigasi ke aplikasi fungsi di portal Microsoft Azure dan pilihKunci aplikasi.

Anda dapat memperoleh kunci fungsi dan host secara terprogram dengan menggunakan API Azure Resource Manager. Ada API untuk Daftar Kunci Fungsi dan Daftar Kunci Host, dan saat menggunakan slot penyebaran, API yang setara adalah Daftar Slot Kunci Fungsi dan Daftar Slot Kunci Host.

Anda juga dapat membuat fungsi baru dan kunci host secara terprogram dengan menggunakan API Buat atau Perbarui Rahasia Fungsi, Buat Atau Perbarui Fungsi Slot Rahasia, Buat Atau Perbarui Rahasia Host dan Buat Atau Perbarui Slot Rahasia Host.

Fungsi dan kunci host dapat dihapus secara terprogram dengan menggunakan API Hapus Rahasia Fungsi, Hapus Slot Rahasia Fungsi, Hapus Rahasia Host, dan Hapus Slot Rahasia Host.

Anda juga dapat menggunakan API manajemen kunci warisan untuk mendapatkan kunci fungsi, tetapi sebaiknya gunakan API Azure Resource Manager.

Otorisasi kunci API

Sebagian besar templat pemicu HTTP memerlukan kunci API dalam permintaan. Jadi permintaan HTTP Anda biasanya akan terlihat seperti URL berikut:

https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?code=<API_KEY>

Kunci dapat disertakan dalam variabel string kueri bernama code, seperti tercantum di atas. Ini juga dapat dimasukkan dalam header HTTP x-functions-key. Nilai kunci dapat menjadi kunci fungsi apa pun yang ditentukan untuk fungsi, atau kunci host apa pun.

Anda dapat mengizinkan permintaan anonim, yang tidak memerlukan kunci. Anda juga dapat mengharuskan kunci master untuk digunakan. Anda mengubah tingkat otorisasi default dengan menggunakan properti authLevel di JSON yang mengikat. Untuk informasi selengkapnya, lihat bagian Pemicu - konfigurasi.

Catatan

Saat menjalankan fungsi secara lokal, otorisasi dinonaktifkan terlepas dari pengaturan tingkat otorisasi yang ditentukan. Setelah menerbitkan ke Azure, pengaturan authLevel di pemicu Anda diberlakukan. Kunci masih diperlukan saat menjalankan secara lokal dalam kontainer.

Mengamankan titik akhir HTTP dalam produksi

Untuk sepenuhnya mengamankan titik akhir fungsi Anda dalam produksi, Anda harus mempertimbangkan untuk menerapkan salah satu opsi keamanan tingkat aplikasi fungsi berikut. Saat menggunakan salah satu metode keamanan tingkat aplikasi fungsi ini, Anda harus mengatur tingkat otorisasi fungsi yang dipicu HTTP ke anonymous.

Mengaktifkan Autentikasi/Otorisasi App Service

Platform App Service memungkinkan Anda menggunakan ID Microsoft Entra dan beberapa idP pihak ketiga untuk mengautentikasi klien. Anda dapat menggunakan strategi ini untuk menerapkan aturan otorisasi kustom untuk fungsi Anda, dan Anda dapat bekerja dengan informasi pengguna dari kode fungsi Anda. Untuk mempelajari lebih lanjut, lihat Autentikasi dan otorisasi di Azure App Service dan Bekerja dengan identitas klien.

Menggunakan Azure API Management (APIM) untuk mengautentikasi permintaan

APIM menyediakan berbagai opsi keamanan API untuk permintaan yang masuk. Untuk mempelajari lebih lanjut, lihat Kebijakan autentikasi API Management. Dengan berlakunya APIM, Anda dapat mengonfigurasi aplikasi fungsi untuk menerima permintaan hanya dari alamat IP instans APIM Anda. Untuk mempelajari lebih lanjut, lihat Pembatasan alamat IP.

Menyebarkan aplikasi fungsi Anda dalam isolasi

Lingkungan Azure App Service (ASE) menyediakan lingkungan hosting khusus untuk menjalankan fungsi Anda. ASE memungkinkan Anda mengonfigurasi gateway front-end tunggal yang dapat digunakan untuk mengautentikasi semua permintaan yang masuk. Untuk informasi selengkapnya, lihat Mengonfigurasi Web Application Firewall (WAF) untuk Lingkungan App Service.

Webhook

Catatan

Mode webhook hanya tersedia untuk versi 1.x dari runtime Fungsi. Perubahan ini dilakukan untuk meningkatkan kinerja pemicu HTTP pada versi 2.x dan yang lebih tinggi.

Dalam versi 1.x, templat webhook menyediakan validasi tambahan untuk payload webhook. Dalam versi 2.x dan yang lebih tinggi, pemicu HTTP dasar masih berfungsi dan merupakan pendekatan yang disarankan untuk webhook.

Jenis WebHook

Properti pengikatan webHookType menunjukkan jenis jika webhook didukung oleh fungsi, yang juga menentukan payload yang didukung. Jenis webhook bisa menjadi salah satu nilai berikut:

Ketik nilai Deskripsi
genericJson Titik akhir webhook tujuan umum tanpa logika untuk penyedia tertentu. Pengaturan ini membatasi permintaan hanya untuk mereka yang menggunakan HTTP POST dan dengan jenis konten application/json.
github Fungsi ini merespons webhook GitHub. Jangan gunakan properti authLevel dengan webhook GitHub.
slack Fungsi ini merespons webhook Slack. Jangan gunakan properti authLevel dengan webhook Slack.

Saat mengatur properti webHookType, jangan juga mengatur properti methods pada pengikatan.

Webhook GitHub

Untuk merespons webhook GitHub, pertama-tama buatlah fungsi Anda dengan Pemicu HTTP, dan atur properti webHookType ke github. Kemudian salin URL dan kunci API-nya ke halaman Tambahkan webhook dari repositori GitHub Anda.

Cuplikan layar yang memperlihatkan cara menambahkan webhook untuk fungsi Anda.

Webhook Slack

Webhook Slack menghasilkan token untuk Anda, alih-alih membiarkan Anda menentukannya. Jadi, Anda harus mengonfigurasi kunci spesifik fungsi dengan token dari Slack. Lihat Kunci otorisasi.

Webhook dan kunci

Otorisasi webhook ditangani oleh komponen penerima webhook, bagian dari pemicu HTTP, dan mekanismenya bervariasi menurut jenis webhook. Setiap mekanisme mengandalkan satu kunci. Secara default, kunci fungsi bernama "default" digunakan. Untuk menggunakan kunci lain, konfigurasikan penyedia webhook untuk mengirim nama kunci dengan permintaan dengan salah satu cara berikut:

  • String kueri: Penyedia meneruskan nama kunci dalam clientid parameter string kueri, seperti https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME>.
  • Header permintaan: Penyedia meneruskan nama kunci di header x-functions-clientid.

Jenis konten

Meneruskan data biner dan formulir ke fungsi non-C# mengharuskan Anda menggunakan header tipe konten yang sesuai. Jenis konten yang didukung termasuk octet-stream untuk data biner dan jenis multibagian.

Masalah umum

Dalam fungsi non-C#, permintaan yang dikirim dengan jenis konten image/jpeg menghasilkan nilai string yang diteruskan ke fungsi. Dalam kasus seperti ini, Anda dapat mengonversi nilai string menjadi larik byte secara manual untuk mengakses data biner mentah.

Batas

Panjang permintaan HTTP dibatasi hingga 100 MB (104.857.600 byte), dan panjang URL dibatasi hingga 4 KB (4.096 byte). Batas ini ditentukan oleh elemen httpRuntime dari runtime file Web.config.

Jika fungsi yang menggunakan pemicu HTTP tidak selesai dalam 230 detik, Azure Load Balancer akan kehabisan waktu dan mengembalikan kesalahan HTTP 502. Fungsi ini akan terus berjalan tetapi tidak akan dapat mengembalikan respons HTTP. Untuk fungsi jangka panjang, kami sarankan Anda mengikuti pola asinkron dan mengembalikan lokasi di mana Anda dapat melakukan ping status permintaan. Untuk informasi tentang berapa lama suatu fungsi dapat berjalan, lihat Skala dan hosting - paket Konsumsi.

Langkah berikutnya