All Products
Search
Document Center

Object Storage Service:Callback

Last Updated:Mar 12, 2026

Setelah file diunggah, OSS dapat secara otomatis memicu callback untuk memberi tahu server aplikasi agar menjalankan operasi selanjutnya.

Batasan

  • Batasan 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

    • Server aplikasi harus merespons permintaan callback dalam waktu 5 detik. Jika respons melebihi batas waktu tersebut, callback dianggap gagal.

    • Callback yang gagal tidak memengaruhi status unggahan file yang berhasil.

    • Callback yang gagal tidak akan dicoba ulang secara otomatis.

  • Dukungan antarmuka

    Fitur callback hanya didukung untuk operasi PutObject, PostObject, dan CompleteMultipartUpload. Manajer unggahan file dan URL yang ditandatangani sebelumnya (presigned URLs) yang dienkapsulasi oleh SDK V2 dan berbasis pada operasi dasar ini juga mendukung fitur callback.

Ikhtisar proses callback

image

Proses callback OSS adalah sebagai berikut:

  1. Klien mengunggah file dengan parameter callback

    Saat mengunggah file, klien harus menyertakan parameter `callback` untuk menentukan alamat server aplikasi dan konten callback. Untuk meneruskan variabel kustom, Anda juga dapat menyertakan parameter `callback-var`.

  2. OSS menyimpan file dan mengirim permintaan callback

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

  3. Server memproses callback dan mengembalikan respons

    Setelah menerima permintaan callback, server dapat memverifikasi signature permintaan untuk tujuan keamanan. Server harus memproses permintaan dalam waktu 5 detik dan mengembalikan respons dalam format JSON. Kode status HTTP 200 menunjukkan bahwa callback berhasil. Kode status lainnya menunjukkan kegagalan callback.

  4. OSS mengembalikan hasil unggahan

    Setelah OSS menerima respons callback yang berhasil dari server aplikasi, OSS mengembalikan hasil pemrosesan akhir kepada klien.

Panduan pengembangan

Debugging callback unggahan melibatkan dua bagian: unggahan klien dan pemrosesan callback sisi server. Anda dapat terlebih dahulu melakukan debugging unggahan klien, lalu debugging server aplikasi. Setelah kedua bagian tersebut selesai di-debug, Anda dapat melakukan pengujian integrasi penuh.

Implementasi klien

Bagian ini menjelaskan logika dan proses penyusunan parameter callback unggahan. Untuk mengimplementasikan fitur callback unggahan secara cepat, lihat contoh kode yang disediakan oleh SDK.

