すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:Callback

最終更新日:Nov 06, 2024

アップロードコールバックを設定するには、OSSに送信されるアップロードリクエストに関連するコールバックパラメーターを追加するだけです。 このトピックでは、コールバックを設定する方法について説明します。

使用上の注意

  • コールバックは、次のリージョンでサポートされています。中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (フフホト) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (成都) 、中国 (香港) 、米国 (シリコンバレー) 、米国 (バージニア) 、日本 (東京) 、シンガポール、オーストラリア (シドニー) (サービス終了)、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、ドイツ (フランクフルト) 、英国 (ロンドン) 、アラブ首長国連邦 (ドバイ).

  • PutObjectPostObject、およびCompleteMultipartUpload操作のみがコールバックをサポートしています。

  • コールバックリクエストのデフォルトのタイムアウト時間は5秒です。

  • コールバック要求が失敗した場合、コールバック要求は再試行されません。

ステップ1: コールバックパラメータを作成する

  • コールバックパラメーター

    callbackパラメーターは、JSON形式の複数のフィールドを含むBase64-encoded文字列です。 コールバックパラメーターを作成するには、OSSがコールバックリクエストを送信するサーバーのURL (callbackUrl) と、コールバックリクエストのコンテンツ (callbackBody) を指定する必要があります。

    次の表に、JSON形式のフィールドを示します。

    項目

    必須

    説明

    callbackUrl

    必須

    OSSがコールバック要求を送信するサーバーのURL。

    • オブジェクトをアップロードすると、OSSはPOSTメソッドを使用してコールバック要求をURLに送信します。 リクエストの本文は、callbackBodyフィールドで指定されたコンテンツです。 ほとんどの場合、サーバーはHTTP/1.1 200 OKの応答を返します。 レスポンス本文はJSON形式である必要があり、Content-Lengthレスポンスヘッダーの値は有効で、サイズが3 MB以下である必要があります。

    • コールバックリクエストには、最大5つのURLを指定できます。 URLはセミコロン (;) で区切る必要があります。 OSSは、成功応答が返されるまで、各URLにコールバック要求を送信します。

    • HTTPS URLがサポートされています。

    • 漢字を正しく処理できるようにするには、コールバックURLをエンコードする必要があります。 たとえば、http://example.com/中文.php?key=value&中文名=中文http://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 にエンコードする必要があります。

    callbackHost

    選択可能

    コールバック要求のHostヘッダーの値。 値はドメイン名またはIPアドレスである必要があります。

    • このフィールドは、callbackUrlフィールドを設定した場合にのみ有効です。

    • callbackHostフィールドを設定しない場合、ホスト値はcallbackUrlフィールドのURLから解決され、callbackHostフィールドの値として指定されます。

    callbackBody

    必須

    コールバック要求の本文。 例: key =${ object}&etag =${ etag}&my_var =${ x:my_var}

    callbackBodyフィールドは、OSSシステムパラメーター、カスタムパラメーター、および定数をサポートします。

    • PutObjectおよびCompleteMultipart操作では、カスタムパラメーターはcallback-varパラメーターを介して渡されます。

    • PostObject操作では、パラメーターはフォームフィールドを使用して渡されます。

    callbackSNI

    選択可能

    コールバック要求がクライアントから開始されたときに、OSSがcallbackUrlで指定されたオリジンアドレスにServer Name Indication (SNI) を送信するかどうかを指定します。 OSSがSNIを送信するかどうかは、サーバーの構成とリージョンの要件によって異なります。 SNIは、同じIPアドレスを使用して複数のTLS/SSL証明書をホストするサーバーに推奨されます。 有効な値:

    • true

    • false (デフォルト)

      説明

      コールバック要求がUK (ロンドン) リージョンで開始されると、callbackSNI値に関係なくSNIが送信されます。 コールバック要求がUK (ロンドン) リージョン以外のリージョンで開始された場合、SNIが送信されるかどうかはcallbackSNIフィールドの値によって異なります。

    callbackBodyType

    選択可能

    コールバック要求のコンテンツタイプ。 有効な値:

    • application/x-www-form-urlencoded (デフォルト)

      callbackBodyTypeフィールドをapplication/x-www-form-urlencodedに設定した場合、callbackBodyフィールドのパラメーターはURLエンコードされた値に置き換えられます。

    • application/json

      callbackBodyTypeフィールドをapplication/jsonに設定すると、callbackBodyフィールドのパラメーターはJSON形式の値に置き換えられます。

    JSONフィールドの例

    • 例1 (必須フィールドとオプションフィールドを含む)

      {
      "callbackUrl":"172.16.XX.XX/test.php",
      "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
      "callbackBody":"{\"mimeType\":${mimeType},\"size\":${size}}",
      "callbackBodyType":"application/json",
      "callbackSNI":false
      }
    • 例2 (必須フィールドのみを含む)

      {
      "callbackUrl":"172.16.XX.XX:23456/index.html",
      "callbackBody":"bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&x:my_var=${x:my_var}"
      }

    callbackBodyフィールドのシステムパラメーターを設定できます。 下表に、各パラメーターを説明します。

    システムパラメーター

    説明

    バケット

    バケットの名前です。

    object

    オブジェクトのフルパス。The full path of the object.

    etag

    オブジェクトのETagフィールド。 ETagはリクエスタに戻される。

    size

    オブジェクトのサイズ。 サイズは、CompleteMultipartUpload操作を呼び出したときのオブジェクト全体のサイズです。

    mimeType

    リソースタイプです。 たとえば、JPEG 画像のリソースタイプは、image/jpeg です。

    imageInfo.height

    画像の高さ。 このパラメータは、画像オブジェクトにのみ適用されます。 他のオブジェクトの場合、このパラメータは空のままです。

    imageInfo.width

    イメージの幅。 このパラメータは、画像オブジェクトにのみ適用されます。 他のオブジェクトの場合、このパラメータは空のままです。

    imageInfo.format

    イメージの形式。 例: JPGとPNG。 このパラメータは、画像オブジェクトにのみ適用されます。 他のオブジェクトの場合、このパラメータは空のままです。

    crc64

    CRC64値。 このパラメーターの値は、オブジェクトがアップロードされた後に返されるx-oss-hash-crc64ecmaヘッダーの値と同じです。

    contentMd5

    MD5値。 このパラメーターの値は、オブジェクトがアップロードされた後に返されるContent-MD5ヘッダーの値と同じです。

    重要

    このパラメーターは、PutObjectまたはPostObject操作を呼び出してオブジェクトをアップロードする場合にのみ必要です。

    vpcId

    リクエストを開始したクライアントが存在する仮想プライベートクラウド (VPC) のID。 リクエストがVPC経由で開始されない場合、このパラメーターは空のままになります。

    clientIp

    リクエストを開始したクライアントのIPアドレス。

    reqId

    開始されたリクエストのID。

    operation

    PutObjectやPostObjectなど、リクエストの開始に使用されるAPI操作。

  • カスタマイズパラメーター

    callback-var パラメーターを使用してカスタムパラメーターを設定できます。 カスタムパラメーターは、my_var =${ x:my_var} などのキーと値のペアです。 POSTコールバック要求が開始されると、OSSは前の表のカスタムパラメーターとシステムパラメーターをPOST要求の本文に追加します。 このように、要求者はこれらのパラメータを得ることができる。

    カスタムパラメーターは、コールバックパラメーターの作成と同じ方法で作成できます。 カスタムパラメーターはJSON形式で指定する必要があります。 JSON文字列は、すべてのカスタムパラメーターのキーと値のペアで構成されます。

    重要

    カスタムパラメーターのキーはx: で始まり、小文字である必要があります。 そうしないと、HTTPステータスコード200が返されるかどうかにかかわらず、システムはカスタムパラメーターに有効な値を割り当てることができません。

