All Products
Search
Document Center

Object Storage Service:callback

Last Updated:Jun 27, 2026

Callback unggahan OSS secara otomatis memberi tahu server aplikasi Anda setelah objek berhasil diunggah, sehingga memungkinkan pemrosesan lebih lanjut.

Batasan

  • Ketersediaan wilayah

    Fitur callback didukung di wilayah berikut: Tiongkok (Hangzhou), Tiongkok (Shanghai), Tiongkok (Qingdao), Tiongkok (Beijing), Tiongkok (Zhangjiakou), Tiongkok (Hohhot), Tiongkok (Ulanqab), Tiongkok (Shenzhen), Tiongkok (Heyuan), Tiongkok (Guangzhou), Tiongkok (Chengdu), Tiongkok (Hong Kong), AS (Silicon Valley), AS (Virginia), Jepang (Tokyo), Singapura, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Filipina (Manila), Jerman (Frankfurt), Inggris (London), dan UEA (Dubai).

  • Perilaku callback

    • Permintaan callback harus menerima respons dalam waktu 5 detik. Jika tidak, callback gagal.

    • Callback yang gagal tidak memengaruhi keberhasilan unggahan objek.

    • OSS tidak melakukan retry otomatis untuk callback yang gagal.

  • Operasi yang didukung

    Anda dapat mengonfigurasi callback untuk operasi PutObject, PostObject, dan CompleteMultipartUpload. File upload manager dan URL yang ditandatangani (presigned URLs) pada SDK V2, yang dibangun di atas operasi dasar ini, juga mendukung callback.

Cara kerja

Proses callback OSS mencakup langkah-langkah berikut:

  1. Klien mengunggah objek dengan parameter callback

    Saat mengunggah objek, klien harus menyertakan parameter callback untuk menentukan URL server aplikasi dan konten permintaan callback. Untuk meneruskan variabel kustom, Anda juga dapat menyertakan parameter opsional callback-var.

  2. OSS menyimpan objek dan mengirim permintaan callback

    Setelah objek berhasil diunggah, OSS mengirim permintaan POST ke URL callback yang ditentukan. Permintaan tersebut mencakup informasi objek, seperti bucket, objek, ukuran, dan etag, serta parameter kustom apa pun.

  3. Server aplikasi memproses callback dan mengirim respons

    Setelah menerima permintaan callback, server aplikasi memprosesnya, secara opsional memverifikasi signature permintaan demi keamanan, dan mengembalikan respons JSON dalam waktu 5 detik. Kode status HTTP 200 menunjukkan keberhasilan. Kode status lainnya menunjukkan kegagalan.

  4. OSS mengembalikan hasil unggahan

    Setelah menerima respons sukses dari server aplikasi, OSS meneruskan respons tersebut ke klien sebagai hasil akhir unggahan.

Implementasi

Debugging callback unggahan melibatkan dua bagian: unggahan sisi klien dan pemrosesan callback sisi server. Debug implementasi sisi klien terlebih dahulu, lalu server aplikasi. Setelah kedua bagian berfungsi secara independen, lakukan pengujian end-to-end lengkap.

Implementasi sisi klien

Untuk implementasi yang lebih cepat, lihat kode contoh yang tersedia di SDK.

