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
Proses callback OSS adalah sebagai berikut:
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`.
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.
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.
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.
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.
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.
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.
Buat parameter `callback-var` (opsional).
PentingParameter `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=67890Encode 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:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9Contoh: encoding parameter `callback-var`
Parameter `callback-var` asli:
{ "x:uid": "12345", "x:order_id": "67890" }Hasil encoding Base64:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
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**************** TestMenggunakan 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" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9Parameter `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" 67890Verifikasi 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. Parametercallback-varbersifat 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:
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=67890Memverifikasi 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.
CatatanVerifikasi signature bersifat opsional. Anda dapat mengaktifkannya sesuai kebutuhan.
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/xmlke 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"}PentingUntuk 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.
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))CatatanDalam 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:
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.
Tandatangani string yang dibuat menggunakan algoritma enkripsi RSA dan kunci privat. Fungsi hash yang digunakan untuk menghitung signature adalah MD5.
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=examplebucketSignature akhir
kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****dihasilkan dari path/index.php, string kueri?id=1&index=2, dan badanbucket=examplebucket.
Server callback memverifikasi signature
Server aplikasi harus memverifikasi signature permintaan dari OSS untuk mengonfirmasi keabsahan sumber permintaan. Anda dapat mengikuti langkah-langkah berikut:
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.pemCatatanURL kunci publik harus diawali dengan
http://gosspublic.alicdn.com/atauhttps://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.Decode signature.
Anda dapat memperoleh signature dari field `authorization` dalam header permintaan, lalu mendekode signature tersebut dengan Base64.
signature = base64_decode(authorization header value)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' + bodyLakukan verifikasi signature.
Anda dapat memverifikasi signature menggunakan algoritma hash MD5 dan kunci publik RSA.
result = rsa_verify(public_key, md5(sign_str), signature)
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.
|
callbackBody | Ya | Konten badan permintaan saat memulai callback. Formatnya harus sesuai dengan parameter `callbackType`:
`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.
|
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:
|
callbackBodyType | Tidak | Nilai Content-Type dalam permintaan callback, yaitu format data Mendukung dua tipe berikut:
|
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 | |||
Python V2 | - | ||
Go V2 |
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:

Solusi:
Anda dapat menjalankan perintah berikut untuk mengonfirmasi kontennya.
curl -d "<Content>" <CallbackServerURL> -vAnda 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.

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