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:
Klien mengunggah objek dengan parameter callback
Saat mengunggah objek, klien harus menyertakan parameter
callbackuntuk menentukan URL server aplikasi dan konten permintaan callback. Untuk meneruskan variabel kustom, Anda juga dapat menyertakan parameter opsionalcallback-var.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.
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.
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.
Buat parameter
callback.Parameter ini menentukan URL server aplikasi dan format badan permintaan. Parameter ini harus disusun sebagai objek JSON lalu diencode Base64.
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 menggunakanhttp://oss-demo.aliyuncs.com:23450sebagai 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.
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.
Buat parameter
callback-var(Opsional)PentingParameter 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-varharus digunakan bersama parametercallbackBody. Untuk variabel kustom dalam contoh sebelumnya (uiddanorder_id), referensikan dalamcallbackBodymenggunakan 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
callbackBodyTypediatur keapplication/x-www-form-urlencoded:uid=12345&order=67890Encode Base64 parameter
callbackdancallback-var.Contoh:
callbackparameter encodingParameter
callbackasli:{ "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:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9Contoh:
callback-varpengkodean parameterParameter
callback-varasli:{ "x:uid": "12345", "x:order_id": "67890" }Hasil setelah encoding Base64:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
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-callbackdanx-oss-callback-var.x-oss-callback: Parametercallbackyang telah diencode Base64.x-oss-callback-var(Opsional): Parametercallback-varyang 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**************** TestBadan permintaan POST
Metode ini hanya berlaku untuk unggahan PostObject. Parameter callback harus diteruskan sebagai field form dalam badan permintaan POST.
callbackparameter: Teruskan parameter ini sebagai field form terpisah. Nilainya adalah konfigurasi JSON yang telah diencode Base64.--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9callback-varparameter (variabel kustom): Setiap variabel kustom harus diteruskan sebagai field form terpisah. Anda tidak dapat mengemasnya ke dalam satu fieldcallback-var.Misalnya, pertimbangkan variabel kustom
uiddanorder_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" 67890Verifikasi parameter
callback(Opsional): Anda dapat menentukan kondisi validasi untuk parametercallbackdalampolicy. 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. Parametercallback-varbersifat 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:
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=67890Verifikasi 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.
CatatanVerifikasi signature bersifat opsional dan dapat diaktifkan sesuai kebutuhan keamanan Anda.
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 OKuntuk 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/xmlke 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"}PentingUntuk 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.
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
authorizationheader permintaan.Signature dihitung menggunakan rumus berikut:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))CatatanDalam rumus ini,
private_keyadalah kunci privat,pathadalah jalur resource permintaan callback,query_stringadalah string kueri, danbodyadalah badan pesan callback.Langkah-langkah untuk menghasilkan signature:
Buat string-to-sign: Decode URL jalur resource lalu tambahkan string kueri asli, karakter baris baru (
\n), dan badan pesan callback.Hasilkan signature RSA: Gunakan kunci privat untuk menandatangani string-to-sign. Fungsi hash untuk penandatanganan adalah MD5.
Encode Base64 hasilnya untuk mendapatkan signature akhir, lalu sertakan dalam header
authorizationpermintaan 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=examplebucketJalurnya adalah
/index.php, query_string-nya adalah?id=1&index=2, badannya adalahbucket=examplebucket, dan signature yang dihasilkan adalahkKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****.
Server callback memverifikasi tanda tangan
Server aplikasi Anda harus memverifikasi signature permintaan dari OSS untuk mengonfirmasi keasliannya. Proses verifikasi adalah sebagai berikut:
Dapatkan kunci publik:
Ambil URL kunci publik yang diencode Base64 dari field
x-oss-pub-key-urldalam 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.pemCatatanURL kunci publik harus diawali dengan
http://gosspublic.alicdn.com/atauhttps://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.Decode signature.
Ambil signature dari field
authorizationdalam header permintaan lalu decode Base64.signature = base64_decode(value of the authorization header)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’ + bodyLakukan verifikasi tanda tangan.
Gunakan hash MD5 dan kunci publik RSA untuk melakukan verifikasi.
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): # 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.
|
callbackBody | Ya | Konten badan permintaan callback. Formatnya harus konsisten dengan parameter
|
callbackHost | Tidak | Nilai header Host dalam permintaan callback. Nilainya dapat berupa nama domain atau alamat IP.
|
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
|
callbackBodyType | Tidak | Content-Type permintaan callback, yaitu format data Jenis berikut didukung:
|
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, |
mimeType | Jenis resource. Misalnya, jenis resource gambar JPEG adalah |
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 |
contentMd5 | Nilainya sama dengan nilai header 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 | |||
Python V2 | - | ||
Go V2 |
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> -vAmbil 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 bfmerepresentasikan 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.