Tüm Ürünler
Search
Belge Merkezi

Function Compute:API Gateway tetikleyicileri

Son Güncelleme:Oct 08, 2026

Function Compute, olay kaynağı olarak API Gateway'i destekler. Function Compute'ü bir API'nin arka uç hizmeti olarak yapılandırın; API Gateway gelen istekleri ilgili işleve iletir ve çalıştırma sonucunu çağırana döndürür.

API Gateway tetikleyicilerini ne zaman kullanmalısınız?

Hem API Gateway tetikleyicileri hem de HTTP tetikleyicileri işlevleri HTTP uç noktaları olarak sunar. İhtiyaçlarınıza göre seçim yapın:

Yetenek API Gateway tetikleyicisi HTTP tetikleyicisi
IP izin ve engelleme listeleri Desteklenir Desteklenmez
Kimlik doğrulama (AppKey, AppCode) Desteklenir Desteklenmez
Trafik şekillendirme Desteklenir Desteklenmez
Veri dönüştürme Desteklenir Desteklenmez

Gelişmiş erişim kontrolü, kimlik doğrulama veya trafik yönetimine ihtiyacınız varsa API Gateway tetikleyicisini kullanın. Basit HTTP sunumu için HTTP tetikleyicisi yeterlidir.

API Gateway, arka uç olarak hem olay işlevlerini hem de web işlevlerini destekler. Entegrasyon modeli farklılık gösterir:

  • Olay işlevi: API Gateway, HTTP isteğini yapılandırılmış bir JSON olayına dönüştürür ve işlevinize iletir. İşlevinizin belirli bir formatta JSON yanıtı döndürmesi gerekir.

  • Web işlevi: API Gateway, ham HTTP isteğini işlevinizin dahili ağ uç noktasına iletir. İşleviniz isteği doğrudan bir HTTP sunucusu olarak ele alır.

Olay işlevini API Gateway'e bağlama

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Function Compute ve API Gateway erişimi olan bir Alibaba Cloud hesabı

  • Her iki hizmet için seçilmiş bir bölge (genel ağ trafiği ücretlerinden kaçınmak için hizmetleri aynı bölgede konumlandırın)

Adım 1: Olay işlevi oluşturma

Function Compute 3.0 konsolunda bir olay işlevi oluşturun. Daha fazla bilgi için bkz. Olay işlevi oluşturma.

Adım 2: API Gateway arka uç hizmeti oluşturma

API Gateway'de bir arka uç hizmeti tanımlayın ve bunu işlevinize bağlayın.

  1. API Gateway konsoluna giriş yapın, bir bölge seçin ve sol gezinme bölmesinde Manage APIs > Backend Services seçeneklerini belirleyin. Sağ üst köşede Create Backend Service öğesine tıklayın. Gerekli bilgileri yapılandırın ve Confirm öğesine tıklayın.

    image

  2. Backend Services sayfasında, az önce oluşturduğunuz arka uç hizmetine tıklayın. Production sekmesine tıklayın. Basic Information bölümünde Create öğesine tıklayın, 1. Adımdaki olay işlevini seçin ve ardından Publish öğesine tıklayın.

    image

Adım 3: API oluşturma ve yayınlama

  1. API Gateway konsolunda bir API grubu oluşturun. Grubu işlevinizle aynı bölgeye yerleştirin.

    API grubu ve işlev farklı bölgelerde bulunuyorsa API Gateway, Function Compute'e genel ağ üzerinden erişir ve bu durum trafik ücretlerine neden olur. Daha düşük gecikme süresi ve daha iyi veri güvenliği için aynı bölgeyi kullanın.
  2. Aşağıdaki temel ayarlarla bir API oluşturun ve yayınlayın. Diğer tüm alanlar için varsayılan değerleri koruyun.

    Yapılandırma öğesi Değer
    Security authentication No authentication
    Configuration mode Use an existing backend service
    Backend service type Function Compute
    Version Function Compute 3.0
    Function type Event function
    Backend services 2. Adımda oluşturduğunuz arka uç hizmetini seçin

    image

Adım 4: İşlev kodunu yazma

  1. Function Compute konsoluna giriş yapın. Sol taraftaki gezinme bölmesinde Functions öğesine tıklayın.

  2. Üst gezinme çubuğundan bölgeyi seçin. Functions sayfasında yönetmek istediğiniz işleve tıklayın.

  3. İşlev ayrıntıları sayfasında Code sekmesine tıklayın. Kodunuzu düzenleyiciye yazın ve Deploy öğesine tıklayın.

