Saat menggunakan Titik Akses Objek FC untuk memanggil operasi GetObject, fungsi terikat dalam Function Compute dipicu. Anda dapat memanggil operasi WriteGetObjectResponse di dalam fungsi untuk mengembalikan hanya data kustom dan header respons.
Prasyarat
Titik Akses Objek FC telah dibuat. Untuk informasi lebih lanjut, lihat Buat Titik Akses Objek FC.
Prosedur
Kompilasi fungsi untuk memproses permintaan GetObject.
Java
Versi OSS SDK untuk Java harus 3.17.2 atau yang lebih baru.
import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.Credentials; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.VoidResult; import com.aliyun.oss.model.WriteGetObjectResponseRequest; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.util.Scanner; public class Example1 implements StreamRequestHandler { // Dalam contoh ini, endpoint wilayah China (Qingdao) digunakan. String endpoint = "https://oss-cn-qingdao.aliyuncs.com"; private static int status = 200; public static String convertToString(InputStream inputStream) { Scanner scanner = new Scanner(inputStream).useDelimiter("\\A"); return scanner.hasNext() ? scanner.next() : ""; } @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { Credentials creds = context.getExecutionCredentials(); // Dapatkan pasangan AccessKey dari konteks. OSS ossClient = new OSSClientBuilder().build(endpoint, creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); try { String result = convertToString(inputStream); JSONObject jsonObject = new JSONObject(result); String route = jsonObject.getJSONObject("getObjectContext").getString("outputRoute"); String token = jsonObject.getJSONObject("getObjectContext").getString("outputToken"); // Panggil BufferedImage untuk membuat objek gambar dengan resolusi 200 × 200 piksel dan gambar persegi panjang merah untuk objek tersebut. // Tulis konten ke body permintaan WriteGetObjectResponse. BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = image.createGraphics(); graphics.setColor(Color.RED); graphics.fillRect(0, 0, 200, 200); graphics.dispose(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "png", baos); WriteGetObjectResponseRequest writeGetObjectResponseRequest = new WriteGetObjectResponseRequest(route, token, status,new ByteArrayInputStream(baos.toByteArray())); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(baos.size()); writeGetObjectResponseRequest.setMetadata(metadata); VoidResult voidResult = ossClient.writeGetObjectResponse(writeGetObjectResponseRequest); System.out.println("getRequestId:"+voidResult.getRequestId()); System.out.println("status:"+voidResult.getResponse().getStatusCode()); System.out.println("Headers:"+voidResult.getResponse().getHeaders().toString()); } catch (OSSException oe) { System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, " + "tetapi ditolak dengan respons kesalahan karena alasan tertentu."); System.out.println("Pesan Kesalahan: " + oe.getMessage()); System.out.println("Kode Kesalahan: " + oe.getErrorCode()); System.out.println("ID Permintaan: " + oe.getRequestId()); System.out.println("ID Host: " + oe.getHostId()); } catch (ClientException ce) { System.out.println("Tangkap ClientException, yang berarti klien mengalami " + "masalah internal serius saat mencoba berkomunikasi dengan OSS, " + "seperti tidak dapat mengakses jaringan."); System.out.println("Pesan Kesalahan: " + ce.getMessage()); } catch (JSONException e) { e.printStackTrace(); } finally { ossClient.shutdown(); } } }Python
Versi OSS SDK untuk Python harus 2.18.3 atau yang lebih baru.
# -*- coding: utf-8 -*- import io from PIL import Image import oss2 import json # Dalam contoh ini, endpoint wilayah China (Qingdao) digunakan. endpoint = 'http://oss-cn-qingdao.aliyuncs.com' fwd_status = '200' # Fungsi entry fc def handler(event, context): evt = json.loads(event) creds = context.credentials # jangan lupa security_token auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token) headers = dict() event_ctx = evt["getObjectContext"] route = event_ctx["outputRoute"] token = event_ctx["outputToken"] print(evt) endpoint = route service = oss2.Service(auth, endpoint) # Panggil Image untuk membuat objek gambar dengan resolusi 200 × 200 piksel dan gambar persegi panjang merah untuk objek tersebut. # Tulis konten ke body permintaan write_get_object_response. image = Image.new('RGB', (200, 200), color=(255, 0, 0)) transformed = io.BytesIO() image.save(transformed, "png") resp = service.write_get_object_response(route, token, fwd_status, transformed.getvalue(), headers) print('status: {0}'.format(resp.status)) print(resp.headers) return 'success'Go
Versi OSS SDK untuk Go harus 1.2.2 atau yang lebih baru.
package main import ( "bytes" "context" "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/fc-runtime-go-sdk/fc" "github.com/aliyun/fc-runtime-go-sdk/fccontext" "image" "image/color" "image/draw" "image/png" ) // Tentukan struktur GetObjectContext, yang berisi rute keluaran (outputRoute), token keluaran (outputToken), dan URL OSS masukan (inputOssUrl). type GetObjectContext struct { OutputRoute string `json:"outputRoute"` OutputToken string `json:"outputToken"` } // Tentukan struktur StructEvent untuk menerima data peristiwa yang memicu fungsi. type StructEvent struct { GetObjectContext GetObjectContext `json:"getObjectContext"` } // Tentukan fungsi HandleRequest untuk memproses logika komputasi. func HandleRequest(ctx context.Context, event StructEvent) error { fmt.Printf("event:%#v\n", event) endpoint := event.GetObjectContext.OutputRoute fwdStatus := "200" fctx, _ := fccontext.FromContext(ctx) // Dapatkan pasangan AccessKey dari konteks. client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken), oss.AuthVersion(oss.AuthV4), oss.Region("cn-qingdao")) if err != nil { return fmt.Errorf("client new error: %v", err) } params := map[string]interface{}{} params["x-oss-write-get-object-response"] = nil // Buat objek gambar dengan resolusi 200 × 200 piksel dan gambar persegi panjang merah untuk objek tersebut. img := image.NewRGBA(image.Rect(0, 0, 200, 200)) red := color.RGBA{255, 0, 0, 255} draw.Draw(img, img.Bounds(), &image.Uniform{red}, image.Point{}, draw.Src) // Simpan gambar dalam format PNG. var buf bytes.Buffer err = png.Encode(&buf, img) if err != nil { return fmt.Errorf("png encode error: %v", err) } reader := bytes.NewReader(buf.Bytes()) // Gunakan klien OSS untuk mengunggah gambar yang dikonversi dengan mengirimkan permintaan POST, dan tentukan header HTTP tertentu, seperti x-oss-request-route, untuk memfasilitasi identifikasi dan pemrosesan permintaan penerusan khusus. headers := make(map[string]string) headers["x-oss-request-route"] = event.GetObjectContext.OutputRoute headers["x-oss-request-token"] = event.GetObjectContext.OutputToken headers["x-oss-fwd-status"] = fwdStatus resp, err := client.Conn.Do("POST", "", "", params, headers, reader, 0, nil) if err != nil { return fmt.Errorf("client conn do error: %v", err) } fmt.Println("status:", resp.StatusCode) fmt.Println(resp.Headers) return nil } // Panggil fc.Start(HandleRequest) untuk mendaftarkan dan menjalankan fungsi HandleRequest dan menunggu serta memproses pemicu peristiwa dari Alibaba Cloud Function Compute. func main() { fc.Start(HandleRequest) }Sebarkan fungsi.
Java
Ekstrak file .jar.
Unggah file .jar ke konsol Function Compute.
Masuk ke konsol Function Compute. Klik Back to Function Compute 2.0 di pojok kanan atas.
Di panel navigasi sebelah kiri, klik Services & Functions.
Di bilah navigasi atas, pilih China (Qingdao).
Di halaman Services, klik layanan yang Anda buat, lalu pilih fungsi dengan runtime Java 11.
Di halaman detail fungsi, pilih .
Di kotak dialog yang muncul, pilih file .jar, centang Deploy the function after the files are selected., lalu klik Save and Deploy.
Modifikasi penanganan fungsi berdasarkan fungsi sampel.
Di halaman detail fungsi, klik tab Configurations.
Di bagian Environment Information, klik Edit.
Modifikasi nilai parameter Handler.
Jika runtime adalah Java, nilai saat ini dalam format
[package].[class]::[method]. Misalnya, jika nilai saat ini adalahexample.HelloFC::handleRequest, fungsi handleRequest dari kelas HelloFC dalam paket example dipanggil. Sesuaikan nilai ini berdasarkan fungsi sampel aktual. Contoh:com.aliyun.sts.sample.Example1::handleRequest.
Python
Di halaman Services, klik layanan yang Anda buat, lalu pilih fungsi dengan runtime Python 3.10.
Di halaman detail fungsi, klik tab Code dan pilih .
Di panel TERMINAL, jalankan perintah berikut untuk memperbarui versi OSS SDK untuk Python:
pip install oss2 -t .Ganti kode sampel di index.py dengan kode fungsi Python sampel untuk memproses permintaan GetObject. Lalu, klik Deploy.
Go
Instal lingkungan runtime OSS SDK untuk Go.
Kompilasi paket kode. Untuk informasi lebih lanjut, lihat Kompilasi dan Pengemasan Kode di Linux atau macOS.
Selama kompilasi, ganti file main.go dengan fungsi sampel untuk memproses permintaan GetObject yang disediakan pada langkah sebelumnya.
Unggah file biner yang dikompilasi sebagai paket ZIP ke fungsi yang dibuat dalam runtime environment Go 1, dan konfigurasikan penanganan untuk fungsi tersebut. Untuk informasi lebih lanjut, lihat Konfigurasi Penanganan Function Compute.