Untuk memicu callback otomatis OSS setelah objek diunggah, sertakan parameter callback dan parameter opsional callback-var dalam permintaan unggahan Anda.

  1. Buat parameter callback.

    Parameter ini menentukan URL server aplikasi dan format badan permintaan. Parameter ini harus disusun sebagai objek JSON lalu diencode Base64.

    1. Contoh konfigurasi minimal:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}"
      }

      Dalam contoh ini:

      • callbackUrl: Alamat server aplikasi. Anda harus mengatur parameter ini ke alamat aktual. Topik ini menggunakan http://oss-demo.aliyuncs.com:23450 sebagai contoh.

      • callbackBody: Konten badan permintaan callback. Anda dapat menggunakan placeholder untuk menyertakan informasi unggahan secara dinamis, seperti ${bucket} untuk nama bucket, ${object} untuk jalur file lengkap, dan ${x:xxx} untuk mereferensikan variabel kustom. OSS mengganti placeholder ini dengan nilai aktual selama callback. Untuk informasi lebih lanjut tentang parameter sistem yang didukung, lihat Parameter sistem yang didukung oleh callbackBody.

    2. Contoh konfigurasi lanjutan:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}",
      "callbackBodyType":"application/x-www-form-urlencoded",
      "callbackSNI":false
      }

      Untuk informasi lebih lanjut tentang bidang-bidang tersebut, lihat Parameter callback.

  2. Buat parameter callback-var (Opsional)

    Penting

    Parameter callback-var harus dalam format JSON. Kunci untuk setiap parameter kustom harus diawali dengan x: dan hanya boleh berisi huruf kecil, misalnya x:uid.

    Gunakan parameter ini untuk meneruskan informasi bisnis kustom, seperti ID pengguna atau nomor pesanan, ke server aplikasi Anda. Contoh:

    {
      "x:uid": "12345",
      "x:order_id": "67890"
    }

    Parameter callback-var harus digunakan bersama parameter callbackBody. Untuk variabel kustom dalam contoh sebelumnya (uid dan order_id), referensikan dalam callbackBody menggunakan placeholder ${x:xxx}. Contoh:

    {
      "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
      "callbackBody": "uid=${x:uid}&order=${x:order_id}"
    }

    Saat callback dipicu, OSS mengirim konten berikut, dengan asumsi callbackBodyType diatur ke application/x-www-form-urlencoded:

    uid=12345&order=67890
  3. Encode Base64 parameter callback dan callback-var.

    • Contoh: callback parameter encoding

      Parameter callback asli:

      {
          "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
          "callbackHost": "your.callback.com",
          "callbackBody": "bucket=${bucket}&object=${object}&uid=${x:uid}&order=${x:order_id}",
          "callbackBodyType": "application/x-www-form-urlencoded",
          "callbackSNI": false
      }

      Hasil setelah encoding Base64:

      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • Contoh: callback-var pengkodean parameter

      Parameter callback-var asli:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      Hasil setelah encoding Base64:

      eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
  4. Tambahkan parameter yang telah diencode ke permintaan.

    Setelah mengencode parameter, Anda dapat meneruskannya ke OSS dengan salah satu cara berikut.

    Header (Direkomendasikan)

    Metode ini cocok untuk unggahan dari SDK atau kode backend. Metode ini menyediakan keamanan tinggi dan merupakan metode yang direkomendasikan. Anda dapat meneruskan parameter callback dengan mengatur field header HTTP x-oss-callback dan x-oss-callback-var.

    • x-oss-callback: Parameter callback yang telah diencode Base64.

    • x-oss-callback-var (Opsional): Parameter callback-var yang telah diencode Base64.

    Catatan: Saat menghitung signature permintaan, kedua parameter ini harus disertakan dalam canonical headers untuk memastikan permintaan valid.

    Contoh: Meneruskan parameter callback dalam header

    PUT /your_object HTTP/1.1
    Host: callback-test.oss-test.aliyun-inc.com
    Accept-Encoding: identity
    Content-Length: 5
    x-oss-callback-var: eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
    User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4)
    x-oss-callback: eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    Host: callback-test.oss-test.aliyun-inc.com
    Expect: 100-Continue
    Date: Wed, 26 Apr 2023 03:46:17 GMT
    Content-Type: text/plain
    Authorization: OSS qn6q**************:77Dv****************
    Test

    Badan permintaan POST

    Metode ini hanya berlaku untuk unggahan PostObject. Parameter callback harus diteruskan sebagai field form dalam badan permintaan POST.

    • callback parameter: Teruskan parameter ini sebagai field form terpisah. Nilainya adalah konfigurasi JSON yang telah diencode Base64.

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • callback-var parameter (variabel kustom): Setiap variabel kustom harus diteruskan sebagai field form terpisah. Anda tidak dapat mengemasnya ke dalam satu field callback-var.

      Misalnya, pertimbangkan variabel kustom uid dan order_id:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      Anda harus mengubahnya menjadi dua field form terpisah.

      --9431149156168
      Content-Disposition: form-data; name="x:uid"
      12345
      --9431149156168
      Content-Disposition: form-data; name="x:order_id"
      67890
    • Verifikasi parameter callback (Opsional): Anda dapat menentukan kondisi validasi untuk parameter callback dalam policy. Jika kondisi ini dihilangkan, parameter tidak divalidasi selama unggahan. Contoh:

      { "expiration": "2021-12-01T12:00:00.000Z",
        "conditions": [
          {"bucket": "examplebucket" },
          {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"},
          ["starts-with", "$key", "user/eric/"]
        ]
      }

    URL

    • Metode ini biasanya digunakan untuk mengunggah objek dengan URL yang ditandatangani (presigned URL). Parameter callback yang telah diencode Base64 ditambahkan ke URL untuk mengaktifkan callback otomatis. Namun, metode ini mengekspos informasi callback di URL dan menimbulkan risiko keamanan. Gunakan hanya untuk akses sementara atau dalam skenario dengan sensitivitas rendah.

    • Jika Anda memilih untuk meneruskan parameter callback dalam URL, Anda harus menyertakan parameter callback. Parameter callback-var bersifat opsional. Saat signature dihitung, parameter-parameter ini harus disertakan sebagai bagian dari Canonical Query String. Untuk informasi lebih lanjut, lihat Signature Version 4.

      Contoh:

      PUT /your_object?OSSAccessKeyId=LTAI******************&Signature=vjby*************************************&Expires=1682484377&callback-var=eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=&callback=eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 HTTP/1.1
      Host: callback-test.oss-cn-hangzhou.aliyuncs.com
      Date: Wed, 26 Apr 2023 03:46:17 GMT
      Content-Length: 5
      Content-Type: text/plain

Implementasi sisi server

Bagian berikut menjelaskan alur pemrosesan sisi server. Untuk kode contoh dalam berbagai bahasa pemrograman, lihat Kode contoh sisi server.

Server aplikasi Anda harus mampu melakukan tindakan berikut:

  1. Menerima permintaan POST dari OSS

    Setelah unggahan objek berhasil, OSS secara otomatis mengirim permintaan POST ke server aplikasi Anda. Kode contoh berikut menunjukkan contoh permintaan:

    POST /test HTTP/1.1
    Host: your.callback.com
    Connection: close
    Authorization: GevnM3**********3j7AKluzWnubHSVWI4dY3VsIfUHYWnyw==
    Content-MD5: iKU/O/JB***ZMd8Ftg==
    Content-Type: application/x-www-form-urlencoded
    Date: Tue, 07 May 2024 03:06:13 GMT
    User-Agent: aliyun-oss-callback
    x-oss-bucket: your_bucket
    x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVi**********vY2FsbGJeV92MS5wZW0=
    x-oss-request-id: 66399AA50*****3334673EC2
    x-oss-requester: 23313******948342006
    x-oss-signature-version: 1.0
    x-oss-tag: CALLBACK
    bucket=your_bucket&object=your_object&uid=12345&order_id=67890
  2. Verifikasi signature permintaan demi keamanan (Opsional)

    Untuk memastikan bahwa permintaan callback berasal dari OSS, verifikasi signature permintaan di server aplikasi Anda. Untuk petunjuk detail, lihat Konfigurasi yang direkomendasikan.

    Catatan

    Verifikasi signature bersifat opsional dan dapat diaktifkan sesuai kebutuhan keamanan Anda.

  3. Kirim respons callback

    Setelah server aplikasi menerima permintaan callback, server tersebut harus mengirim respons ke OSS. Respons tersebut harus memenuhi persyaratan berikut:

    • Server aplikasi harus mengembalikan HTTP/1.1 200 OK untuk menunjukkan keberhasilan.

    • Header respons harus menyertakan Content-Length.

    • Badan respons mendukung format JSON atau XML. Topik ini menggunakan JSON sebagai contoh. Jika Anda ingin menggunakan format XML, tambahkan Content-Type: application/xml ke header respons.

    Sebagai contoh, server aplikasi mengembalikan {"Status": "OK"}.

    Catatan: Versi Python dalam contoh ini adalah 2.7.6. Kami merekomendasikan penggunaan Python 3 untuk pengembangan.

    HTTP/1.0 200 OK
    Server: BaseHTTP/0.3 Python/2.7.6
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    {"Status": "OK"}

    OSS kemudian meneruskan respons ini ke klien. Contoh:

    HTTP/1.1 200 OK
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    Connection: keep-alive
    ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249"
    Server: AliyunOSS
    x-oss-bucket-version: 1442231779
    x-oss-request-id: 55F6BF87207FB30F2640C548
    {"Status": "OK"}
    Penting

    Untuk permintaan CompleteMultipartUpload, jika badan respons asli berisi konten (seperti informasi dalam format JSON), konten ini akan ditimpa oleh respons dari callback saat callback unggahan diaktifkan. Misalnya, dalam kasus ini, konten ditimpa oleh {"Status": "OK"}.

Konfigurasi yang direkomendasikan

Memverifikasi tanda tangan permintaan

Setelah Anda mengonfigurasi parameter callback, OSS mengirim permintaan callback POST ke server aplikasi berdasarkan callbackUrl yang ditentukan. Untuk memastikan bahwa permintaan berasal dari OSS, Anda dapat memverifikasi signature permintaan callback. Langkah-langkah berikut menjelaskan proses verifikasi.

  1. Cara OSS menghasilkan signature

    OSS menggunakan algoritma enkripsi asimetris RSA dengan hash MD5 untuk menghasilkan signature untuk konten permintaan. Signature tersebut kemudian disertakan dalam field authorization header permintaan.

    • Signature dihitung menggunakan rumus berikut:

      authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))
      Catatan

      Dalam rumus ini, private_key adalah kunci privat, path adalah jalur resource permintaan callback, query_string adalah string kueri, dan body adalah badan pesan callback.

    • Langkah-langkah untuk menghasilkan signature:

      1. Buat string-to-sign: Decode URL jalur resource lalu tambahkan string kueri asli, karakter baris baru (\n), dan badan pesan callback.

      2. Hasilkan signature RSA: Gunakan kunci privat untuk menandatangani string-to-sign. Fungsi hash untuk penandatanganan adalah MD5.

      3. Encode Base64 hasilnya untuk mendapatkan signature akhir, lalu sertakan dalam header authorization permintaan callback.

    • Contoh pembuatan signature:

      POST /index.php?id=1&index=2 HTTP/1.0
      Host: 172.16.XX.XX
      Connection: close
      Content-Length: 18
      authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZj****/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****
      Content-Type: application/x-www-form-urlencoded
      User-Agent: http-client/0.0.1
      x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnsr****
      bucket=examplebucket

      Jalurnya adalah /index.php, query_string-nya adalah ?id=1&index=2, badannya adalah bucket=examplebucket, dan signature yang dihasilkan adalah kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****.

  2. Server callback memverifikasi tanda tangan

    Server aplikasi Anda harus memverifikasi signature permintaan dari OSS untuk mengonfirmasi keasliannya. Proses verifikasi adalah sebagai berikut:

    1. Dapatkan kunci publik:

      Ambil URL kunci publik yang diencode Base64 dari field x-oss-pub-key-url dalam header permintaan lalu decode.

      public_key = urlopen(base64_decode(value of the x-oss-pub-key-url header))

      Contoh nilai sebelum decoding:

      aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==

      Setelah decoding:

      http://gosspublic.alicdn.com/callback_pub_key_v1.pem
      Catatan

      URL kunci publik harus diawali dengan http://gosspublic.alicdn.com/ atau https://gosspublic.alicdn.com/. Karena konten di URL kunci publik tidak berubah, kami merekomendasikan agar Anda menyimpan cache kunci publik untuk menghindari gangguan layanan akibat fluktuasi jaringan.

    2. Decode signature.

      Ambil signature dari field authorization dalam header permintaan lalu decode Base64.

      signature = base64_decode(value of the authorization header)
    3. Buat string untuk verifikasi.

      Gabungkan jalur resource, string kueri, karakter baris baru (\n), dan badan pesan callback dalam format berikut:

      sign_str = url_decode(path) + query_string + ‘\n’ + body
    4. Lakukan verifikasi tanda tangan.

      Gunakan hash MD5 dan kunci publik RSA untuk melakukan verifikasi.

      result = rsa_verify(public_key, md5(sign_str), signature)
  3. Contoh Verifikasi Tanda Tangan

    Kode Python 3 berikut memberikan contoh cara memverifikasi signature di server aplikasi. Contoh ini memerlukan library M2Crypto.

    import http.client
    import base64
    import hashlib
    import urllib.request
    import urllib.parse
    import socket
    from http.server import BaseHTTPRequestHandler, HTTPServer
    from M2Crypto import RSA
    from M2Crypto import BIO
    def get_local_ip():
        try:
            csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            csock.connect(('8.8.8.8', 80))
            (addr, port) = csock.getsockname()
            csock.close()
            return addr
        except socket.error:
            return ""
    class MyHTTPRequestHandler(BaseHTTPRequestHandler):
        '''
        def log_message(self, format, *args):
            return
        '''
        def do_POST(self):
            # Dapatkan kunci publik.
            pub_key_url = ''
            try:
                pub_key_url_base64 = self.headers['x-oss-pub-key-url']
                pub_key_url = base64.b64decode(pub_key_url_base64).decode()
                if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"):
                    self.send_response(400)
                    self.end_headers()
                    return
                url_reader = urllib.request.urlopen(pub_key_url)
                # Anda dapat menyimpan cache kunci publik. Kami merekomendasikan caching konten kunci publik berdasarkan URL kunci publik untuk meningkatkan kinerja.
                pub_key = url_reader.read() 
            except Exception as e:
                print('pub_key_url : ' + pub_key_url)
                print('Get pub key failed! Error:', str(e))
                self.send_response(400)
                self.end_headers()
                return
            # Dapatkan signature.
            authorization_base64 = self.headers['authorization']
            authorization = base64.b64decode(authorization_base64)
            # Dapatkan badan callback.
            content_length = self.headers['content-length']
            callback_body = self.rfile.read(int(content_length))
            # Buat string untuk verifikasi signature.
            auth_str = ''
            pos = self.path.find('?')
            if -1 == pos:
                auth_str = urllib.parse.unquote(self.path) + '\n' + callback_body.decode()
            else:
                auth_str = urllib.parse.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body.decode()
            print(auth_str)
            # Verifikasi signature.
            auth_md5 = hashlib.md5(auth_str.encode()).digest()
            bio = BIO.MemoryBuffer(pub_key)
            rsa_pub = RSA.load_pub_key_bio(bio)
            try:
                result = rsa_pub.verify(auth_md5, authorization, 'md5')
            except:
                result = False
            if not result:
                print('Authorization verify failed!')
                print('Public key : %s' % (pub_key))
                print('Auth string : %s' % (auth_str))
                self.send_response(400)
                self.end_headers()
                return
            # Lakukan operasi selanjutnya berdasarkan callback_body.
            # Kirim respons ke OSS.
            resp_body = '{"Status":"OK"}'
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Content-Length', str(len(resp_body)))
            self.end_headers()
            self.wfile.write(resp_body.encode())
    class MyHTTPServer(HTTPServer):
        def __init__(self, host, port):
            super().__init__((host, port), MyHTTPRequestHandler)
    if __name__ == '__main__':
        server_ip = get_local_ip()
        server_port = 23451
        server = MyHTTPServer(server_ip, server_port)
        server.serve_forever()

    Tabel berikut menyediakan kode contoh sisi server untuk bahasa lain.

    Bahasa

    Deskripsi

    Java

    • URL Unduh: Java

    • Metode eksekusi: Ekstrak paket dan jalankan java -jar oss-callback-server-demo.jar 9000 (9000 adalah nomor port, yang dapat Anda ubah).

    Python

    • URL Unduh: Python

    • Ekstrak paket dan jalankan python callback_app_server.py. Program ini memerlukan dependensi RSA.

    PHP

    • URL Unduh: PHP

    • Untuk menjalankan: Deploy skrip di lingkungan Apache. Anda mungkin perlu memodifikasi contoh, karena pengambilan header di PHP bisa bergantung pada lingkungan.

    .NET

    • URL Unduh: .NET

    • Untuk menjalankan aplikasi, ekstrak paket dan lihat file README.md.

    Node.js

    • URL Unduh: Node.js

    • Untuk menjalankan contoh, ekstrak paket dan jalankan node example.js.

    Ruby

    • URL Unduh: Ruby

    • Untuk menjalankan: ruby aliyun_oss_callback_server.rb