手順2: コールバック要求の設定

OSSが送信するリクエストにcallbackパラメーターとcallback-varパラメーターを追加するには、Base64を使用して前の手順で作成したJSON文字列をエンコードし、次のいずれかの方法を使用してリクエストにパラメーターを追加する必要があります。

  • callback (x-oss-callback) パラメーターを作成します。

    1. パラメーターの作成に使用するフィールドを指定します。

      {
          "callbackUrl": "http://xxx.xxx.22.143/test",
          "callbackHost": "your.callback.com",
          "callbackBody": "bucket=${bucket}&object=${object}&my_var=${x:my_var}",
          "callbackBodyType": "application/x-www-form-urlencoded",
          "callbackSNI": false
      }
    2. Base64で前述のフィールドをエンコードします。

      ewogICAg****bGxiYWNrVXJsIjogImh0dHA6Ly94eHgueHh4LjIyLjE0My90ZXN0IiwKICAgICJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLAogICAgImNhbGxiYWNrQm9keSI6ICJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mbXlfdmFyPSR7eDpteV92YXJ9IiwKICAgICJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAiY2FsbGJhY2tTTkkiOiBmYWxzZQp9
  • callback-var (x-oss-callback-var) パラメーターを作成します。

    1. パラメーターの作成に使用するフィールドを指定します。

      {"x:my_var": "var"}
    2. 前のフィールドをBase64でエンコードします。

      eyJ4Om15X3ZhciI6ICJ2YX****==