Tüm örnekler istek olayını okur, anahtar alanları çıkarır ve gerekli JSON formatında bir yanıt döndürür.

Node.js

module.exports.handler = function(event, context, callback) {
   var event = JSON.parse(event);
   var content = {
     path: event.path,
     method: event.method,
     headers: event.headers,
     queryParameters: event.queryParameters,
     pathParameters: event.pathParameters,
     body: event.body
   // You can write your own logic here.
   }
   var response = {
        isBase64Encoded: false,
        statusCode: '200',
        headers: {
          'x-custom-header': 'header value'
        },
        body: content
      };
   callback(null, response)
};

Python

# -*- coding: utf-8 -*-
import json

def handler(event, context):
    event = json.loads(event)
    content = {
        'path': event['path'],
        'method': event['httpMethod'],
        'headers': event['headers'],
        'queryParameters': event['queryParameters'],
        'pathParameters': event['pathParameters'],
        'body': event['body']
    }
    # You can write your own logic here.
    rep = {
        "isBase64Encoded": "false",
        "statusCode": "200",
        "headers": {
            "x-custom-header": "no"
        },
        "body": content
    }
    return json.dumps(rep)

PHP

<?php
function handler($event, $context) {
    $event   = json_decode($event, $assoc = true);
    $content = [
        'path'            => $event['path'],
        'method'          => $event['httpMethod'],
        'headers'         => $event['headers'],
        'queryParameters' => $event['queryParameters'],
        'pathParameters'  => $event['pathParameters'],
        'body'            => $event['body'],
    ];

    $rep = [
        "isBase64Encoded" => "false",
        "statusCode"      => "200",
        "headers"         => [
            "x-custom-header" => "no",
        ],
        "body"            => $content,
    ];

    return json_encode($rep);
}

Java

Function Compute, Java için iki işleyici arayüzü sağlar. Java çalışma zamanı hakkında daha fazla bilgi için bkz. Kod paketi derleme ve dağıtma.

Seçenek 1 (önerilen): PojoRequestHandler

PojoRequestHandler<I, O> ile ham akışlar yerine türü belirtilmiş istek ve yanıt nesneleriyle çalışabilirsiniz.

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;
import java.util.HashMap;
import java.util.Map;

public class ApiTriggerDemo implements PojoRequestHandler<ApiRequest, ApiResponse> {

    public ApiResponse handleRequest(ApiRequest request, Context context) {
        // Obtain API request information.
        context.getLogger().info(request.toString());
        String path = request.getPath();
        String httpMethod = request.getHttpMethod();
        String body = request.getBody();
        context.getLogger().info("path: " + path);
        context.getLogger().info("httpMethod: " + httpMethod);
        context.getLogger().info("body: " + body);

        // You can write your own logic here.

        // Sample API response.
        Map headers = new HashMap();
        boolean isBase64Encoded = false;
        int statusCode = 200;
        String returnBody = "";
        return new ApiResponse(headers, isBase64Encoded, statusCode, returnBody);
    }
}

ApiRequest ve ApiResponse Plain Old Java Object (POJO) sınıflarını aşağıda gösterildiği gibi tanımlayın. set() ve get() yöntemlerinin eksiksiz olması gerekir.

import java.util.Map;

public class ApiRequest {
    private String path;
    private String httpMethod;
    private Map headers;
    private Map queryParameters;
    private Map pathParameters;
    private String body;
    private boolean isBase64Encoded;

    @Override
    public String toString() {
        return "Request{" +
                "path='" + path + '\'' +
                ", httpMethod='" + httpMethod + '\'' +
                ", headers=" + headers +
                ", queryParameters=" + queryParameters +
                ", pathParameters=" + pathParameters +
                ", body='" + body + '\'' +
                ", isBase64Encoded=" + isBase64Encoded +
                '}';
    }

    public String getPath() { return path; }
    public void setPath(String path) { this.path = path; }
    public String getHttpMethod() { return httpMethod; }
    public void setHttpMethod(String httpMethod) { this.httpMethod = httpMethod; }
    public Map getHeaders() { return headers; }
    public void setHeaders(Map headers) { this.headers = headers; }
    public Map getQueryParameters() { return queryParameters; }
    public void setQueryParameters(Map queryParameters) { this.queryParameters = queryParameters; }
    public Map getPathParameters() { return pathParameters; }
    public void setPathParameters(Map pathParameters) { this.pathParameters = pathParameters; }
    public String getBody() { return body; }
    public void setBody(String body) { this.body = body; }
    public boolean getIsBase64Encoded() { return this.isBase64Encoded; }
    public void setIsBase64Encoded(boolean base64Encoded) { this.isBase64Encoded = base64Encoded; }
}
import java.util.Map;

