All Products
Search
Document Center

Object Storage Service:Tulis penanganan permintaan GetObject

Last Updated:May 12, 2026

Saat Anda menggunakan Titik Akses Objek FC untuk memanggil operasi GetObject, fungsi yang terikat di Function Compute akan dipicu. Anda dapat memanggil operasi WriteGetObjectResponse dalam fungsi tersebut untuk mengembalikan hanya data kustom dan header respons.

Prosedur

Panduan ini mengasumsikan Titik Akses Objek FC Anda telah dikonfigurasi untuk memanggil fungsi Function Compute guna menangani permintaan GetObject. Function Compute menyediakan operasi API WriteGetObjectResponse, yang memungkinkan fungsi memberikan respons kustom kepada pemanggil GetObject. Operasi ini memberi Anda kendali penuh atas kode status, header respons, dan badan respons.

Anda dapat menggunakan WriteGetObjectResponse untuk mengembalikan objek yang telah ditransformasi sepenuhnya, sebagian darinya, atau respons yang sama sekali berbeda, tergantung pada logika aplikasi Anda.

Contoh berikut menunjukkan cara menggunakan operasi API WriteGetObjectResponse.

Contoh: Merespons dengan gambar yang ditransformasi

  1. Kompilasi fungsi yang digunakan untuk memproses permintaan GetObject.

    Untuk beberapa operasi, seperti transformasi gambar, Anda mungkin perlu mengambil seluruh objek sumber sebelum memprosesnya. Dalam kasus seperti itu, Anda dapat menggunakan WriteGetObjectResponse untuk mengembalikan objek hasil transformasi lengkap ke aplikasi pemanggil dalam satu respons.

    Java

    Versi OSS SDK untuk Java harus 3.17.2 atau 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 {
        // Pada contoh ini, titik akhir Wilayah Tiongkok (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();
            // Peroleh Pasangan Kunci Akses 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 pada objek tersebut. 
                // Tulis konten ke badan 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("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message: " + oe.getMessage());
                System.out.println("Error Code:       " + oe.getErrorCode());
                System.out.println("Request ID:      " + oe.getRequestId());
                System.out.println("Host ID:           " + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message: " + ce.getMessage());
            } catch (JSONException e) {
                e.printStackTrace();
            } finally {
                ossClient.shutdown();
            }
        }
    }
    

    Python

    Versi OSS SDK untuk Python harus 2.18.3 atau lebih baru.

    # -*- coding: utf-8 -*-
    import io
    from PIL import Image
    import oss2
    import json
    
    # Titik akhir Wilayah Tiongkok (Qingdao) digunakan dalam contoh ini.
    endpoint = 'http://oss-cn-qingdao.aliyuncs.com'
    fwd_status = '200'
    
    # Entri fungsi FC
    def handler(event, context):
        evt = json.loads(event)
        creds = context.credentials
        # Pastikan untuk menyertakan token keamanan.
        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)
        # Buat gambar berukuran 200x200 piksel dan isi dengan warna merah.
        # Setelah transformasi, tulis konten ke badan 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 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 event 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)
      // Peroleh Pasangan Kunci Akses 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 pada 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 telah dikonversi dengan mengirim permintaan POST, dan tentukan Header HTTP tertentu, seperti x-oss-request-route, untuk memudahkan 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 serta menunggu dan memproses pemicu event dari Alibaba Cloud Function Compute. 
    func main() {
      fc.Start(HandleRequest)
    }
  2. Deploy fungsi tersebut.

    Java

    1. Ekstrak file .jar.

    2. Unggah file .jar ke Konsol Function Compute.

      1. Masuk ke Konsol Function Compute dan klik Back to Function Compute 2.0 di pojok kanan atas.

      2. Di panel navigasi kiri, klik Services & Functions.

      3. Di bilah navigasi atas, pilih wilayah China (Qingdao).

      4. Pada halaman Services, klik layanan Anda, lalu klik fungsi yang menggunakan runtime Java 11.

      5. Pada halaman detail fungsi, pilih Upload Code > Upload JAR Package.

      6. Pada kotak dialog, pilih file .jar yang telah dikemas, centang Deploy the function after the files are selected., lalu klik Save and Deploy.

    3. Ubah handler fungsi sesuai dengan contoh fungsi.

      1. Pada halaman detail fungsi, klik tab Configurations.

      2. Di bagian Environment Information, klik Modify.

      3. Ubah Handler.

        Jika runtime-nya adalah Java, nilai saat ini berada dalam format [package].[class]::[method]. Jika nilai saat ini adalah example.HelloFC::handleRequest, maka fungsi handleRequest dari kelas HelloFC dalam package example akan dipanggil. Anda perlu mengubah nilai tersebut sesuai dengan contoh fungsi yang sebenarnya, misalnya: com.aliyun.sts.sample.Example1::handleRequest.

    Python

    1. Masuk ke Konsol Function Compute dan klik Back to Function Compute 2.0 di pojok kanan atas.

    2. Di panel navigasi kiri, klik Services & Functions.

    3. Di bilah navigasi atas, pilih wilayah China (Qingdao).

    4. Pada halaman Services, klik layanan Anda, lalu klik fungsi yang menggunakan runtime Python 3.10.

    5. Pada halaman detail fungsi, klik tab Code dan pilih .

    6. Pada panel TERMINAL, jalankan perintah berikut untuk memperbarui versi OSS SDK untuk Python:

      pip install oss2 -t .
    7. Ganti contoh kode di index.py dengan contoh fungsi Python untuk menangani permintaan GetObject, lalu klik Deploy Function.

    Go

    1. Instal lingkungan runtime OSS SDK untuk Go.

    2. Kompilasi paket kode. Untuk informasi selengkapnya, lihat Kompilasi dan kemas kode di Linux atau macOS.

      Saat kompilasi, ganti file kompilasi main.go dengan contoh fungsi untuk memproses permintaan GetObject yang disediakan pada langkah sebelumnya.

    3. Unggah file biner hasil kompilasi sebagai paket ZIP ke fungsi dengan Runtime Go 1, dan konfigurasikan handler fungsi. Untuk informasi selengkapnya, lihat Konfigurasikan handler fungsi FC.

Langkah selanjutnya

Gunakan Titik Akses Objek FC