Agar OSS secara otomatis memicu callback setelah file diunggah, Anda harus meneruskan parameter `callback` dan parameter opsional `callback-var` dalam permintaan unggahan.

  1. Buat parameter `callback`.

    Parameter ini menentukan alamat server aplikasi, format konten permintaan, dan informasi lainnya. Anda harus membuat parameter ini dalam format JSON, lalu mengencode-nya dengan Base64.

    1. Contoh konfigurasi sederhana:

      {
      "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 mengubah nilai ini sesuai kebutuhan. Misalnya, http://oss-demo.aliyuncs.com:23450.

      • callbackBody: Konten badan permintaan callback. Anda dapat menggunakan placeholder untuk meneruskan informasi unggahan secara dinamis. Misalnya, ${bucket} merepresentasikan nama bucket, ${object} merepresentasikan jalur lengkap file, dan ${x:xxx} mereferensikan variabel kustom. OSS mengganti placeholder ini dengan nilai aktual selama callback. Untuk informasi lebih lanjut tentang parameter yang tersedia, 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 Detail parameter callback.

  2. Buat parameter `callback-var` (opsional).

    Penting

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

    Parameter ini digunakan untuk meneruskan informasi bisnis kustom, seperti ID pengguna atau nomor pesanan, ke server aplikasi. Contohnya:

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

    Parameter `callback-var` harus digunakan bersama parameter `callbackBody`. Untuk mereferensikan parameter kustom ID pengguna (`uid`) dan nomor pesanan (`order_id`) pada contoh sebelumnya, Anda dapat menggunakan placeholder `${x:xxx}` dalam `callbackBody`. Contohnya:

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

    Selama callback, OSS mengirimkan konten berikut. Contoh ini mengasumsikan bahwa `callbackBodyType` diatur ke `application/x-www-form-urlencoded`.

    uid=12345&order=67890
  3. Encode parameter `callback` dan `callback-var` dengan Base64 setelah Anda membuatnya.

    • Contoh: encoding parameter `callback`

      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 encoding Base64:

      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • Contoh: encoding parameter `callback-var`

      Parameter `callback-var` asli:

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

      Hasil encoding Base64:

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

    Setelah Anda mengencode parameter, Anda dapat meneruskannya ke OSS menggunakan salah satu metode berikut.

    Meneruskan parameter dalam header (direkomendasikan)

    Metode ini cocok untuk mengunggah objek menggunakan SDK atau kode backend. Metode ini menyediakan keamanan tinggi dan direkomendasikan. Anda dapat mengatur header HTTP `x-oss-callback` dan `x-oss-callback-var` untuk meneruskan parameter callback.

    • 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 validitas permintaan.

    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

    Menggunakan field form dalam badan permintaan POST untuk meneruskan parameter

    Metode ini hanya berlaku untuk operasi PostObject. Anda hanya dapat meneruskan parameter callback melalui field form dalam badan permintaan POST.

    • Parameter `callback`: Anda dapat meneruskan parameter ini sebagai item form terpisah. Nilainya adalah konfigurasi JSON yang telah diencode Base64.

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • Parameter `callback-var` (parameter kustom): Setiap field kustom harus diteruskan sebagai item form terpisah. Jangan mengenkapsulasi field kustom ke dalam satu field `callback-var`.

      Sebagai contoh, untuk parameter kustom `uid` dan `order_id`:

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

      Anda harus mengonversinya menjadi dua field terpisah dalam form.

      --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 verifikasi untuk parameter `callback` dalam policy. Jika Anda tidak mengatur kondisi verifikasi, parameter tersebut tidak diverifikasi selama unggahan. Contohnya:

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

    Meneruskan parameter dalam URL

    • Metode ini umumnya digunakan untuk mengunggah file menggunakan presigned URLs. Metode ini mengimplementasikan callback otomatis dengan mengencode parameter callback menggunakan Base64 dan menambahkannya ke URL. Namun, metode ini menimbulkan risiko keamanan karena informasi callback terpapar di URL. Kami merekomendasikan penggunaan metode ini hanya untuk akses sementara atau dalam skenario dengan persyaratan keamanan rendah.

    • Jika Anda memilih untuk meneruskan parameter callback dalam URL, Anda harus menyertakan parameter callback. Parameter callback-var bersifat opsional. Saat menghitung signature, parameter-parameter ini harus disertakan dalam 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 ini menjelaskan alur pemrosesan sisi server. Untuk contoh kode dalam berbagai bahasa, lihat Contoh kode sisi server.

Server aplikasi harus mendukung fitur-fitur berikut:

  1. Menerima permintaan POST dari OSS

    Setelah file berhasil diunggah, OSS secara otomatis mengirim permintaan POST ke server aplikasi yang Anda konfigurasikan berdasarkan parameter callback. Contohnya:

    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. Memverifikasi signature permintaan untuk keamanan (opsional)

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

    Catatan

    Verifikasi signature bersifat opsional. Anda dapat mengaktifkannya sesuai kebutuhan.

  3. Mengembalikan respons callback

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

    • Server aplikasi harus mengembalikan respons dengan kode status `HTTP/1.1 200 OK`.

    • Header respons harus menyertakan `Content-Length`.

    • Badan respons dapat dalam format JSON atau XML. Contoh ini menggunakan format JSON. Untuk menggunakan format XML pada badan respons, Anda harus menambahkan Content-Type: application/xml ke header respons.

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

    Catatan: Contoh ini menggunakan Python 2.7.6. Untuk pengembangan aktual, Anda harus menggunakan Python 3.

    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 konten respons ini ke klien. Contohnya:

    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, mengaktifkan callback unggahan akan menimpa konten tersebut dengan konten yang dikembalikan oleh callback, seperti {"Status": "OK"}.

Konfigurasi yang direkomendasikan

Verifikasi signature permintaan untuk keamanan

Setelah Anda mengatur parameter callback, OSS mengirim permintaan callback POST ke server aplikasi yang Anda konfigurasikan berdasarkan parameter `callbackUrl`. Untuk memastikan bahwa permintaan berasal dari OSS, Anda dapat memverifikasi signature dalam permintaan callback. Bagian berikut menjelaskan langkah-langkah verifikasi secara detail.

  1. Generasi Signature Sisi Klien (Dilakukan oleh OSS)

    OSS menggunakan algoritma enkripsi asimetris RSA dan algoritma hash MD5 untuk menghasilkan signature untuk konten permintaan dan menambahkan signature tersebut ke field `authorization` dalam header permintaan.

    • Signature dihitung sebagai 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 berikut menjelaskan cara menghasilkan signature:

      1. Buat string yang akan ditandatangani. String tersebut terdiri dari jalur resource yang diperoleh dengan mendekode URL, string kueri asli, karakter carriage return, dan badan pesan callback.

      2. Tandatangani string yang dibuat menggunakan algoritma enkripsi RSA dan kunci privat. Fungsi hash yang digunakan untuk menghitung signature adalah MD5.

      3. Encode string yang telah ditandatangani dengan Base64 untuk mendapatkan signature akhir. Kemudian, tambahkan signature tersebut ke header `Authorization` dalam permintaan callback.

    • Contoh generasi 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

      Signature akhir kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** dihasilkan dari path /index.php, string kueri ?id=1&index=2, dan badan bucket=examplebucket.

  2. Server callback memverifikasi signature

    Server aplikasi harus memverifikasi signature permintaan dari OSS untuk mengonfirmasi keabsahan sumber permintaan. Anda dapat mengikuti langkah-langkah berikut:

    1. Dapatkan kunci publik:

      Anda dapat memperoleh URL kunci publik yang diencode Base64 dari field `x-oss-pub-key-url` dalam header permintaan, lalu mendekode URL tersebut.

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

      Nilai contoh 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/. Konten URL kunci publik tidak berubah. Kami merekomendasikan Anda menyimpan cache kunci publik untuk mencegah gangguan layanan yang disebabkan oleh fluktuasi jaringan.

    2. Decode signature.

      Anda dapat memperoleh signature dari field `authorization` dalam header permintaan, lalu mendekode signature tersebut dengan Base64.

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

      Anda dapat menggabungkan jalur resource, string kueri, line feed, dan badan pesan callback dalam format berikut:

      sign_str = url_decode(path) + query_string + '\n' + body
    4. Lakukan verifikasi signature.

      Anda dapat memverifikasi signature menggunakan algoritma hash MD5 dan kunci publik RSA.

      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):
            # Get public key.
            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)
                # Cache the public key content based on the public key address.
                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
            
            # Get authorization.
            authorization_base64 = self.headers['authorization']
            authorization = base64.b64decode(authorization_base64)
            # Get callback body.
            content_length = self.headers['content-length']
            callback_body = self.rfile.read(int(content_length))
            # Compose authorization string.
            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)
            # Verify authorization.
            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
            
            # Do something based on callback_body.
            # Respond to 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()

    Untuk contoh kode sisi server dalam bahasa pemrograman lain, lihat tabel berikut.

    Bahasa SDK

    Deskripsi

    Java

    • Tautan unduh: Java

    • Metode menjalankan: Ekstrak paket dan jalankan java -jar oss-callback-server-demo.jar 9000. Anda dapat mengganti 9000 dengan nomor port berbeda.

    Python

    • Tautan unduh: Python

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

    PHP

    • Tautan unduh: PHP

    • Metode menjalankan: Deploy ke lingkungan Apache. Di PHP, pengambilan beberapa header bergantung pada lingkungan. Ubah kode contoh agar sesuai dengan lingkungan Anda.

    .NET

    • Tautan unduh: .NET

    • Metode menjalankan: Ekstrak paket dan ikuti petunjuk dalam README.md.

    Node.js

    • Tautan unduh: Node.js

    • Metode menjalankan: Ekstrak paket dan jalankan node example.js.

    Ruby

    • Tautan unduh: Ruby

    • Metode menjalankan: Jalankan ruby aliyun_oss_callback_server.rb