URLにパラメーターを追加する

URLにパラメーターを追加する場合、callbackパラメーターは必須で、callback-varパラメーターはオプションです。 リクエストにcallbackまたはcallback-varパラメーターが含まれている場合、署名を計算するときにCanonicalizedResourceのサブリソースとしてcallbackまたはcallback-varパラメーターを使用する必要があります。 詳細については、「CanonicalizedResourceの作成」をご参照ください。

PUT /your_object?OSSAccessKeyId=LTAI5t7h6SgiLSga****&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv****&Expires=1682484377&callback-var=eyJ4Om15X3ZhciI6ICJ2YX****==&callback=bGxiYWNrVXJsIjogImh0dHA6Ly94eHgueHh4LjIyLjE0My90ZXN0IiwKICAgICJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLAogICAgImNhbGxiYWNrQm9keSI6ICJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mbXlfdmFyPSR7eDpteV92YXJ9IiwKICAgICJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAiY2FsbGJhY2tTTkkiOiBmYWxzZQp9 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

パラメーターをヘッダーとしてリクエストに追加します。

x-oss-callbackまたはx-oss-callback-varヘッダーをリクエストに追加します。 署名を計算するために、x-oss-callback-varおよびx-oss-callbackヘッダーがCanonicalizedOSSHeadersに含まれています。

例:

PUT /your_object HTTP/1.1
Host: callback-test.oss-test.aliyun-inc.com
Accept-Encoding: identity
Content-Length: 5
x-oss-callback-var: eyJ4Om15X3ZhciI6ICJ2YX****==
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: ewogICAg****bGxiYWNrVXJsIjogImh0dHA6Ly94eHgueHh4LjIyLjE0My90ZXN0IiwKICAgICJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLAogICAgImNhbGxiYWNrQm9keSI6ICJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mbXlfdmFyPSR7eDpteV92YXJ9IiwKICAgICJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAiY2FsbGJhY2tTTkkiOiBmYWxzZQp9
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リクエストの本文のフォームフィールドにパラメーターを追加します。

PostObject操作を呼び出してオブジェクトをアップロードするときに、このメソッドのみを使用してコールバックパラメーターを設定できます。

  • POSTメソッドを使用してオブジェクトをアップロードするときにコールバックパラメーターを追加する場合は、別のフォームフィールドを使用してコールバックパラメーターを追加します。 例:

    --9431149156168
    Content-Disposition: form-data; name="callback"
    eyJjYWxsYmFja1VybCI6IjEwLj****4xN
  • callback-varパラメーターをPOSTリクエストに追加する場合、パラメーター全体を直接追加することはできません。 代わりに、個別のフォームフィールドを使用して各カスタムパラメータを追加する必要があります。 例:

    {
    "x:var1":"value1",
    "x:var2":"value2"
    }

    次のコンテンツは、前述のカスタムパラメーターを追加する方法の例を示しています。

    --9431149156168
    Content-Disposition: form-data; name="callback"
    eyJjYWxsYmFja1VybCI6IjEwLj****4xN
    --9431149156168
    Content-Disposition: form-data; name="x:var1"
    value1
    --9431149156168
    Content-Disposition: form-data; name="x:var2"
    value2

    ポリシーにコールバック条件を追加できます。 ポリシーにコールバック条件を追加しない場合、アップロードのコールバックパラメーターは検証されません。 例:

    { "expiration": "2021-12-01T12:00:00.000Z",
      "conditions": [
        {"bucket": "johnsmith" },
        {"callback": "eyJjYWxsYmFja1V****4My"},
        ["starts-with", "$key", "user/eric/"],
      ]
    }

