全部产品
Search
文档中心

Function Compute:Penangan

更新时间:Jul 02, 2025

Anda dapat menggunakan penangan Java untuk menanggapi peristiwa yang diterima dan menjalankan logika bisnis yang sesuai. Topik ini menjelaskan konsep serta fitur penangan Java dan menyediakan contoh.

Catatan

Jika Anda ingin menggunakan pemicu HTTP atau nama domain kustom untuk mengakses fungsi, peroleh struktur permintaan sebelum mendefinisikan respons HTTP. Untuk informasi lebih lanjut, lihat Gunakan pemicu HTTP untuk memanggil fungsi.

Apa itu penangan?

Penangan suatu fungsi di FC digunakan untuk memproses permintaan dalam kode fungsi. Saat suatu fungsi dipanggil, Function Compute menggunakan penangan yang telah dikonfigurasikan untuk memproses permintaan tersebut.

Anda dapat mengonfigurasikan penangan untuk suatu fungsi dengan menentukan parameter Handler di Konsol Function Compute. Penangan fungsi Java mengikuti format [Nama Paket].[Nama Kelas]::[Nama Metode]. Sebagai contoh, jika nama paket Anda adalah example, tipe kelasnya adalah HelloFC, dan metodenya adalah handleRequest, maka penangan dapat dikonfigurasikan sebagai example.HelloFC::handleRequest.

Konfigurasi penangan harus sesuai dengan spesifikasi konfigurasi Function Compute. Spesifikasi konfigurasi bervariasi berdasarkan jenis penangan.

Antarmuka Penangan

Jika Anda menggunakan Java untuk pemrograman, Anda harus mengimplementasikan kelas antarmuka yang disediakan oleh Function Compute. Pustaka fc-java-core mendefinisikan antarmuka berikut untuk penangan:

  • StreamRequestHandler

    Menggunakan aliran untuk menerima data event masukan dan mengembalikan respons. Anda harus membaca data masukan dari aliran masukan dan menulis hasil eksekusi ke aliran keluaran.

  • PojoRequestHandler

    Menggunakan tipe generik untuk menerima event masukan dan mengembalikan respons. Anda dapat menyesuaikan tipe data masukan dan keluaran penangan. Baik data masukan maupun keluaran harus bertipe Plain Old Java Object (POJO).

StreamRequestHandler

Kode sampel berikut menunjukkan implementasi sederhana dari StreamRequestHandler:

package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class HelloFC implements StreamRequestHandler {

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        outputStream.write(new String("hello world").getBytes());
    }
}           
  • Nama Paket dan Nama Kelas

    Java berbeda dari bahasa pemrograman lain dalam metode eksekusi berdasarkan paket. Dalam kode sampel sebelumnya, penangan adalah example.HelloFC::handleRequest. example menunjukkan nama paket, HelloFC menunjukkan nama kelas, dan handleRequest menunjukkan metode kelas.

    Catatan

    Nama paket dan nama kelas dapat disesuaikan. Namun, nilai-nilai tersebut harus konsisten dengan parameter Handler dalam konfigurasi fungsi. Untuk informasi lebih lanjut tentang cara mengonfigurasi Handler, lihat Buat Fungsi Acara.

  • Antarmuka yang Diimplementasikan

    Kode Anda harus mengimplementasikan antarmuka yang telah ditentukan sebelumnya oleh Function Compute. Dalam kode sampel sebelumnya, StreamRequestHandler diimplementasikan. Parameter inputStream adalah data yang dimasukkan ke Function Compute saat Anda memanggil fungsi. Parameter outputStream digunakan untuk mengembalikan hasil eksekusi fungsi.

  • Konteks

    Parameter Konteks berisi informasi waktu proses fungsi, seperti ID permintaan dan pasangan AccessKey sementara. Tipe tersebut adalah com.aliyun.fc.runtime.Context. Untuk informasi lebih lanjut, lihat Konteks.

  • Nilai Pengembalian

    Fungsi yang mengimplementasikan StreamRequestHandler mengembalikan hasil eksekusi menggunakan parameter outputStream.

  • Pustaka Antarmuka

    Dependensi paket com.aliyun.fc.runtime dapat dirujuk dalam file pom.xml dalam kode sampel berikut:

    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>           

    Anda dapat mengunjungi Repositori Maven untuk mendapatkan versi terbaru paket fc-java-core.

Sebelum membuat fungsi, Anda harus mengekstrak kode dan dependensinya fc-java-core ke dalam file JAR. Untuk informasi lebih lanjut tentang cara mengekstrak kode dan dependensi, lihat Kompilasi dan Penyebaran Paket Kode.

PojoRequestHandler

Kode sampel berikut menunjukkan implementasi sederhana PojoRequestHandler. Objek SimpleRequest harus mendukung serialisasi JSON. Sebagai contoh, Anda dapat menggunakan POJO.

// HelloFC.java
package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

public class HelloFC implements PojoRequestHandler<SimpleRequest, SimpleResponse> {

    @Override
    public SimpleResponse handleRequest(SimpleRequest request, Context context) {
        String message = "Halo, " + request.getFirstName() + " " + request.getLastName();
        return new SimpleResponse(message);
    }
}            
// SimpleRequest.java
package example;

