OSS yükleme geri aramaları, bir nesne başarıyla yüklendikten sonra uygulama sunucunuzu otomatik olarak bilgilendirir ve sonraki işlemlerin yapılmasını sağlar.
Sınırlamalar
-
Bölge kullanılabilirliği
Geri arama özelliği aşağıdaki bölgelerde desteklenir: Çin (Hangzhou), Çin (Shanghai), Çin (Qingdao), Çin (Beijing), Çin (Zhangjiakou), Çin (Hohhot), Çin (Ulanqab), Çin (Shenzhen), Çin (Heyuan), Çin (Guangzhou), Çin (Chengdu), Çin (Hong Kong), ABD (Silicon Valley), ABD (Virginia), Japonya (Tokyo), Singapur, Malezya (Kuala Lumpur), Endonezya (Cakarta), Filipinler (Manila), Almanya (Frankfurt), Birleşik Krallık (Londra) ve BAE (Dubai).
-
Geri arama davranışı
Bir geri arama isteğinin 5 saniye içinde yanıt alması gerekir. Aksi takdirde geri arama başarısız olur.
Başarısız olan bir geri arama, nesne yüklemenin başarılı olmasını etkilemez.
OSS, başarısız olan geri aramaları otomatik olarak yeniden denemez.
-
Desteklenen işlemler
PutObject, PostObject ve CompleteMultipartUpload işlemleri için geri aramalar yapılandırabilirsiniz. Bu temel işlemlere dayanan V2 SDK'larındaki dosya yükleme yöneticisi ve imzalı URL'ler de geri aramaları destekler.
Nasıl çalışır?
OSS geri arama süreci aşağıdaki adımları içerir:
-
İstemci geri arama parametreleriyle bir nesne yükler
İstemci, bir nesne yüklerken uygulama sunucusunun URL'sini ve geri arama isteğinin içeriğini belirtmek için
callbackparametresini dahil etmelidir. Özel değişkenleri iletmek için isteğe bağlıcallback-varparametresini de ekleyebilirsiniz. -
OSS nesneyi depolar ve bir geri arama isteği gönderir
Nesne başarıyla yüklendikten sonra OSS, belirtilen geri arama URL'sine bir POST isteği gönderir. İstek; paket, nesne, boyut ve etag gibi nesne bilgilerini ve varsa özel parametreleri içerir.
-
Uygulama sunucusu geri aramayı işler ve bir yanıt gönderir
Uygulama sunucusu geri arama isteğini aldıktan sonra işlem yapar, güvenlik amacıyla isteğin imzasını doğrulayabilir ve 5 saniye içinde bir JSON yanıtı döndürür. HTTP durum kodu 200 başarıyı gösterir. Diğer tüm durum kodları başarısızlığı ifade eder.
-
OSS yükleme sonucunu döndürür
Uygulama sunucusundan başarılı bir yanıt alan OSS, bu yanıtı istemciye nihai yükleme sonucu olarak iletir.
Uygulama
Yükleme geri aramasının hata ayıklaması iki bölümden oluşur: istemci tarafındaki yükleme ve sunucu tarafındaki geri arama işleme. Önce istemci tarafını, ardından uygulama sunucusunu hata ayıklayın. Her iki bölüm de bağımsız olarak çalıştıktan sonra uçtan uca tam bir test gerçekleştirin.
İstemci tarafı uygulaması
Daha hızlı bir uygulama için SDK'lar bölümünde sağlanan örnek koda bakın.
Bir nesne yüklendikten sonra otomatik bir OSS geri araması tetiklemek için yükleme isteğinize callback parametresini ve isteğe bağlı callback-var parametresini ekleyin.
-
callback parametresini oluşturun.
Bu parametre, uygulama sunucusu URL'sini ve istek gövdesi biçimini tanımlar. Bir JSON nesnesi olarak yapılandırılması ve ardından Base64 ile kodlanması gerekir.
-
Minimum yapılandırma örneği:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }Bu örnekte:
callbackUrl: Uygulama sunucusunun adresi. Bu parametreyi gerçek adrese ayarlamanız gerekir. Bu konuda örnek olarakhttp://oss-demo.aliyuncs.com:23450kullanılmıştır.callbackBody: Geri arama isteği gövdesinin içeriği. Paket adı için${bucket}, tam dosya yolu için${object}gibi yer tutucular kullanarak yükleme bilgilerini dinamik olarak ekleyebilir ve özel değişkenlere başvurmak için${x:xxx}kullanabilirsiniz. OSS, geri arama sırasında bu yer tutucuları gerçek değerlerle değiştirir. Desteklenen sistem parametreleri hakkında daha fazla bilgi için callbackBody tarafından desteklenen sistem parametreleri konusuna bakın.
-
Gelişmiş yapılandırma örneği:
{ "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 }Alanlar hakkında daha fazla bilgi için Geri arama parametresi konusuna bakın.
-
-
callback-var parametresini oluşturun (İsteğe bağlı)
Önemlicallback-var parametresi JSON formatında olmalıdır. Her özel parametrenin anahtarı x: ile başlamalı ve yalnızca küçük harfler içermelidir, örneğin
x:uid.Kullanıcı kimliği veya sipariş numarası gibi özel iş bilgilerini uygulama sunucunuza iletmek için bu parametreyi kullanın. Örnek:
{ "x:uid": "12345", "x:order_id": "67890" }callback-varparametresi,callbackBodyparametresiyle birlikte kullanılmalıdır. Önceki örnekteki özel değişkenlere (uidveorder_id)callbackBodyiçinde${x:xxx}yer tutucusunu kullanarak başvurun. Örnek:{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }Geri arama tetiklendiğinde,
callbackBodyTypeparametresiapplication/x-www-form-urlencodedolarak ayarlanmışsa OSS aşağıdaki içeriği gönderir:uid=12345&order=67890 -
callback ve callback-var parametrelerini Base64 ile kodlayın.
-
Örnek: callback parametresi kodlaması
Orijinal
callbackparametresi:{ "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 }Base64 kodlamasından sonraki sonuç:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 -
Örnek: callback-var parametresi kodlaması
Orijinal
callback-varparametresi:{ "x:uid": "12345", "x:order_id": "67890" }Base64 kodlamasından sonraki sonuç:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
-
-
Kodlanmış parametreleri isteğe ekleyin.
Parametreleri kodladıktan sonra bunları OSS'e aşağıdaki yollardan biriyle iletebilirsiniz.
Header (Recommended)
Bu yöntem, bir SDK veya arka uç kodu üzerinden yapılan yüklemeler için uygundur. Yüksek güvenlik sağlar ve önerilen yöntemdir.
x-oss-callbackvex-oss-callback-varHTTP başlık alanlarını ayarlayarak geri arama parametrelerini iletebilirsiniz.x-oss-callback: Base64 ile kodlanmışcallbackparametresi.x-oss-callback-var(İsteğe bağlı): Base64 ile kodlanmışcallback-varparametresi.
Not: İstek imzasını hesaplarken, isteğin geçerli olması için bu iki parametrenin kanonik başlıklara dahil edilmesi gerekir.
Örnek: Geri arama parametrelerini başlıkta iletme
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**************** TestPOST request body
Bu yöntem yalnızca PostObject yüklemeleri için geçerlidir. Geri arama parametreleri, POST isteğinin gövdesinde form alanları olarak iletilmelidir.
-
callback parametresi: Bu parametreyi ayrı bir form alanı olarak iletin. Değer, Base64 ile kodlanmış JSON yapılandırmasıdır.
--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 -
callback-var parametresi (özel değişkenler): Her özel değişken ayrı bir form alanı olarak iletilmelidir. Bunları tek bir
callback-varalanında birleştiremezsiniz.Örneğin,
uidveorder_idözel değişkenlerini ele alalım:{ "x:uid": "12345", "x:order_id": "67890" }Bunları iki ayrı form alanına dönüştürmeniz gerekir.
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890 -
callback parametresini doğrulayın (İsteğe bağlı):
policyiçindecallbackparametresi için doğrulama koşulları belirtebilirsiniz. Bu koşul atlanırsa, yükleme sırasında parametre doğrulanmaz. Örnek:{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"] ] }
URL
Bu yöntem genellikle imzalı bir URL kullanarak nesne yüklemek için kullanılır. Base64 ile kodlanmış geri arama parametreleri, otomatik geri aramayı etkinleştirmek için URL'ye eklenir. Ancak bu yöntem, geri arama bilgilerini URL'de açığa çıkarır ve güvenlik riskleri oluşturur. Yalnızca geçici erişim veya düşük hassasiyet gerektiren senaryolarda kullanın.
-
Geri arama parametrelerini URL'de iletmeyi seçerseniz
callbackparametresini dahil etmeniz gerekir.callback-varparametresi isteğe bağlıdır. İmza hesaplandığında bu parametrelerin Canonical Query String'in bir parçası olarak dahil edilmesi gerekir. Daha fazla bilgi için Signature Version 4 konusuna bakın.Örnek:
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
Sunucu tarafı uygulaması
Aşağıdaki bölüm sunucu tarafı işleme akışını açıklar. Farklı programlama dillerindeki örnek kodlar için Sunucu tarafı örnek kodu konusuna bakın.
Uygulama sunucunuz aşağıdaki eylemleri gerçekleştirebilmelidir:
-
OSS'ten POST isteklerini alın
Bir nesne başarıyla yüklendikten sonra OSS, uygulama sunucunuza otomatik olarak bir POST isteği gönderir. Aşağıdaki örnek kod bir istek örneğini göstermektedir:
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 -
Güvenlik için istek imzasını doğrulayın (İsteğe bağlı)
Geri arama isteklerinin OSS kaynaklı olduğundan emin olmak için uygulama sunucunuzda istek imzasını doğrulayın. Ayrıntılı talimatlar için Önerilen yapılandırmalar konusuna bakın.
Notİmza doğrulama isteğe bağlıdır ve güvenlik gereksinimlerinize göre etkinleştirilebilir.
-
Bir geri arama yanıtı gönderin
Uygulama sunucunuz bir geri arama isteği aldıktan sonra OSS'e bir yanıt göndermelidir. Yanıt aşağıdaki gereksinimleri karşılamalıdır:
Uygulama sunucusu başarıyı belirtmek için
HTTP/1.1 200 OKdöndürmelidir.Yanıt başlığı
Content-Lengthiçermelidir.Yanıt gövdesi JSON veya XML formatını destekler. Bu konuda JSON örneği kullanılmıştır. XML formatını kullanmak istiyorsanız yanıt başlığına
Content-Type: application/xmlekleyin.
Örneğin, uygulama sunucusu
{"Status": "OK"}döndürür.Not: Bu örnekteki Python sürümü 2.7.6'dır. Geliştirme için Python 3 kullanmanızı öneririz.
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 daha sonra bu yanıtı istemciye iletir. Örnek:
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"}ÖnemliBir
CompleteMultipartUploadisteğinde, orijinal yanıt gövdesi içerik (örneğin JSON formatında bilgiler) içeriyorsa, yükleme geri araması etkinleştirildiğinde bu içerik geri aramadan gelen yanıtla üzerine yazılır. Örneğin, bu durumda içerik{"Status": "OK"}ile üzerine yazılır.
Önerilen yapılandırmalar
İstek imzasını doğrulayın
Geri arama parametrelerini yapılandırdıktan sonra OSS, belirtilen callbackUrl değerine göre uygulama sunucusuna bir POST geri arama isteği gönderir. İsteğin OSS kaynaklı olduğundan emin olmak için geri arama isteğinin imzasını doğrulayabilirsiniz. Aşağıdaki adımlar doğrulama sürecini açıklamaktadır.
-
OSS imzayı nasıl oluşturur?
OSS, istek içeriği için bir imza oluşturmak üzere MD5 hash ile RSA asimetrik şifreleme algoritmasını kullanır. İmza daha sonra istek başlığının
authorizationalanına dahil edilir.-
İmza aşağıdaki formül kullanılarak hesaplanır:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))NotBu formülde
private_keyözel anahtar,pathgeri arama isteğinin kaynak yolu,query_stringsorgu dizesi vebodygeri aramanın mesaj gövdesidir. -
İmza oluşturma adımları:
İmzalanacak dizeyi oluşturun: Kaynak yolunu URL-decode edin ve orijinal sorgu dizesini, yeni satır karakterini (
\n) ve geri arama mesaj gövdesini ekleyin.RSA imzasını oluşturun: İmzalanacak dizeyi imzalamak için özel anahtarı kullanın. İmzalama için kullanılan hash fonksiyonu MD5'tir.
Sonucu Base64 ile kodlayarak nihai imzayı elde edin ve bunu geri arama isteğinin
authorizationbaşlığına dahil edin.
-
İmza oluşturma örneği:
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=examplebucketYol
/index.php, query_string?id=1&index=2, gövdebucket=examplebucketve elde edilen imzakKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****şeklindedir.
-
-
Geri arama sunucusu imzayı doğrular
Uygulama sunucunuz, özgünlüğünü onaylamak için OSS'ten gelen isteğin imzasını doğrulamalıdır. Doğrulama süreci aşağıdaki gibidir:
-
Genel anahtarı edinin:
İstek başlığındaki
x-oss-pub-key-urlalanından Base64 ile kodlanmış genel anahtar URL'sini alın ve decode edin.public_key = urlopen(base64_decode(value of the x-oss-pub-key-url header))Decode edilmeden önceki örnek değer:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==Decode edildikten sonra:
http://gosspublic.alicdn.com/callback_pub_key_v1.pemNotGenel anahtar URL'si
http://gosspublic.alicdn.com/veyahttps://gosspublic.alicdn.com/ile başlamalıdır. Genel anahtar URL'sindeki içerik değişmediğinden, ağ dalgalanmalarından kaynaklanan hizmet kesintilerini önlemek için genel anahtarı önbelleğe almanızı öneririz. -
İmzayı decode edin.
İstek başlığının
authorizationalanından imzayı alın ve Base64 ile decode edin.signature = base64_decode(value of the authorization header) -
Doğrulanacak dizeyi oluşturun.
Kaynak yolu, sorgu dizesini, yeni satır karakterini (
\n) ve geri arama mesaj gövdesini aşağıdaki formatta birleştirin:sign_str = url_decode(path) + query_string + ‘\n’ + body -
İmza doğrulaması yapın.
Doğrulamayı gerçekleştirmek için MD5 hash ve RSA genel anahtarını kullanın.
result = rsa_verify(public_key, md5(sign_str), signature)
-
-
İmza doğrulama örneği
Aşağıdaki Python 3 kodu, bir uygulama sunucusunda imzanın nasıl doğrulanacağına ilişkin bir örnek sunar. Bu örnek M2Crypto kitaplığını gerektirir.
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 the 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) # You can cache the public key. We recommend caching the public key content based on the public key URL to improve performance. 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 the signature. authorization_base64 = self.headers['authorization'] authorization = base64.b64decode(authorization_base64) # Get the callback body. content_length = self.headers['content-length'] callback_body = self.rfile.read(int(content_length)) # Construct the string for signature verification. 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 the 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 # Perform subsequent operations based on the callback_body. # Send a 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.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()Aşağıdaki tabloda diğer diller için sunucu tarafı örnek kodları verilmiştir.
Dil
Açıklama
Java
İndirme URL'si: Java
Çalıştırma yöntemi: Paketi unzip edin ve
java -jar oss-callback-server-demo.jar 9000komutunu çalıştırın (9000 bağlantı noktası numarasıdır, değiştirebilirsiniz).
Python
İndirme URL'si: Python
Paketi unzip edin ve
python callback_app_server.pykomutunu çalıştırın. Bu program RSA bağımlılığı gerektirir.
PHP
İndirme URL'si: PHP
Çalıştırmak için: Betiği bir Apache ortamına dağıtın. PHP'de başlık alma işlemi ortama bağlı olabileceğinden örneği değiştirmeniz gerekebilir.
.NET
İndirme URL'si: .NET
Uygulamayı çalıştırmak için paketi açın ve
README.mddosyasına bakın.
Node.js
İndirme URL'si: Node.js
Örneği çalıştırmak için paketi unzip edin ve
node example.jskomutunu çalıştırın.
Ruby
İndirme URL'si: Ruby
Çalıştırmak için:
ruby aliyun_oss_callback_server.rb
Geri arama parametresi
Aşağıdaki tabloda, OSS'e başarıyla yüklenen bir nesneden sonra gönderilen geri arama isteğinin içeriğini ve davranışını yapılandırmak için kullanılan callback parametresinin alanları açıklanmaktadır.
Parametre | Zorunlu | Açıklama |
callbackUrl | Evet | OSS'in nesne yüklendikten sonra bir POST geri arama isteği gönderdiği URL.
|
callbackBody | Evet | Geri arama isteği gövdesinin içeriği. Format,
|
callbackHost | Hayır | Geri arama isteğindeki Host başlığının değeri. Değer bir alan adı veya IP adresi olabilir.
|
callbackSNI | Hayır | Geri arama isteğine Sunucu Adı Göstergesi (SNI) dahil edilip edilmeyeceğini belirtir. HTTPS isteğinde SNI, sunucunun istenen ana bilgisayar adı için doğru sertifikayı sunmasına olanak tanır.
|
callbackBodyType | Hayır | Geri arama isteğinin Content-Type değeri, yani Aşağıdaki türler desteklenir:
|
callbackBody tarafından desteklenen sistem parametreleri
callback parametresinin callbackBody alanı, geri arama isteğinde yüklenen nesne hakkında bilgi iletmek için birden çok sistem parametresine başvurabilir. Aşağıdaki tabloda desteklenen sistem parametreleri açıklanmaktadır.
Parametre | Açıklama |
bucket | Paketin adı. |
object | Nesnenin tam yolu. |
etag | Nesnenin etag değeri; istemciye döndürülen etag değeriyle aynıdır. |
size | Nesnenin boyutu. CompleteMultipartUpload işlemi çağrılırsa |
mimeType | Kaynak türü. Örneğin, bir JPEG görüntüsünün kaynak türü |
imageInfo.height | Görüntünün yüksekliği. Bu değişken yalnızca görüntü dosyaları için kullanılabilir. |
imageInfo.width | Görüntünün genişliği. Bu değişken yalnızca görüntü dosyaları için kullanılabilir. |
imageInfo.format | JPG veya PNG gibi görüntünün formatı. Bu değişken yalnızca görüntü dosyaları için kullanılabilir. |
crc64 | Değer, nesne yüklendikten sonra döndürülen |
contentMd5 | Değer, nesne yüklendikten sonra döndürülen Önemli Bu değişken yalnızca PutObject veya PostObject işlemleri kullanılarak yüklenen nesneler için kullanılabilir. |
vpcId | İsteği gönderen istemcinin VPC kimliği. İstek bir VPC'den kaynaklanmadıysa bu değişken boştur. |
clientIp | İsteği gönderen istemcinin IP adresi. |
reqId | İsteğin kimliği. |
operation | PutObject veya PostObject gibi istenen işlemin adı. |
SDK'lar
Aşağıdaki tabloda istemci tarafı uygulama demolarına bağlantılar verilmiştir.
|
Basit yükleme (PutObject işlemi kullanılarak) |
Parçalı yükleme (CompleteMultipartUpload işlemi kullanılarak) |
İmzalı URL kullanarak yükleme (PutObject işlemi kullanılarak) |
|
|
|
|||
|
|
|
||
|
|
Sorun giderme
Geri arama sürecinde bir hata oluşursa, sorunu gidermek için OSS tarafından döndürülen hata kodunu kullanabilirsiniz. Her hata kodu belirli bir nedene karşılık gelir. Geri aramayla ilgili hata kodları için 07-CALLBACK konusuna bakın.
SSS
Yükleme hatasında geri arama
Hayır. OSS, yalnızca bir nesne başarıyla yüklendikten sonra geri arama tetikler. Yükleme başarısız olursa geri arama gönderilmez ve doğrudan istemciye bir hata mesajı döndürülür.
"Response body is not valid json format" hatası
-
Uygulama sunucusundaki işleme sırasında oluşan bir özel durum, sunucunun geçerli JSON formatında olmayan bir yanıt gövdesi göndermesine neden olur. Aşağıdaki kodda gösterildiği gibi:
# Send a 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)Çözüm:
-
İçeriği doğrulamak için aşağıdaki komutu çalıştırın.
curl -d "<Content>" <CallbackServerURL> -v -
İçeriği incelemek için paket yakalayın.
Windows'ta paket yakalamak için Wireshark kullanmanızı öneririz. Linux'ta paket yakalamak için tcpdump komutunu kullanın.
-
-
Uygulama sunucusunun OSS'e döndürdüğü yanıt gövdesi bir BOM başlığı içeriyor.
Bu hata, PHP tabanlı uygulama sunucularında yaygındır. PHP SDK'sı bir BOM başlığı döndürür; bu da OSS'in aldığı yanıt gövdesinin başına üç ekstra bayt ekler. Bu durum, gövdenin geçerli bir JSON nesnesi olmamasına neden olur. Aşağıdaki paket yakalamada
ef bb bfbaytları BOM başlığını temsil eder.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"}Çözüm: Uygulama sunucunuzun OSS'e döndürdüğü yanıt gövdesinden BOM başlığını kaldırın.