Parameter callback

Tabel berikut menjelaskan field-field parameter callback, yang digunakan untuk mengonfigurasi konten dan perilaku permintaan callback yang dikirim setelah objek berhasil diunggah ke OSS.

Parameter

Wajib

Deskripsi

callbackUrl

Ya

URL tempat OSS mengirim permintaan callback POST setelah objek diunggah.

  • Anda dapat menentukan hingga lima URL, dipisahkan dengan titik koma (;). OSS mengirim permintaan ke URL tersebut secara berurutan hingga menerima respons callback sukses pertama.

  • URL HTTPS didukung.

  • Anda tidak dapat menentukan alamat IPv6 atau nama domain yang diselesaikan ke alamat IPv6.

  • Untuk memastikan karakter seperti bahasa Tionghoa diproses dengan benar, callbackUrl harus diencode URL. Misalnya, https://example.com/中文.php?key=value&中文名称=中文值 perlu diencode menjadi https://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BC.

callbackBody

Ya

Konten badan permintaan callback. Formatnya harus konsisten dengan parameter callbackBodyType.

  • Saat callbackType bernilai default application/x-www-form-urlencoded, callbackBody harus dalam format pasangan kunci-nilai. Contoh: bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • Saat callbackType adalah application/json, callbackBody harus dalam format JSON. Contoh: {\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

callbackBody dapat mereferensikan parameter sistem OSS, variabel kustom, dan konstanta. Untuk informasi lebih lanjut tentang parameter sistem, lihat Parameter sistem yang didukung oleh callbackBody.

callbackHost

Tidak

Nilai header Host dalam permintaan callback. Nilainya dapat berupa nama domain atau alamat IP.

  • Jika Anda tidak mengonfigurasi callbackHost, OSS mengurai callbackUrl dan menggunakan host yang diekstraksi sebagai nilai untuk callbackHost.

callbackSNI

Tidak

Menentukan apakah akan menyertakan Indikasi Nama Server (Server Name Indication/SNI) dalam permintaan callback. Dalam permintaan HTTPS, SNI memungkinkan server menyajikan sertifikat yang benar untuk hostname yang diminta.

Jika callbackUrl menggunakan HTTPS, kami merekomendasikan agar Anda mengaktifkan parameter ini. Jika tidak, callback mungkin gagal karena ketidakcocokan sertifikat, mengakibatkan kesalahan seperti 502 callback failed. Nilai yang valid:

  • true: Mengirim SNI.

  • false (default): Tidak mengirim SNI.

    Catatan

    Di wilayah Inggris (London), SNI selalu dikirim, terlepas dari pengaturan parameter ini.

callbackBodyType

Tidak

Content-Type permintaan callback, yaitu format data callbackBody.

Jenis berikut didukung:

  • application/x-www-form-urlencoded (default)

    Mengganti variabel dalam callbackBody dengan nilai yang diencode URL.

  • application/json

    Mengganti variabel dalam callbackBody sesuai aturan format JSON.

Parameter sistem yang didukung oleh callbackBody

Field callbackBody dari parameter callback dapat mereferensikan beberapa parameter sistem untuk meneruskan informasi tentang objek yang diunggah dalam permintaan callback. Tabel berikut menjelaskan parameter sistem yang didukung.

Parameter

Deskripsi

bucket

Nama bucket.

object

Jalur lengkap objek.

etag

Etag objek, yang sama dengan nilai etag yang dikembalikan ke klien.

size

Ukuran objek. Jika operasi CompleteMultipartUpload dipanggil, size merepresentasikan ukuran seluruh objek.

mimeType

Jenis resource. Misalnya, jenis resource gambar JPEG adalah image/jpeg.

imageInfo.height

Tinggi gambar. Variabel ini hanya tersedia untuk file gambar.

imageInfo.width

Lebar gambar. Variabel ini hanya tersedia untuk file gambar.

imageInfo.format

Format gambar, seperti JPG atau PNG. Variabel ini hanya tersedia untuk file gambar.

crc64

Nilainya sama dengan nilai header x-oss-hash-crc64ecma yang dikembalikan setelah objek diunggah.

contentMd5

Nilainya sama dengan nilai header Content-MD5 yang dikembalikan setelah objek diunggah.

Penting

Variabel ini hanya tersedia untuk objek yang diunggah menggunakan operasi PutObject atau PostObject.

vpcId

ID VPC klien yang mengirim permintaan. Variabel ini kosong jika permintaan tidak berasal dari VPC.

clientIp

Alamat IP klien yang mengirim permintaan.

reqId

ID permintaan.

operation

Nama operasi yang diminta, seperti PutObject atau PostObject.

SDK

Tabel berikut menyediakan tautan ke demo implementasi sisi klien.

Unggahan sederhana

(menggunakan operasi PutObject)

Unggahan multipart

(menggunakan operasi CompleteMultipartUpload)

Unggah menggunakan URL yang ditandatangani

(menggunakan operasi PutObject)

Java

demo

demo

demo

Python V2

demo

-

demo

Go V2

demo

demo

demo

Pemecahan Masalah

Jika terjadi kesalahan selama proses callback, Anda dapat menggunakan kode kesalahan yang dikembalikan oleh OSS untuk memecahkan masalah tersebut. Setiap kode kesalahan berkaitan dengan penyebab tertentu. Untuk kode kesalahan terkait callback, lihat 07-CALLBACK.

FAQ

Callback saat unggahan gagal

Tidak. OSS hanya memicu callback setelah objek berhasil diunggah. Jika unggahan gagal, tidak ada callback yang dikirim, dan pesan kesalahan dikembalikan langsung ke klien.

Kesalahan "Response body is not valid json format"

  • Pengecualian selama pemrosesan di server aplikasi menyebabkan server mengirim badan respons yang tidak dalam format JSON yang valid, seperti yang ditunjukkan dalam kode berikut:

    # Kirim respons ke OSS.
    resp_body = '{"Status":"OK"}'
    self.send_response(200)
    self.send_header('Content-Type', 'application/json')
    self.send_header('Content-Length', str(len(resp_body)))
    self.end_headers()
    self.wfile.write(resp_body)

    Solusi:

    • Jalankan perintah berikut untuk memverifikasi konten.

      curl -d "<Content>" <CallbackServerURL> -v
    • Ambil paket untuk memeriksa konten.

      Di Windows, kami merekomendasikan penggunaan Wireshark untuk mengambil paket. Di Linux, gunakan perintah tcpdump untuk mengambil paket.

  • Badan respons yang dikembalikan server aplikasi ke OSS berisi header BOM.

    Kesalahan ini umum terjadi di server aplikasi berbasis PHP. SDK PHP mengembalikan header BOM, yang menambahkan tiga byte ekstra di awal badan respons yang diterima OSS. Hal ini membuat badan respons tidak valid sebagai objek JSON. Dalam pengambilan paket berikut, byte ef bb bf merepresentasikan header BOM.

    Frame 6: 448 bytes on wire (3584 bits), 448 bytes captured (3584 bits)
    Ethernet II, Src: Inventec_5e:4f:5c (00:8c:fa:5e:4f:5c), Dst: Inventec_5e:4b:64 (00:8c:fa:5e:4b:64)
    Internet Protocol Version 4, Src: 10.101.166.30, Dst: 10.101.166.53
    Transmission Control Protocol, Src Port: 8083 (8083), Dst Port: 49607 (49607), Seq: 1, Ack: 518, Len: 382
    Hypertext Transfer Protocol
    Line-based text data: text/html
      \357\273\277{"Status":"Ok"}
    0090  64 20 48 61 74 29 0d 0a  53 65 74 2d 43 6f 6b   d Hat).. Set-Cook
    00a0  69 65 3a 20 50 48 50 53  45 53 53 49 44 3d 66 61   ie: PHPS ESSID=fa
    00b0  74 37 33 6e 74 6c 70 68  30 6e 63 67 38 68 33 30   t73ntlph 0ncg8h30
    00c0  65 6e 75 35 31 34 67 31  3b 20 48 74 74 70 4f 6e   enu514g1 ; HttpOn
    00d0  6c 79 0d 0a 45 78 70 69  72 65 73 3a 20 54 68 75   ly..Expi res: Thu
    00e0  2c 20 31 39 20 4e 6f 76  20 31 39 38 31 20 30 38   , 19 Nov  1981 08
    00f0  3a 35 32 3a 30 30 20 47  4d 54 0d 0a 43 61 63 68   :52:00 G MT..Cach
    0100  65 2d 43 6f 6e 74 72 6f  6c 3a 20 6e 6f 2d 73 74   e-Contro l: no-st
    0110  6f 72 65 2c 20 6e 6f 2d  63 61 63 68 65 2c 20 6d   ore, no- cache, m
    0120  75 73 74 2d 72 65 76 61  6c 69 64 61 74 65 2c 20   ust-reva lidate,
    0130  70 6f 73 74 2d 63 68 65  63 6b 3d 30 2c 20 70 72   post-che ck=0, pr
    0140  65 2d 63 68 65 63 6b 3d  30 0d 0a 50 72 61 67 6d   e-check= 0..Pragm
    0150  61 3a 20 6e 6f 2d 63 61  63 68 65 0d 0a 43 6f 6e   a: no-ca che..Con
    0160  74 65 6e 74 2d 4c 65 6e  67 74 68 3a 20 31 38 0d   tent-Len gth: 18.
    0170  0a 43 6f 6e 6e 65 63 74  69 6f 6e 3a 20 63 6c 6f   .Connect ion: clo
    0180  73 65 0d 0a 43 6f 6e 74  65 6e 74 2d 54 79 70 65   se..Cont ent-Type
    0190  3a 20 74 65 78 74 2f 68  74 6d 6c 3b 20 63 68 61   : text/h tml; cha
    01a0  72 73 65 74 3d 55 54 46  2d 38 0d 0a 0d 0a ef bb   rset=UTF -8.....
    01b0  bf 7b 22 53 74 61 74 75  73 22 3a 22 4f 6b 22 7d   .{"Statu s":"Ok"}

    Solusi: Hapus header BOM dari badan respons yang dikembalikan server aplikasi Anda ke OSS.