Detail parameter callback

Tabel berikut memberikan deskripsi rinci tentang parameter `callback`, yang digunakan untuk mengonfigurasi konten dan perilaku permintaan callback setelah file berhasil diunggah ke OSS.

Field

Wajib

Deskripsi

callbackUrl

Ya

Setelah unggahan file berhasil, OSS mengirim permintaan callback POST ke URL ini.

  • Konfigurasikan hingga lima URL secara bersamaan, dipisahkan dengan titik koma (;). OSS mengirim permintaan secara berurutan hingga permintaan callback pertama mengembalikan respons sukses.

  • Mendukung alamat protokol HTTPS.

  • Tidak mendukung alamat IPv6 atau nama domain yang mengarah ke alamat IPv6.

  • Untuk memastikan penanganan karakter Tionghoa dan kasus lainnya secara benar, encode `callbackUrl` dengan URL-encoding. Misalnya, https://example.com/中文.php?key=value&中文名称=中文值 harus 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 saat memulai callback. Formatnya harus sesuai dengan parameter `callbackType`:

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

  • Ketika `callbackType` bernilai application/json, `callbackBody` harus dalam format JSON. Contohnya: {\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

`callbackBody` mendukung referensi ke parameter sistem OSS, variabel kustom, dan konstanta. Untuk deskripsi parameter sistem, lihat Parameter sistem yang didukung oleh callbackBody.

callbackHost

Tidak

Nilai header Host saat memulai permintaan callback. Formatnya berupa nama domain atau alamat IP.

  • Jika `callbackHost` tidak dikonfigurasi, parse URL dalam `callbackUrl` dan isi `callbackHost` dengan host yang di-parse.

callbackSNI

Tidak

Apakah akan menyertakan SNI (Server Name Indication) dalam permintaan callback (digunakan dalam permintaan HTTPS untuk mengidentifikasi domain dan mengembalikan sertifikat yang benar).

Jika `callbackUrl` menggunakan HTTPS, aktifkan parameter ini. Jika tidak, callback mungkin gagal karena ketidakcocokan sertifikat (misalnya, error '502 callback failed'). Nilainya sebagai berikut:

  • true: Kirim SNI.

  • false (nilai default): Jangan kirim SNI.

    Catatan

    Wilayah Inggris (London) selalu mengirim SNI, terlepas dari parameter ini.

callbackBodyType

Tidak

Nilai Content-Type dalam permintaan callback, yaitu format data callbackBody.

Mendukung dua tipe berikut:

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

    Ganti variabel dalam `callbackBody` dengan nilai yang diencode URL.

  • application/json

    Ganti variabel dalam `callbackBody` sesuai format JSON.

Parameter sistem yang didukung oleh callbackBody

Field `callbackBody` dalam parameter `callback` mendukung berbagai parameter sistem yang dapat Anda referensikan untuk meneruskan informasi tentang file yang diunggah dalam permintaan callback. Parameter sistem yang didukung tercantum dalam tabel berikut.

Parameter sistem

Makna

bucket

Nama bucket.

object

Jalur lengkap objek (file).

etag

ETag file, yaitu field ETag yang dikembalikan kepada pengguna.

size

Ukuran objek. Saat memanggil `CompleteMultipartUpload`, `size` adalah ukuran keseluruhan objek.

mimeType

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

imageInfo.height

Tinggi gambar. Variabel ini hanya berlaku untuk format gambar. Untuk format non-gambar, nilai variabel ini kosong.

imageInfo.width

Lebar gambar. Variabel ini hanya berlaku untuk format gambar. Untuk format non-gambar, nilai variabel ini kosong.

imageInfo.format

Format gambar, seperti JPG atau PNG. Variabel ini hanya berlaku untuk format gambar. Untuk format non-gambar, nilai variabel ini kosong.

crc64

Konsisten dengan konten header `x-oss-hash-crc64ecma` yang dikembalikan setelah unggahan file.

contentMd5

Nilai MD5. Nilai parameter ini sama dengan header Content-MD5 yang dikembalikan setelah objek diunggah.

Penting

Variabel ini memiliki nilai hanya ketika Anda mengunggah objek dengan memanggil operasi PutObject atau PostObject.

vpcId

`VpcId` dari klien yang memulai permintaan. Jika permintaan tidak dimulai melalui VPC, nilai variabel ini kosong.

clientIp

Alamat IP klien yang memulai permintaan.

reqId

`RequestId` dari permintaan yang dimulai.

operation

Nama operasi yang memulai permintaan, seperti `PutObject` atau `PostObject`.

SDK

Berikut adalah contoh implementasi klien.

Unggahan sederhana

(menggunakan PutObject)

Unggahan multipart

(menggunakan CompleteMultipartUpload)

Unggahan URL yang ditandatangani sebelumnya

(menggunakan PutObject)

Java

demo

demo

demo

Python V2

demo

-

demo

Go V2

demo

demo

demo

Troubleshooting

Pesan kesalahan OSS mencakup kode kesalahan EC. Jika terjadi kesalahan selama proses callback, Anda dapat menggunakan kode EC tersebut untuk troubleshooting. Setiap kode EC berkaitan dengan penyebab spesifik kesalahan. Untuk informasi lebih lanjut tentang kode kesalahan EC terkait callback, lihat 07-CALLBACK.

FAQ

Apakah OSS mengirim notifikasi callback ke server aplikasi setelah unggahan file gagal?

Tidak. OSS hanya menjalankan callback setelah file berhasil diunggah. Jika unggahan file gagal, OSS tidak menjalankan callback dan malah mengembalikan pesan kesalahan.

Bagaimana menangani error 'Response body is not valid json format'?

  • Server aplikasi melemparkan exception selama pemrosesan. Hal ini menyebabkan badan yang dikembalikan ke OSS tidak dalam format JSON, seperti yang ditunjukkan pada gambar berikut: callback

    Solusi:

    • Anda dapat menjalankan perintah berikut untuk mengonfirmasi kontennya.

      curl -d "<Content>" <CallbackServerURL> -v
    • Anda dapat menangkap paket untuk mengonfirmasi kontennya.

      Di Windows, Anda dapat menggunakan Wireshark untuk menangkap paket. Di Linux, Anda dapat menjalankan perintah tcpdump.

  • Badan yang dikembalikan oleh server aplikasi ke OSS berisi header byte order mark (BOM).

    Error ini umum terjadi pada server aplikasi yang ditulis menggunakan SDK PHP. Karena SDK PHP mengembalikan header BOM, badan yang diterima oleh OSS berisi tiga byte tambahan. Hal ini menghasilkan badan yang tidak dalam format JSON. Seperti yang ditunjukkan pada gambar berikut, byte `ef bb bf` merupakan header BOM.

    callback1

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