Setelah objek diunggah ke Object Storage Service (OSS), OSS dapat secara otomatis mengirimkan permintaan callback untuk memberi tahu server aplikasi agar melakukan operasi selanjutnya.
Catatan penggunaan
Batasan Wilayah
Callbacks didukung di wilayah-wilayah berikut: Cina (Hangzhou), Cina (Shanghai), Cina (Qingdao), Cina (Beijing), Cina (Zhangjiakou), Cina (Hohhot), Cina (Ulanqab), Cina (Shenzhen), Cina (Heyuan), Cina (Guangzhou), Cina (Chengdu), Cina (Hong Kong), AS (Silicon Valley), AS (Virginia), Jepang (Tokyo), Singapura, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Filipina (Manila), Jerman (Frankfurt), Inggris (London), dan UEA (Dubai).
Logika Callback
Jika permintaan callback tidak menerima respons dalam waktu 5 detik setelah OSS mengirimkan permintaan, OSS menentukan bahwa permintaan tersebut telah habis waktu.
Objek yang diunggah tetap disimpan di OSS terlepas dari apakah permintaan upload callback berhasil atau gagal.
Jika permintaan callback gagal, permintaan callback tidak akan diulang.
Operasi yang Didukung
Hanya operasi PutObject, PostObject, dan CompleteMultipartUpload yang mendukung callbacks.
Proses callback
Langkah-langkah:
Klien Mengunggah Objek dengan Parameter Callback yang Ditentukan
Saat klien mengunggah objek, tentukan parameter callback, yang mencakup URL server aplikasi dan konten callback. Klien dapat mengonfigurasi parameter kustom menggunakan parameter callback-var.
OSS Menyimpan Objek dan Mengirimkan Permintaan Callback
Setelah objek diunggah, OSS mengirimkan permintaan POST ke URL server aplikasi. Permintaan tersebut berisi informasi objek, seperti nama bucket, nama objek, ukuran objek, ETag objek, dan parameter kustom.
Server Aplikasi Memproses Permintaan Callback dan Mengembalikan Respons
Setelah server aplikasi menerima permintaan callback, server aplikasi memverifikasi tanda tangan permintaan (opsional) untuk memastikan keamanan, memproses permintaan callback dalam waktu 5 detik, dan mengembalikan respons dalam format JSON. Kode status HTTP 200 menunjukkan bahwa panggilan berhasil. Kode status HTTP lainnya menunjukkan bahwa panggilan gagal.
OSS Mengembalikan Hasil Unggah dan Callback
Setelah OSS menerima respons callback, OSS mengembalikan hasil unggah dan callback ke klien.
Langkah-langkah untuk mengonfigurasi upload callbacks
Pengujian upload callback terdiri dari dua bagian: mengunggah objek dari klien dan memproses permintaan callback pada server aplikasi. Kami merekomendasikan Anda untuk men-debug unggahan objek terlebih dahulu, kemudian men-debug pemrosesan permintaan callback. Setelah kedua bagian selesai di-debug, lakukan pengujian gabungan.
Debug unggahan objek
Berikut ini menjelaskan cara membuat dan memproses logika serta memproses parameter upload callback. Untuk dengan cepat mengimplementasikan fitur upload callback, kami merekomendasikan Anda merujuk pada kode contoh yang disediakan untuk OSS SDKs.
Untuk memungkinkan OSS secara otomatis memicu callback setelah objek diunggah, Anda harus menentukan parameter berikut dalam permintaan unggah: callback dan callback-var (opsional).
Buat Parameter Callback
Parameter callback digunakan untuk menentukan URL server aplikasi dan format konten permintaan. Parameter ini harus dibuat dalam format JSON dan dienkripsi dalam Base64.
Contoh Konfigurasi Sederhana:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }callbackUrl: URL server aplikasi.
http://oss-demo.aliyuncs.com:23450digunakan dalam contoh ini.callbackBody: badan permintaan callback. Bidang callbackBody mendukung variabel sistem, seperti ${bucket} dan ${object}, serta variabel kustom. Untuk informasi lebih lanjut tentang variabel sistem, lihat Variabel Sistem yang Didukung oleh callbackBody.
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 di atas, lihat Bidang yang Didukung oleh Parameter Callback.
(Opsional) Buat Parameter Callback-var
Parameter ini digunakan untuk mengirimkan informasi layanan kustom, seperti ID pengguna dan nomor pesanan, ke server aplikasi. Parameter ini harus dalam format JSON. Kunci setiap parameter kustom harus dimulai dengan x: dan hanya boleh berisi huruf kecil. Contoh:
{ "x:uid": "12345", "x:order_id": "67890" }Parameter callback-var harus digunakan bersama dengan parameter callbackBody. Parameter ID pengguna (uid) dan nomor pesanan (order_id) dalam contoh di atas harus dirujuk oleh placeholder ${x:xxx} dalam callbackBody. Contoh:
{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }Selama proses permintaan callback sebenarnya, OSS mengirimkan konten berikut. Dalam contoh ini, bidang callbackBodyType diatur ke application/x-www-form-urlencoded.
uid=12345&order=67890Setelah Membuat Parameter Callback dan Callback-var, Anda Harus Mengenkripsi Mereka dalam Base64
Contoh: Enkripsi Base64 Parameter Callback
Parameter callback yang belum dienkripsi Base64:
{ "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 }Parameter callback yang telah dienkripsi Base64:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9Contoh: Enkripsi Base64 Parameter Callback-var
Parameter callback-var yang belum dienkripsi Base64:
{ "x:uid": "12345", "x:order_id": "67890" }Parameter callback-var yang telah dienkripsi Base64:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
Tambahkan Parameter yang Telah Dienkripsi Base64 ke dalam Permintaan
Anda dapat menggunakan salah satu metode berikut untuk menambahkan parameter yang telah dienkripsi Base64 ke dalam permintaan.
(Direkomendasikan) Tambahkan parameter ke dalam permintaan sebagai header
Metode ini cocok untuk skenario di mana Anda ingin mengunggah objek ke OSS menggunakan OSS SDKs atau kode backend, yang memberikan keamanan tinggi. Anda dapat mengatur header x-oss-callback ke parameter callback yang telah dienkripsi Base64 dan x-oss-callback-var ke parameter callback-var yang telah dienkripsi Base64. Header x-oss-callback-var ini opsional.
Catatan: Header x-oss-callback-var dan x-oss-callback termasuk dalam header kanonikal untuk menghitung tanda tangan.
Contoh
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**************** TestTambahkan parameter ke dalam bidang formulir di badan permintaan POST
Metode ini hanya didukung untuk operasi PostObject. Parameter callback dan callback-var hanya dapat dilewatkan menggunakan bidang formulir di badan permintaan POST.
Parameter Callback: Anda harus melewatkan parameter ini sebagai item formulir terpisah dalam format JSON.
--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9Parameter Callback-var: Bidang kustom harus dilewatkan sebagai item formulir terpisah dan tidak dapat dienkapsulasi sebagai bidang callback-var keseluruhan. Bidang formulir ini opsional.
Contoh parameter uid dan order_id:
{ "x:uid": "12345", "x:order_id": "67890" }Ubah parameter uid dan order_id menjadi bidang terpisah dalam formulir:
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890(Opsional) Verifikasi Parameter Callback: Anda dapat menentukan kondisi verifikasi untuk parameter callback dalam kebijakan. Jika Anda meninggalkan kondisi kosong, parameter callback tidak diverifikasi saat Anda mengunggah objek ke OSS. Contoh:
{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"], ] }
Tambahkan parameter ke dalam URL
Metode ini sering digunakan saat Anda mengunggah objek menggunakan URL presigned. Anda dapat mengkodekan ulang parameter callback dan callback-var yang telah dienkripsi Base64 dan menggabungkannya dalam URL untuk mengotomatiskan callback. Namun, informasi callback terpapar dalam URL, yang meningkatkan risiko keamanan. Kami merekomendasikan Anda hanya menggunakannya untuk akses sementara atau dalam skenario sensitivitas rendah.
Parameter
callbackdiperlukan, dan parametercallback-varopsional. Selama perhitungan tanda tangan, parameter ini harus digunakan sebagai bagian dari string query kanonikal. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Sertakan Tanda Tangan V4 dalam URL.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
Proses permintaan callback pada server aplikasi
Bagian ini menunjukkan cara server aplikasi memproses permintaan callback. Untuk informasi lebih lanjut tentang kode contoh untuk berbagai bahasa pemrograman, lihat Kode Contoh untuk Berbagai Bahasa Pemrograman.
Server aplikasi harus memiliki kemampuan berikut:
Terima Permintaan POST dari OSS
Setelah objek diunggah, OSS secara otomatis mengirimkan permintaan POST ke server aplikasi berdasarkan parameter callback. Contoh:
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(Opsional) Verifikasi Tanda Tangan Permintaan untuk Memastikan Keamanan Data
Untuk memastikan bahwa permintaan callback dikirim oleh OSS, kami merekomendasikan Anda memverifikasi tanda tangan permintaan pada server aplikasi. Untuk informasi lebih lanjut, lihat Konfigurasi yang Direkomendasikan.
CatatanVerifikasi tanda tangan tidak wajib. Anda dapat mengaktifkannya berdasarkan kebutuhan bisnis Anda.
Kembalikan Respons untuk Permintaan Callback
Setelah server aplikasi menerima permintaan callback, ia harus mengembalikan respons ke OSS. Respons tersebut harus memenuhi persyaratan berikut:
Secara normal, server aplikasi mengembalikan HTTP/1.1 200 OK.
Respons yang dikembalikan oleh server aplikasi ke OSS harus berisi header Content-Length. Ukuran header tidak boleh melebihi 3 MB.
Badan respons harus dalam format JSON dan tidak boleh melebihi 1 MB dalam ukuran.
Dalam contoh ini, server aplikasi mengembalikan {"Status": "OK"}.
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 mengembalikan respons 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"}PentingUntuk permintaan
CompleteMultipartUpload, jika badan respons berisi konten seperti informasi dalam format JSON, konten tersebut akan ditimpa oleh respons callback setelah upload callback diaktifkan. Dalam contoh ini, konten tersebut ditimpa oleh{"Status": "OK"}.
Konfigurasi yang direkomendasikan
Verifikasi tanda tangan dalam permintaan callback untuk memastikan keamanan data
Setelah Anda mengonfigurasi parameter callback, OSS mengirimkan permintaan callback ke server aplikasi setelah Anda mengunggah objek ke OSS berdasarkan parameter callbackUrl. Untuk memastikan bahwa permintaan tersebut dikirim oleh OSS, Anda dapat memverifikasi tanda tangan dalam permintaan callback. Langkah-langkah verifikasi:
OSS Menghasilkan Tanda Tangan di Klien
OSS menggunakan algoritma enkripsi asimetris RSA dan hash MD5 untuk menghasilkan tanda tangan untuk permintaan dan menambahkan tanda tangan ke header permintaan otorisasi.
Contoh Kode untuk Perhitungan Tanda Tangan:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))CatatanDalam kode di atas, private_key menentukan kunci privat, path menentukan jalur sumber daya yang termasuk dalam permintaan callback, query_string menentukan string query, dan body menentukan badan pesan dalam permintaan callback.
Langkah-langkah untuk Menghasilkan Tanda Tangan:
Buat string yang akan ditandatangani. String ini terdiri dari jalur sumber daya yang diperoleh dengan mendekode URL, string query asli, baris baru, dan badan pesan callback.
Tandatangani string yang dibuat menggunakan algoritma enkripsi RSA dan kunci privat. Fungsi hash yang digunakan untuk menghitung tanda tangan adalah MD5.
Gunakan Base64 untuk mengkodekan hasil yang ditandatangani untuk mendapatkan tanda tangan akhir. Kemudian, tambahkan tanda tangan ke header Authorization dalam permintaan callback.
Contoh Kode untuk Pembuatan Tanda Tangan:
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=examplebucketDalam kode di atas, tanda tangan akhir adalah
kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****. Tanda tangan tersebut dihasilkan dari path/index.php, string query?id=1&index=2, dan bodybucket=examplebucket.
Server Aplikasi Memverifikasi Tanda Tangan
Server aplikasi Anda harus memverifikasi tanda tangan dalam permintaan untuk mengonfirmasi validitas sumber permintaan. Prosedur:
Peroleh Kunci Publik:
Peroleh URL kunci publik yang dienkripsi Base64 dari header permintaan x-oss-pub-key-url dan dekodekan.
public_key = urlopen(base64_decode(x-oss-pub-key-url header value))URL kunci publik yang dienkripsi Base64:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==URL kunci publik yang didekode:
http://gosspublic.alicdn.com/callback_pub_key_v1.pemCatatanURL kunci publik harus dimulai dengan
http://gosspublic.alicdn.com/atauhttps://gosspublic.alicdn.com/. Konten URL kunci publik tetap tidak berubah. Kami merekomendasikan Anda menyimpan cache kunci publik untuk mencegah dampak layanan akibat fluktuasi jaringan.Dekode Tanda Tangan.
Peroleh tanda tangan dari header permintaan authorization dan lakukan dekode Base64:
signature = base64_decode(authorization header value)Buat String yang Akan Diverifikasi.
Gabungkan jalur sumber daya, string query, baris baru, dan badan pesan callback dalam format berikut:
sign_str = url_decode(path) + query_string + '\n' + bodyVerifikasi Tanda Tangan.
Gunakan hash MD5 dan kunci publik RSA untuk memverifikasi tanda tangan:
result = rsa_verify(public_key, md5(sign_str), signature)
Contoh Verifikasi Tanda Tangan
Kode berikut memberikan contoh cara server aplikasi memverifikasi tanda tangan. Sebelum menjalankan kode dalam OSS SDK for Python, instal pustaka M2Crypto:
import httplib import base64 import md5 import urllib2 from BaseHTTPServer 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 = pub_key_url_base64.decode('base64') 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 = urllib2.urlopen(pub_key_url) #you can cache it,recommend caching public key content based on the public key address pub_key = url_reader.read() except: print 'pub_key_url : ' + pub_key_url print 'Get pub key failed!' self.send_response(400) self.end_headers() return #get authorization authorization_base64 = self.headers['authorization'] authorization = authorization_base64.decode('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 = urllib2.unquote(self.path) + '\n' + callback_body else: auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body print auth_str #verify authorization auth_md5 = md5.new(auth_str).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 according to callback_body #response 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) class MyHTTPServer(HTTPServer): def __init__(self, host, port): HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler) if '__main__' == __name__: server_ip = get_local_ip() server_port = 23451 server = MyHTTPServer(server_ip, server_port) server.serve_forever()Tabel berikut menjelaskan kode yang dapat Anda gunakan untuk memverifikasi tanda tangan pada server dalam bahasa pemrograman lainnya.
SDK bahasa pemrograman
Deskripsi
Java
Tautan unduhan: OSS SDK for Java
Cara menjalankan: Ekstrak paket dan jalankan
java -jar oss-callback-server-demo.jar 9000. Anda dapat mengganti 9000 dengan nomor port yang berbeda.
Python
Tautan unduhan: OSS SDK for Python
Cara menjalankan: Ekstrak paket dan jalankan
python callback_app_server.py. Dependensi RSA diperlukan untuk menjalankan kode tersebut.
PHP
Tautan unduhan: OSS SDK for PHP
Cara menjalankan: Terapkan kode ke lingkungan Apache untuk memastikan bahwa header tertentu dalam kode dapat menggunakan lingkungan sebagai dependensi. Anda dapat memodifikasi kode contoh berdasarkan lingkungan.
.NET
Tautan unduhan: OSS SDK for .NET
Cara menjalankan: Ekstrak paket dan ikuti petunjuk dalam
README.md.
Node.js
Tautan unduhan: OSS SDK for Node.js
Cara menjalankan: Ekstrak paket dan jalankan
node example.js.
Ruby
Tautan unduhan: OSS SDK for Ruby
Cara menjalankan: Jalankan ruby aliyun_oss_callback_server.rb.
Bidang yang didukung oleh parameter callback
Tabel berikut menjelaskan bidang yang didukung oleh parameter callback. Bidang-bidang ini digunakan untuk mengonfigurasi konten dan perilaku permintaan callback setelah objek diunggah ke OSS.
Bidang | Diperlukan | Deskripsi |
callbackUrl | Ya | URL server aplikasi ke mana OSS mengirimkan permintaan callback.
|
callbackBody | Ya | Badan permintaan callback. Format badan permintaan harus sesuai dengan bidang callbackType.
Bidang callbackBody mendukung parameter sistem OSS, parameter kustom, dan konstanta. Untuk informasi lebih lanjut tentang variabel sistem, lihat Variabel sistem yang didukung oleh callbackBody. |
callbackHost | Tidak | Nilai header Host dalam permintaan callback. Nilai tersebut harus berupa nama domain atau alamat IP.
|
callbackSNI | Tidak | Menentukan apakah akan menentukan Server Name Indication (SNI) dalam permintaan callback. Jika parameter callbackUrl menggunakan HTTPS, kami merekomendasikan Anda mengaktifkan parameter ini. Jika tidak, callback mungkin gagal karena ketidakcocokan sertifikat. Misalnya, "502 callback failed" dikembalikan. Nilai valid:
|
callbackBodyType | Tidak | Nilai Content-Type dalam permintaan callback, yaitu format data Nilai valid:
|
Variabel sistem yang didukung oleh callbackBody
Bidang callbackBody dalam parameter callback memungkinkan Anda menggunakan beberapa parameter sistem untuk melewati informasi tentang objek yang diunggah dalam permintaan callback. Tabel berikut menjelaskan parameter sistem yang didukung.
Parameter sistem | Deskripsi |
bucket | Nama bucket. |
object | Jalur lengkap objek. |
etag | Bidang ETag objek. ETag dikembalikan ke peminta. |
size | Ukuran objek. Ukuran tersebut adalah ukuran seluruh objek saat Anda memanggil operasi CompleteMultipartUpload. |
mimeType | Jenis sumber daya. Misalnya, jenis sumber daya gambar JPEG adalah image/jpeg. |
imageInfo.height | Tinggi gambar. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong. |
imageInfo.width | Lebar gambar. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong. |
imageInfo.format | Format gambar. Contoh: JPG dan PNG. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong. |
crc64 | Nilai CRC64. Nilai parameter ini sama dengan header x-oss-hash-crc64ecma yang dikembalikan setelah objek diunggah. |
contentMd5 | Nilai MD5. Nilai parameter ini sama dengan header Content-MD5 yang dikembalikan setelah objek diunggah. Penting Parameter ini hanya diperlukan jika Anda memanggil operasi PutObject atau PostObject untuk mengunggah objek. |
vpcId | ID virtual private cloud (VPC) tempat klien yang memulai permintaan berada. Jika permintaan tidak dimulai melalui VPC, parameter ini dibiarkan kosong. |
clientIp | Alamat IP klien yang memulai permintaan. |
reqId | ID permintaan yang dimulai. |
operation | Operasi API yang digunakan untuk memulai permintaan, seperti PutObject dan PostObject. |
SDK
Tabel berikut menjelaskan OSS SDK yang dapat Anda gunakan untuk mengonfigurasi callback.
Unggah sederhana | Unggah multipart | Unggah berbasis URL presigned | |
Java | |||
Python V2 | - | ||
Go V2 |
Pemecahan Masalah
Jika terjadi kesalahan selama proses callback, pesan kesalahan yang berisi kode kesalahan akan dikembalikan oleh OSS. Anda dapat menggunakan kode kesalahan tersebut untuk pemecahan masalah. Setiap kode kesalahan sesuai dengan penyebab kesalahan tertentu. Untuk informasi tentang kode kesalahan terkait callback, lihat 07-CALLBACK.
FAQ
Apakah OSS mengirimkan permintaan callback ke server aplikasi saat objek gagal diunggah?
Tidak. OSS hanya mengirimkan permintaan callback ke server aplikasi jika objek berhasil diunggah. Jika objek gagal diunggah, OSS tidak mengirimkan permintaan callback ke server aplikasi tetapi mengembalikan pesan kesalahan.
Apa yang harus saya lakukan jika pesan kesalahan "Response body is not valid json format" dikembalikan?
Pesan kesalahan ini dikembalikan karena server aplikasi melempar pengecualian saat permintaan sedang diproses. Dalam hal ini, badan respons yang dikembalikan ke OSS tidak dalam format JSON. Gambar berikut menunjukkan respons yang dikembalikan ke OSS saat kesalahan ini terjadi.

Solusi:
Jalankan perintah berikut untuk mengonfirmasi konten:
curl -d "<Content>" <CallbackServerURL> -vTangkap paket untuk mengonfirmasi konten.
Kami merekomendasikan Anda menggunakan alat Wireshark di Windows atau menjalankan perintah tcpdump di Linux untuk menangkap paket.
Badan respons yang dikembalikan oleh server aplikasi ke OSS mencakup header BOM.
Kesalahan ini umum terjadi di antara server aplikasi yang ditulis menggunakan OSS SDK for PHP. OSS SDK for PHP mengembalikan header BOM. Akibatnya, OSS menerima tiga byte tambahan dalam badan respons yang tidak dalam format JSON. Gambar berikut menunjukkan bahwa byte ef, bb, dan bf adalah byte tambahan dalam badan respons.

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