public class SimpleRequest {
    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public SimpleRequest() {}
    public SimpleRequest(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}            
// SimpleResponse.java
package example;

public class SimpleResponse {
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SimpleResponse() {}
    public SimpleResponse(String message) {
        this.message = message;
    }
}            

Kode sampel berikut menggambarkan parameter event masukan:

{
  "firstName": "FC",
  "lastName": "aliyun"
}            

Contoh: Gunakan pemicu HTTP untuk memanggil fungsi

Kode sampel

Dalam kode sampel sebelumnya, HTTPTriggerEvent.java mendeklarasikan format permintaan pemicu HTTP, dan HTTPTriggerResponse.java mendeklarasikan format respons pemicu HTTP. Untuk informasi lebih lanjut tentang format permintaan dan respons pemicu HTTP, lihat Gunakan Pemicu HTTP untuk Memanggil Fungsi.

HTTPTriggerEvent.java

package example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
public class HTTPTriggerEvent {
    private String version;
    private String rawPath;
    private Map<String, String> headers;
    private Map<String, String> queryParameters;
    private RequestContext requestContext;

    @JsonProperty("isBase64Encoded")
    private boolean IsBase64Encoded;
    private String body;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder(setterPrefix = "with")
    public static class RequestContext {
        private String accountId;
        private String domainName;
        private String domainPrefix;
        private HttpInfo http;
        private String requestId;
        private String time;
        private String timeEpoch;

        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        @Builder(setterPrefix = "with")
        public static class HttpInfo {
            private String method;
            private String path;
            private String protocol;
            private String sourceIp;
            private String userAgent;
        }
    }

}

HTTPTriggerResponse.java

package example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
public class HTTPTriggerResponse {
    private int statusCode;
    private Map<String, String> headers;

    @JsonProperty("isBase64Encoded")
    private boolean IsBase64Encoded;
    private String body;
}

App.java mendefinisikan kelas entri fungsi.

App.java

package example;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

/**
 * Demo pemicu HTTP
 *
 */
public class App implements PojoRequestHandler<HTTPTriggerEvent, HTTPTriggerResponse> {

    @Override
    public HTTPTriggerResponse handleRequest(HTTPTriggerEvent request, Context context) {
        context.getLogger().info("Menerima permintaan pemicu HTTP: " + request.toString());
        String requestBody = request.getBody();
        if (request.isIsBase64Encoded()) {
            requestBody = new String(java.util.Base64.getDecoder().decode(request.getBody()), StandardCharsets.UTF_8);
        }
        String message = "Badan permintaan pemicu HTTP: " + requestBody;
        context.getLogger().info(message);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "text/plain");
        return HTTPTriggerResponse.builder().withStatusCode(200).withHeaders(headers).withBody(request.getBody())
                .withIsBase64Encoded(request.isIsBase64Encoded()).build();
    }
}

Dalam contoh ini, selain pustaka fc-java-core, pustaka jackson dan lombok juga harus diperkenalkan. Anda dapat menambahkan dependensi ini dalam file pengaturan Maven pom.xml.

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.16.1</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.30</version>
</dependency>

Sebelum Anda mulai

Gunakan kode sampel sebelumnya untuk membuat fungsi dalam runtime Java dan buat pemicu HTTP. Untuk informasi lebih lanjut, lihat Buat Fungsi Acara dan Konfigurasikan Pemicu HTTP.

Prosedur

  1. Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.

  2. Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang ingin Anda kelola.

  3. Di halaman detail fungsi, klik tab Pemicu untuk mendapatkan titik akhir publik pemicu HTTP.

  4. Jalankan perintah berikut dalam curl untuk memanggil fungsi:

    curl -i "https://dev-jav-test-fc-luiqas****.cn-shanghai.fcapp.run" -d 'halo fc3.0'

    Dalam perintah sebelumnya, https://dev-jav-test-fc-luiqas****.cn-shanghai.fcapp.run adalah titik akhir publik pemicu HTTP.

    Hasil berikut dikembalikan:

    HTTP/1.1 200 OK
    Content-Disposition: attachment
    Content-Length: 11
    Content-Type: application/json
    X-Fc-Request-Id: 1-652503f2-afbfd2b1dc4dd0fcb0230959
    Date: Tue, 10 Oct 2023 07:57:38 GMT
    
    halo fc3.0% 
    Penting
    • Jika parameter Authentication Method pemicu HTTP diatur ke No Authentication, Anda dapat menggunakan Postman atau curl untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Prosedur.

    • Jika parameter Authentication Method pemicu HTTP diatur ke Signature Authentication atau JWT Authentication, gunakan metode tanda tangan atau metode otentikasi JWT untuk memanggil fungsi. Untuk informasi lebih lanjut, lihat Otentikasi.

Kesalahan yang mungkin terjadi

Kode sampel ini dapat dipanggil menggunakan pemicu HTTP atau nama domain kustom. Jika Anda menggunakan operasi API tetapi parameter uji yang dikonfigurasi tidak sesuai dengan persyaratan format permintaan pemicu HTTP, kesalahan akan dilaporkan.

Sebagai contoh, respons berikut dikembalikan jika Anda memanggil fungsi dengan mengklik Test Function di Konsol Function Compute setelah mengonfigurasi parameter permintaan sebagai "Halo, FC!".

{
    "errorType": "com.fasterxml.jackson.databind.exc.MismatchedInputException",
    "errorMessage": "Tidak dapat membuat instance `example.HTTPTriggerEvent` (meskipun setidaknya satu Creator ada): tidak ada konstruktor/metode pabrik argumen-String untuk mendeserialisasi dari nilai String ('Halo, FC!')\n pada [Sumber: (byte[])\"\"Halo, FC!\"\"; baris: 1, kolom: 1]",
    "stackTrace": [
        "com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)",
        "com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1588)",
        "com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1213)",
        "com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311)",
        "com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495)",
        "com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:207)",
        "com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:197)",
        "com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)",
        "com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)",
        "com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3643)"
    ]
}

Program sampel

Function Compute pustaka resmi berisi program sampel yang menggunakan berbagai jenis penangan dan antarmuka. Setiap program sampel mencakup metode kompilasi dan penyebaran yang mudah. Berikut adalah beberapa contohnya: