アップロードコールバックを設定するには、OSSに送信されるアップロードリクエストに関連するコールバックパラメーターを追加するだけです。 このトピックでは、コールバックを設定する方法について説明します。
使用上の注意
コールバックは、次のリージョンでサポートされています。中国 (杭州) 、中国 (上海) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (フフホト) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (成都) 、中国 (香港) 、米国 (シリコンバレー) 、米国 (バージニア) 、日本 (東京) 、シンガポール、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、ドイツ (フランクフルト) 、イギリス (ロンドン) 、アラブ首長国連邦 (ドバイ).
PutObject、PostObject、および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がサポートされています。
IPv6アドレスとIPv6アドレスにマップされたドメイン名はサポートされていません。
漢字を正しく処理できるようにするには、コールバックURLをエンコードする必要があります。 たとえば、
https://example.com/中文.php?key=value&中文名=中文
を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
にエンコードする必要があります。
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) パラメーターを作成します。
パラメーターの作成に使用するフィールドを指定します。
{ "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 }
Base64で前述のフィールドをエンコードします。
ewogICAg****bGxiYWNrVXJsIjogImh0dHA6Ly94eHgueHh4LjIyLjE0My90ZXN0IiwKICAgICJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLAogICAgImNhbGxiYWNrQm9keSI6ICJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mbXlfdmFyPSR7eDpteV92YXJ9IiwKICAgICJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAiY2FsbGJhY2tTTkkiOiBmYWxzZQp9
callback-var (x-oss-callback-var) パラメーターを作成します。
パラメーターの作成に使用するフィールドを指定します。
{"x:my_var": "var"}
前のフィールドを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はコールバック要求のメッセージ本文を指定します。
署名の生成方法
署名する文字列を作成します。 文字列は、URL、元のクエリ文字列、キャリッジリターン、およびコールバックメッセージ本文をデコードして取得したリソースパスで構成されます。
RSA暗号化アルゴリズムと秘密鍵を使用して、作成した文字列に署名します。 署名を計算するために使用されるハッシュ関数はMD5である。
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は公開キーを指定し、承認はコールバック要求ヘッダーに含める署名を指定します。
署名検証プロセス
コールバック要求の
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公開鍵のアドレスに基づいて公開鍵コンテンツをキャッシュすることを推奨します。署名のBase64-decoded形式を取得します。
signature = base64_decode(authorization header value)
コールバック要求が署名された後に文字列を取得するのと同じ手順を実行して、署名する文字列を取得します。
sign_str = url_decode(path) + query_string + '\n' + body
署名を検証します。
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
ダウンロードリンク:. NETコードのサンプル
実行方法: パッケージを解凍し、
README.md
の指示に従います。
Node.js
ダウンロードリンク: Node.jsコードサンプル
実行方法: パッケージを解凍し、
node example.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
リクエストのレスポンスボディには、JSON形式のデータなどのコンテンツが含まれています。 アップロードコールバック機能を使用すると、{"a":"b"}
などの元の本文コンテンツが上書きされます。
よくある質問
オブジェクトのアップロードに失敗した場合、OSSはアプリケーションサーバーにコールバック要求を送信しますか。
オブジェクトのアップロードに失敗した場合、OSSはアプリケーションサーバーにコールバック要求を送信しません。 OSSは、オブジェクトがアップロードされた場合にのみ、コールバック要求をアプリケーションサーバーに送信します。 オブジェクトのアップロードに失敗した場合、OSSはコールバック要求をアプリケーションサーバーに送信せず、エラーメッセージを返します。
"Response body is not valid json format" エラーメッセージが返された場合はどうすればよいですか?
リクエストの処理中にアプリケーションサーバーが例外をスローしたため、エラーメッセージが返されます。 この場合、OSSに返されるレスポンス本文はJSON形式ではありません。 次の図は、このエラーが発生したときにOSSに返されるレスポンスを示しています。
解決策:
次のコマンドを実行してコンテンツを確認します。
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バイトがレスポンスボディの追加バイトであることを示しています。
解決策: アプリケーションサーバーからOSSに返されるレスポンス本文からBOMヘッダーを削除します。
エラーコード
コールバックプロセスでエラーが発生すると、OSSはエラーコード (EC) を含むエラーメッセージを返します。 各エラーコードは、エラーの特定の理由に対応する。 コールバックプロセスで返されるエラーコードの詳細については、「07-Callback」をご参照ください。