public class ApiResponse {
    private Map headers;
    private boolean isBase64Encoded;
    private int statusCode;
    private String body;

    public ApiResponse(Map headers, boolean isBase64Encoded, int statusCode, String body) {
        this.headers = headers;
        this.isBase64Encoded = isBase64Encoded;
        this.statusCode = statusCode;
        this.body = body;
    }

    public Map getHeaders() { return headers; }
    public void setHeaders(Map headers) { this.headers = headers; }
    public boolean getIsBase64Encoded() { return isBase64Encoded; }
    public void setIsBase64Encoded(boolean base64Encoded) { this.isBase64Encoded = base64Encoded; }
    public int getStatusCode() { return statusCode; }
    public void setStatusCode(int statusCode) { this.statusCode = statusCode; }
    public String getBody() { return body; }
    public void setBody(String body) { this.body = body; }
}

pom.xml dosyanıza aşağıdaki Maven bağımlılığını ekleyin:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>apiTrigger</groupId>
    <artifactId>apiTrigger</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.aliyun.fc.runtime</groupId>
            <artifactId>fc-java-core</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

Seçenek 2: StreamRequestHandler

StreamRequestHandler size ham giriş ve çıkış akışlarına doğrudan erişim imkanı tanır. InputStream öğesini karşılık gelen POJO sınıfına manuel olarak dönüştürün. pom.xml yapılandırması PojoRequestHandler ile aynıdır.

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.google.gson.Gson;
import java.io.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class ApiTriggerDemo2 implements StreamRequestHandler {

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        try {
            // Convert the InputStream to a string.
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String string = "";
            while ((string = bufferedReader.readLine()) != null) {
                stringBuffer.append(string);
            }
            String input = stringBuffer.toString();
            context.getLogger().info("inputStream: " + input);
            Request req = new Gson().fromJson(input, Request.class);
            context.getLogger().info("input req: ");
            context.getLogger().info(req.toString());
            String bodyReq = req.getBody();
            Base64.Decoder decoder = Base64.getDecoder();
            context.getLogger().info("body: " + new String(decoder.decode(bodyReq)));

            // You can process your own logic here.

            // Return structure.
            Map headers = new HashMap();
            headers.put("x-custom-header", " ");
            boolean isBase64Encoded = false;
            int statusCode = 200;
            Map body = new HashMap();
            Response resp = new Response(headers, isBase64Encoded, statusCode, body);
            String respJson = new Gson().toJson(resp);
            context.getLogger().info("outputStream: " + respJson);
            outputStream.write(respJson.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    class Request {
        private String path;
        private String httpMethod;
        private Map headers;
        private Map queryParameters;
        private Map pathParameters;
        private String body;
        private boolean isBase64Encoded;

        @Override
        public String toString() {
            return "Request{" +
                    "path='" + path + '\'' +
                    ", httpMethod='" + httpMethod + '\'' +
                    ", headers=" + headers +
                    ", queryParameters=" + queryParameters +
                    ", pathParameters=" + pathParameters +
                    ", body='" + body + '\'' +
                    ", isBase64Encoded=" + isBase64Encoded +
                    '}';
        }

        public String getBody() {
            return body;
        }
    }

    // Function Compute must return the response to API Gateway in the following JSON format.
    class Response {
        private Map headers;
        private boolean isBase64Encoded;
        private int statusCode;
        private Map body;

        public Response(Map headers, boolean isBase64Encoded, int statusCode, Map body) {
            this.headers = headers;
            this.isBase64Encoded = isBase64Encoded;
            this.statusCode = statusCode;
            this.body = body;
        }
    }
}

Adım 5: İşlevi test etme

API Gateway, istek verilerini yapılandırılmış bir JSON olayı olarak işlevinize iletir. Canlı trafiği bağlamadan önce işlevinizin girişi doğru şekilde işlediğini doğrulamak için bir test olayı kullanın.

  1. İşlev ayrıntıları sayfasının Code sekmesinde, Test function yanındaki image.png simgesine tıklayın ve açılır listeden Configure test parameters seçeneğini belirleyin.

  2. Configure test parameters panelinde Create new test event veya Modify existing test event seçeneğini belirleyin. Olay adını ve içeriğini girin, ardından OK öğesine tıklayın. Aşağıdaki olay formatını kullanın:

    {
        "path": "api request path",
        "httpMethod": "request method name",
        "headers": {all headers, including system headers},
        "queryParameters": {query parameters},
        "pathParameters": {path parameters},
        "body": "string of request payload",
        "isBase64Encoded": "true|false, indicate if the body is Base64-encoded"
    }
  3. Test function öğesine tıklayın ve sonucu Code sekmesinin üzerinde doğrulayın.

Olay ve yanıt formatı referansı

API Gateway olay işlevinizi çağırdığında HTTP istek verilerini bir JSON olayına dönüştürür ve işleve iletir. İşlem tamamlandıktan sonra Function Compute bir JSON yanıtı döndürür. API Gateway, yanıt alanlarını bir HTTP yanıtına eşler ve istemciye gönderir.

principle

İstek olayı alanları

Alan Tür Açıklama
path String API isteğinin yolu
httpMethod String HTTP yöntemi: GET, POST, PUT, DELETE vb.
headers Object Sistem ve özel başlıklar dahil tüm istek başlıkları
queryParameters Object Sorgu dizesindeki anahtar-değer çiftleri (URL'deki ? işaretinden sonra)
pathParameters Object URL içindeki belirli bir kaynağı tanımlayan yol parametreleri
body String İstek gövdesi
isBase64Encoded Boolean İstek gövdesinin Base64 ile kodlanmış olup olmadığı

isBase64Encoded davranışı:

  • true : Gövde Base64 ile kodlanmıştır. İşlemeden önce kodu çözün.

  • false : Gövde kodlanmamıştır. Doğrudan okuyun.

Yanıt formatı

Çalıştırma sonucunu aşağıdaki JSON formatında döndürün. API Gateway bu alanları istemciye gönderilen HTTP yanıtına eşler.

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": {response headers},
    "body": "..."
}

Yanıt bu formatı takip etmezse API Gateway arka ucu kullanılamaz olarak değerlendirir ve 502 hatası döndürür.

Web işlevini API Gateway'e bağlama

Web işlevi ile API Gateway, ham HTTP trafiğini işlevinizin dahili ağ uç noktasına iletir. İşleviniz bir HTTP sunucusu gibi davranır ve istekleri doğrudan işler; JSON olay dönüşümü gerekmez.

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Function Compute ve API Gateway erişimi olan bir Alibaba Cloud hesabı

  • Her iki hizmet için seçilmiş bir bölge (genel ağ trafiği ücretlerinden kaçınmak için hizmetleri aynı bölgede konumlandırın)

Adım 1: Web işlevi oluşturma

Function Compute 3.0 konsolunda bir web işlevi oluşturun. Daha fazla bilgi için bkz. Web işlevi oluşturma.

Web işlevi için varsayılan olarak bir HTTP tetikleyicisi oluşturulur. 2. Adımda kullanmak üzere dahili ağ uç noktasını kopyalayın.

image

Adım 2: Arka uç hizmeti oluşturma

  1. API Gateway konsoluna giriş yapın, bir bölge seçin ve sol gezinme bölmesinde Manage APIs > Backend Services seçeneklerini belirleyin. Sağ üst köşede Create Backend Service öğesine tıklayın. Gerekli bilgileri yapılandırın ve Confirm öğesine tıklayın.

    image

  2. Backend Services sayfasında, az önce oluşturduğunuz arka uç hizmetine tıklayın. Production sekmesine tıklayın. Basic Information bölümünde Create öğesine tıklayın, web işlevinin HTTP tetikleyicisinin dahili ağ uç noktasını girin ve ardından Publish öğesine tıklayın.

    image

Adım 3: API oluşturma ve yayınlama

İlgili API'leri düzenlemek ve birleşik güvenlik ile trafik yönetimi ilkelerini uygulamak için API gruplarını kullanın.

  1. API Gateway konsoluna giriş yapın. Sol gezinme bölmesinde Manage APIs > API groups seçeneklerini belirleyin ve Create group öğesine tıklayın.

  2. Create group iletişim kutusunda bir örnek seçin, Group name için FC-Group değerini girin, BasePath değerini / olarak ayarlayın ve Confirm öğesine tıklayın.

    API grubunu işlevinizle aynı bölgeye yerleştirin. Farklı bölgelerde bulunurlarsa API Gateway, Function Compute'e genel ağ üzerinden erişir ve bu durum trafik ücretlerine neden olur.

    image

  3. Grup listesi sayfasında hedef grubu bulun ve Actions sütunundaki Manage APIs seçeneğine tıklayın. Create API öğesine tıklayın, gerekli ayarları yapılandırın ve Next öğesine tıklayın.

    image

  4. Define API request sekmesinde Request path değerini / olarak ayarlayın ve Next öğesine tıklayın.

  5. Define backend service sekmesinde, şekilde gösterildiği gibi ayarları yapılandırın ve Next öğesine tıklayın.

    image

  6. Define response sekmesinde varsayılan ayarları koruyun ve Create öğesine tıklayın. İstendiğinde Publish öğesine tıklayın.

  7. Publish API iletişim kutusunda yayınlama ayarlarını yapılandırın ve Publish öğesine tıklayın.

    image

Adım 4: Uygulama oluşturma ve yetkilendirme

3. Adımda yayınlanan API Alibaba Cloud APP kimlik doğrulamasını kullanır. Bir uygulama oluşturun ve API'ye erişim izni verin.

  1. API Gateway konsoluna giriş yapın. Sol gezinme bölmesinde Call APIs > Apps seçeneklerini belirleyin.

  2. Apps sayfasında sağ üst köşede Create app öğesine tıklayın. App name için fcApp değerini girin ve Confirm öğesine tıklayın.

  3. fcApp uygulamasına tıklayarak ayrıntılar sayfasını açın. Uygulamanın iki kimlik doğrulama yöntemi vardır: image

    • AppKey: Bir AppKey ve AppSecret çifti kullanır (hesap adı ve şifreye benzer). AppKey'i istek parametresi olarak iletin; AppSecret, istek imzasını hesaplamak için kullanılır.

    • AppCode: API çağrılarında doğrudan kullanım için daha basit bir kimlik doğrulama yöntemi.

  4. Sol gezinme bölmesinde Manage APIs > APIs seçeneklerini belirleyin. Oluşturduğunuz API'yi bulun. Actions sütununda image > Authorize seçeneğine tıklayın.

  5. Yetkilendirme sayfasında Stage değerini Production olarak ayarlayın. fcApp öğesini arayın, Add öğesine tıklayın ve ardından Confirm öğesine tıklayın.

    image

Adım 5: Sonucu doğrulama

Yayınlanan API'yi AppCode kimlik doğrulaması kullanarak çağırın. Aşağıdaki örnekte curl kullanılmaktadır:

  1. API Gateway konsolunda Call APIs > Apps seçeneklerini belirleyin. AppCode'u almak için fcApp uygulamasının ayrıntılar sayfasını açın.

  2. API'yi çağırın:

    curl -i -X GET "http://fd6f8e2b7bf44ab181a56****-cn-hangzhou.alicloudapi.com" \
      -H "Authorization:APPCODE 7d2b7e4945ce44028ab00***"

SSS

API Gateway tarafından tetiklenen bir işlev 502 hatası döndürüyor ancak işlev günlükleri başarıyla tamamlandığını gösteriyor. Neden?

Function Compute'ten gelen yanıt gerekli formatla eşleşmedi. API Gateway, JSON yanıtında isBase64Encoded, statusCode, headers ve body alanlarını bekler. Herhangi bir alan eksik veya hatalı biçimlendirilmişse API Gateway arka ucu kullanılamaz olarak değerlendirir. Olay ve yanıt formatı referansını kontrol edin ve işlevinizin dönüş değerinin beklenen yapıyla eşleştiğini doğrulayın.

Yanıtın Content-Type değerini nasıl ayarlarım?

API Gateway'de API'yi yapılandırırken Content-Type değerini ayarlayın. Ayrıntılar için bkz. API Gateway üzerinden Function Compute 3.0'a (web işlevi) bağlanma.content-type

Bir işlev düzgün çalışıyor ancak bir süre hareketsiz kaldıktan sonra 503 hatası döndürüyor. Neden?

İşlevin yürütme ortamı boşta kalma süresi sırasında geri dönüştürüldü. Bir sonraki istek geldiğinde Function Compute'in yeni bir ortamı başlatması için zamana ihtiyacı olur; buna soğuk başlatma denir. Başlatma süresi API Gateway'de yapılandırılan zaman aşımını aşarsa API Gateway arka ucu kullanılamaz olarak değerlendirir ve 503 hatası döndürür. Bunu çözmek için API Gateway yapılandırmasındaki zaman aşımı süresini uzatın.

İşlev neden API Gateway'den Base64 ile kodlanmış bir gövde alıyor?

API Gateway yalnızca FORM tabanlı iletimler için (API Gateway'de giriş parametresi eşlemesini seçtiğinizde) Base64 kodlamasını atlar. Diğer tüm gövde formatları, iletim sırasında veri kaybını önlemek için Base64 ile kodlanır. Olaydaki isBase64Encoded alanını kontrol edin: değer true ise gövdeyi işlemeden önce kodunu çözün. Olay formatı hakkında daha fazla ayrıntı için bkz. Tetikleyici olayı formatı.