Tüm Ürünler
Search
Belge Merkezi

Object Storage Service:callback

Son Güncelleme:Oct 01, 2026

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:

  1. İ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 callback parametresini dahil etmelidir. Özel değişkenleri iletmek için isteğe bağlı callback-var parametresini de ekleyebilirsiniz.

  2. 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.

  3. 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.

  4. 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.

  1. 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.

    1. 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 olarak http://oss-demo.aliyuncs.com:23450 kullanı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.

    2. 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.

  2. callback-var parametresini oluşturun (İsteğe bağlı)

    Önemli

    callback-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-var parametresi, callbackBody parametresiyle birlikte kullanılmalıdır. Önceki örnekteki özel değişkenlere (uid ve order_id) callbackBody iç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, callbackBodyType parametresi application/x-www-form-urlencoded olarak ayarlanmışsa OSS aşağıdaki içeriği gönderir:

    uid=12345&order=67890
  3. callback ve callback-var parametrelerini Base64 ile kodlayın.

    • Örnek: callback parametresi kodlaması

      Orijinal callback parametresi:

      {
          "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-var parametresi:

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

      Base64 kodlamasından sonraki sonuç:

      eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
  4. 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-callback ve x-oss-callback-var HTTP başlık alanlarını ayarlayarak geri arama parametrelerini iletebilirsiniz.

    • x-oss-callback: Base64 ile kodlanmış callback parametresi.

    • x-oss-callback-var (İsteğe bağlı): Base64 ile kodlanmış callback-var parametresi.

    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****************
    Test

    POST 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-var alanında birleştiremezsiniz.

      Örneğin, uid ve order_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ı): policy içinde callback parametresi 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 callback parametresini dahil etmeniz gerekir. callback-var parametresi 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:

  1. 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
  2. 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.

  3. 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 OK döndürmelidir.

    • Yanıt başlığı Content-Length iç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/xml ekleyin.

    Ö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"}
    Önemli

    Bir CompleteMultipartUpload isteğ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.

  1. 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 authorization alanı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))
      Not

      Bu formülde private_key özel anahtar, path geri arama isteğinin kaynak yolu, query_string sorgu dizesi ve body geri aramanın mesaj gövdesidir.

    • İmza oluşturma adımları:

      1. İ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.

      2. RSA imzasını oluşturun: İmzalanacak dizeyi imzalamak için özel anahtarı kullanın. İmzalama için kullanılan hash fonksiyonu MD5'tir.

      3. Sonucu Base64 ile kodlayarak nihai imzayı elde edin ve bunu geri arama isteğinin authorization baş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=examplebucket

      Yol /index.php, query_string ?id=1&index=2, gövde bucket=examplebucket ve elde edilen imza kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** şeklindedir.

  2. 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:

    1. Genel anahtarı edinin:

      İstek başlığındaki x-oss-pub-key-url alanı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.pem
      Not

      Genel anahtar URL'si http://gosspublic.alicdn.com/ veya https://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.

    2. İmzayı decode edin.

      İstek başlığının authorization alanından imzayı alın ve Base64 ile decode edin.

      signature = base64_decode(value of the authorization header)
    3. 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
    4. İ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)
  3. İ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 9000 komutunu ç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.py komutunu ç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.md dosyasına bakın.

    Node.js

    • İndirme URL'si: Node.js

    • Örneği çalıştırmak için paketi unzip edin ve node example.js komutunu ç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.

  • Noktalı virgül (;) ile ayrılmış en fazla beş URL belirtebilirsiniz. OSS, ilk başarılı geri arama yanıtı alınıncaya kadar URL'lere sırayla istek gönderir.

  • HTTPS URL'leri desteklenir.

  • IPv6 adreslerini veya IPv6 adreslerine çözümlenen alan adlarını belirtemezsiniz.

  • Çince gibi karakterlerin doğru işlenmesini sağlamak için callbackUrl URL-encoded olmalıdır. Örneğin, https://example.com/中文.php?key=value&中文名称=中文值 adresi https://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BC şeklinde kodlanmalıdır.

callbackBody

Evet

Geri arama isteği gövdesinin içeriği. Format, callbackBodyType parametresiyle tutarlı olmalıdır.

  • callbackType varsayılan değer olan application/x-www-form-urlencoded olduğunda, callbackBody anahtar-değer çifti formatında olmalıdır. Örneğin: bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • callbackType application/json olduğunda, callbackBody JSON formatında olmalıdır. Örneğin: {\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

callbackBody OSS sistem parametrelerine, özel değişkenlere ve sabitlere başvurabilir. Sistem parametreleri hakkında daha fazla bilgi için callbackBody tarafından desteklenen sistem parametreleri konusuna bakın.

callbackHost

Hayır

Geri arama isteğindeki Host başlığının değeri. Değer bir alan adı veya IP adresi olabilir.

  • callbackHost yapılandırmazsanız, OSS callbackUrl adresini ayrıştırır ve çıkarılan host değerini callbackHost değeri olarak kullanır.

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.

callbackUrl HTTPS kullanıyorsa bu parametreyi etkinleştirmenizi öneririz. Aksi takdirde, sertifika uyumsuzluğu nedeniyle geri arama başarısız olabilir ve 502 callback failed gibi bir hata oluşabilir. Geçerli değerler:

  • true: SNI gönderir.

  • false (varsayılan): SNI göndermez.

    Not

    Birleşik Krallık (Londra) bölgesinde, bu parametrenin ayarından bağımsız olarak her zaman SNI gönderilir.

callbackBodyType

Hayır

Geri arama isteğinin Content-Type değeri, yani callbackBody veri formatı.

Aşağıdaki türler desteklenir:

  • application/x-www-form-urlencoded (varsayılan)

    callbackBody içindeki değişkenleri URL-encoded değerleriyle değiştirir.

  • application/json

    callbackBody içindeki değişkenleri JSON format kurallarına göre değiştirir.

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 size tüm nesnenin boyutunu temsil eder.

mimeType

Kaynak türü. Örneğin, bir JPEG görüntüsünün kaynak türü image/jpeg şeklindedir.

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 x-oss-hash-crc64ecma başlık değerinin aynısıdır.

contentMd5

Değer, nesne yüklendikten sonra döndürülen Content-MD5 başlık değerinin aynısıdır.

Ö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)


Java


demo


demo


demo


Python V2


demo


-


demo


Go V2


demo


demo


demo

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 bf baytları 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.