ステップ3: コールバック要求を開始する

オブジェクトのアップロードが成功すると、OSSはPOSTメソッドを使用して、リクエスト内のcallbackパラメーターとcallback-varパラメーターに指定したコンテンツをアプリケーションサーバーに送信します。 例:

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&my_var=var

(オプション) ステップ4: コールバック要求に署名する

リクエストにコールバックパラメーターを設定すると、OSSはPOSTメソッドを使用して、指定されたコールバックURLに基づいてコールバックリクエストをアプリケーションサーバーに送信します。 アプリケーションサーバーによって受信されたコールバック要求がOSSによって開始されたかどうかを確認するには、コールバック要求に署名します。

説明

署名検証はオプションです。 ビジネス要件に基づいて署名検証を実行するかどうかを指定できます。

ステップ1: 署名を生成する

  • 署名生成アルゴリズム

    OSSはRSA暗号化アルゴリズムを使用して署名を計算します。

    authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))
    説明

    上記のコードでは、private_keyは秘密鍵、pathはコールバック要求に含まれるリソースパス、query_stringはクエリ文字列、bodyはコールバック要求のメッセージ本文を指定します。

  • 署名の生成方法

    1. 署名する文字列を作成します。 文字列は、URL、元のクエリ文字列、キャリッジリターン、およびコールバックメッセージ本文をデコードして取得したリソースパスで構成されます。

    2. RSA暗号化アルゴリズムと秘密鍵を使用して、作成した文字列に署名します。 署名を計算するために使用されるハッシュ関数はMD5である。

    3. Base64を使用して署名された結果をエンコードし、最終署名を取得します。 次に、コールバック要求のAuthorizationヘッダーに署名を追加します。

  • 例:

    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

    上記のコードでは、最終的な署名はkKQeGTRccDKyHB3H9vF + xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t **** です。 署名はから生成されます。/index.phpパス、? id=1&index=2クエリ文字列、およびbucket=examplebucketボディ。

ステップ2: 署名を確認する

  • 署名検証方法

    次のサンプルコードは、アプリケーションサーバーを使用して署名を検証する方法の例を示しています。

    Result = rsa_verify(public_key, md5(url_decode(path) + query_string + '\n' + body), base64_decode(authorization))

    public_keyは公開キーを指定し、承認はコールバック要求ヘッダーに含める署名を指定します。

  • 署名検証プロセス

    1. コールバック要求のx-oss-pub-key-urlヘッダーには、公開鍵のBase64-encoded URLが格納されます。 公開鍵を取得するには、Base64-encoded URLをデコードする必要があります。

      public_key = urlopen(base64_decode(x-oss-pub-key-url header value))

      たとえば、Base64でaHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ== をデコードして公開鍵のURLを取得します。 デコードされた URL は http://gosspublic.alicdn.com/callback_pub_key_v1.pem です。

      説明

      ossが発行するpublic_keyフィールドのx-OSS-pub-key-urlヘッダーの値は、http://gosspublic.alicdn.com/ または https://gosspublic.alicdn.com/ で始まる必要があります。 公開鍵のアドレスは変更されないため、ネットワーク障害やサーバー関連のエラーによる例外を回避するため、OSS公開鍵のアドレスに基づいて公開鍵コンテンツをキャッシュすることを推奨します。

    2. 署名のBase64-decoded形式を取得します。

      signature = base64_decode(authorization header value)
    3. コールバック要求が署名された後に文字列を取得するのと同じ手順を実行して、署名する文字列を取得します。

      sign_str = url_decode(path) + query_string + '\n' + body
    4. 署名を検証します。

      result = rsa_verify(public_key, md5(sign_str), signature)
  • 例:

    次のPythonコードは、アプリケーションサーバーが署名を検証する方法の例を示しています。 サンプルコードを実行するには、M2Cryptoライブラリが必要です。

    import httplib
    import base64
    import md5
    import urllib2
    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    from M2Crypto import RSA
    from M2Crypto import BIO
    def get_local_ip():
        try:
            csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            csock.connect(('8.8.8.8', 80))
            (addr, port) = csock.getsockname()
            csock.close()
            return addr
        except socket.error:
            return ""
    class MyHTTPRequestHandler(BaseHTTPRequestHandler):
        '''
        def log_message(self, format, *args):
            return
        '''
        def do_POST(self):
            #get public key
            pub_key_url = ''
            try:
                pub_key_url_base64 = self.headers['x-oss-pub-key-url']
                pub_key_url = pub_key_url_base64.decode('base64')
                if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"):
                    self.send_response(400)
                    self.end_headers()
                    return
                url_reader = urllib2.urlopen(pub_key_url)
                #you can cache it,recommend caching public key content based on the public key address
                pub_key = url_reader.read() 
            except:
                print 'pub_key_url : ' + pub_key_url
                print 'Get pub key failed!'
                self.send_response(400)
                self.end_headers()
                return
            #get authorization
            authorization_base64 = self.headers['authorization']
            authorization = authorization_base64.decode('base64')
            #get callback body
            content_length = self.headers['content-length']
            callback_body = self.rfile.read(int(content_length))
            #compose authorization string
            auth_str = ''
            pos = self.path.find('?')
            if -1 == pos:
                auth_str = urllib2.unquote(self.path) + '\n' + callback_body
            else:
                auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body
            print auth_str
            #verify authorization
            auth_md5 = md5.new(auth_str).digest()
            bio = BIO.MemoryBuffer(pub_key)
            rsa_pub = RSA.load_pub_key_bio(bio)
            try:
                result = rsa_pub.verify(auth_md5, authorization, 'md5')
            except:
                result = False
            if not result:
                print 'Authorization verify failed!'
                print 'Public key : %s' % (pub_key)
                print 'Auth string : %s' % (auth_str)
                self.send_response(400)
                self.end_headers()
                return
            #do something according to callback_body
            #response to OSS
            resp_body = '{"Status":"OK"}'
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Content-Length', str(len(resp_body)))
            self.end_headers()
            self.wfile.write(resp_body)
    class MyHTTPServer(HTTPServer):
        def __init__(self, host, port):
            HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler)
    if '__main__' == __name__:
        server_ip = get_local_ip()
    server_port = 23451
    server = MyHTTPServer(server_ip, server_port)
    server.serve_forever()

    次の表に、他のプログラミング言語でサーバー上の署名を検証するために使用できるコードを示します。

    SDKプログラミング言語

    説明

    Java

    • ダウンロードリンク: Javaコードサンプル

    • 実行方法: パッケージを解凍し、java -jar oss-callback-server-demo.jar 9000を実行します。 ポート番号9000を別のポート番号に置き換えることができます。

    Python

    • ダウンロードリンク: Pythonコードサンプル

    • 実行方法: パッケージを解凍し、python callback_app_server.pyを実行します。 コードサンプルを実行するには、RSA依存関係が必要です。

    Go

    • ダウンロードリンク: Go sample code sample

    • 実行方法: パッケージを解凍し、README.mdの指示に従います。

    PHP

    • ダウンロードリンク: PHPコードサンプル

    • 実行方法: コードをApache環境にデプロイして、コード内の特定のヘッダーが依存関係として環境を使用できるようにします。 環境に基づいてサンプルコードを変更できます。

    .NET

    Node.js

    Ruby

    • ダウンロードリンク: Ruby code sample

    • 実行方法:ruby aliyun_oss_callback_server.rb を実行します。

ステップ5: コールバック結果を返す

アプリケーションサーバーはOSSに応答を返します。 次の例は、コールバック要求に対して返される応答を示しています。

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
{"a":"b"}
説明

アプリケーションサーバーからOSSに返されるレスポンスには、Content-Lengthヘッダーが含まれている必要があります。 レスポンスボディのサイズは1 MBを超えることはできません。

ステップ6: アップロード結果を返す

OSSは、アプリケーションサーバーによって返された情報を要求元に返します。

返されたレスポンスの例を次に示します。

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
{"a":"b"}
重要

CompleteMultipartUploadリクエストのレスポンスボディには、XML形式のデータなどのコンテンツが含まれています。 アップロードコールバック機能を使用すると、{"a":"b"} などの元の本文コンテンツが上書きされます。

エラーコード

エラーコード

HTTPステータスコード

説明

InvalidArgument

400

callbackまたはcallback-varパラメーターの値は、次のいずれかの理由で無効です。

  • PutObjectおよびCompleteMultipartUpload操作で、callback (x-oss-callback) またはcallback-varパラメーター (x-oss-callback-var) にURLとヘッダーを指定しました。

  • callbackまたはcallback-varパラメーターの長さが5 KBを超えています。

  • callbackまたはcallback-varパラメーターがBase64-encodedされていないか、パラメーターのデコード後にパラメーターがJSON形式ではありません。

  • callbackパラメーターからデコードしたcallbackUrlフィールドには5つ以上のURLが含まれているか、URLのポートが無効です。 例:

    {"callbackUrl":"172.16.XX.XX:test",
        "callbackBody":"test"}
  • callbackパラメーターからデコードしたcallbackBodyフィールドは空です。

  • callbackパラメーターからデコードしたcallbackBodyTypeフィールドの値は、application/x-www-form-urlencodedまたはapplication/jsonではありません。

  • callbackパラメーターからデコードしたcallbackBodyフィールドのパラメーターは、${var} 形式ではありません。

  • callback-varパラメーターからデコードしたパラメーターは、{"x:var1":"value1","x:var2":"value2"...} のJSON形式ではありません。

CallbackFailed

203

オブジェクトはOSSにアップロードされますが、コールバックは失敗します。 コールバックの失敗は、OSSが期待されるコールバック応答を受信しないことを示し、アプリケーションサーバーがコールバック要求を受信しないことを示しません。 たとえば、アプリケーションサーバーから返される応答がJSON形式でない場合、コールバックの失敗が発生します。

よくある質問

オブジェクトのアップロードに失敗した場合、OSSはアプリケーションサーバーにコールバック要求を送信しますか。

オブジェクトのアップロードに失敗した場合、OSSはアプリケーションサーバーにコールバック要求を送信しません。 OSSは、オブジェクトがアップロードされた場合にのみ、コールバック要求をアプリケーションサーバーに送信します。 オブジェクトのアップロードに失敗した場合、OSSはコールバック要求をアプリケーションサーバーに送信せず、エラーメッセージを返します。

"Response body is not valid json format" エラーメッセージが返された場合はどうすればよいですか?

  • リクエストの処理中にアプリケーションサーバーが例外をスローしたため、エラーメッセージが返されます。 この場合、OSSに返されるレスポンス本文はJSON形式ではありません。 次の図は、このエラーが発生したときにOSSに返されるレスポンスを示しています。callback

    解決策:

    • 次のコマンドを実行してコンテンツを確認します。

      curl -d "<Content>" <CallbackServerURL> -v
    • パケットをキャプチャしてコンテンツを確認します。

      WindowsでWiresharkツールを使用するか、Linuxでtcpdumpコマンドを実行してパケットをキャプチャすることを推奨します。

  • アプリケーションサーバーからOSSに返されるレスポンスの本文には、BOMヘッダーが含まれています。

    このエラーは、OSS SDK for PHPを使用して作成されたアプリケーションサーバーでよく発生します。 OSS SDK for PHPはBOMヘッダーを返します。 その結果、OSSは、JSON形式ではないレスポンス本文でさらに3バイトを受け取ります。 次の図は、ef、bb、bfバイトがレスポンスボディの追加バイトであることを示しています。

    callback1

    解決策: アプリケーションサーバーからOSSに返されるレスポンス本文からBOMヘッダーを削除します。