Los callbacks de carga de OSS notifican automáticamente a su servidor de aplicaciones cuando un objeto se carga correctamente. Esto permite ejecutar procesos posteriores.
Límites
-
Disponibilidad por región
The callback feature is supported in the following regions: China (Hangzhou), China (Shanghai), China (Qingdao), China (Beijing), China (Zhangjiakou), China (Hohhot), China (Ulanqab), China (Shenzhen), China (Heyuan), China (Guangzhou), China (Chengdu), China (Hong Kong), US (Silicon Valley), US (Virginia), Japan (Tokyo), Singapore, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Philippines (Manila), Germany (Frankfurt), UK (London), and UAE (Dubai).
-
Comportamiento del callback
Una solicitud de callback debe recibir una respuesta en un máximo de 5 segundos. De lo contrario, el callback falla.
Un callback con errores no afecta la carga correcta del objeto.
OSS no reintenta automáticamente los callbacks que fallan.
-
Operaciones compatibles
Puede configurar callbacks para las operaciones PutObject, PostObject y CompleteMultipartUpload. El administrador de carga de archivos y las URL prefirmadas de los SDK V2 también admiten callbacks, ya que se basan en estas operaciones básicas.
Funcionamiento
El proceso de callback de OSS incluye los siguientes pasos:
-
El cliente carga un objeto con parámetros de callback
Al cargar un objeto, el cliente debe incluir el parámetro
callbackpara especificar la URL del servidor de aplicaciones y el contenido de la solicitud de callback. Para pasar variables personalizadas, también puede incluir el parámetro opcionalcallback-var. -
OSS almacena el objeto y envía una solicitud de callback
Una vez que el objeto se carga correctamente, OSS envía una solicitud POST a la URL de callback especificada. La solicitud incluye información del objeto, como el bucket, el objeto, el tamaño y el etag, además de cualquier parámetro personalizado.
-
El servidor de aplicaciones procesa el callback y envía una respuesta
Después de recibir la solicitud de callback, el servidor de aplicaciones la procesa. De manera opcional, comprueba la firma de la solicitud por motivos de seguridad y devuelve una respuesta JSON en menos de 5 segundos. Un código de estado HTTP 200 indica que la operación se completó correctamente. Cualquier otro código de estado indica que falló.
-
OSS devuelve el resultado de la carga
Cuando OSS recibe una respuesta correcta del servidor de aplicaciones, reenvía dicha respuesta al cliente como resultado final de la carga.
Implementación
La depuración de un callback de carga consta de dos partes: la carga desde el cliente y el procesamiento del callback en el servidor. Depure primero la implementación del cliente y después la del servidor de aplicaciones. Cuando ambas partes funcionen de forma independiente, ejecute una prueba integral de extremo a extremo.
Implementación del lado del cliente
Para agilizar la implementación, consulte el código de ejemplo disponible en SDKs .
Para activar un callback automático de OSS tras la carga de un objeto, incluya el parámetro callback y el parámetro opcional callback-var en su solicitud de carga.
-
Construya el parámetro
callback.Este parámetro define la URL del servidor de aplicaciones y el formato del cuerpo de la solicitud. Debe estructurarse como un objeto JSON y codificarse en Base64.
-
Ejemplo de configuración mínima:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }En este ejemplo:
callbackUrl: la dirección del servidor de aplicaciones. Establezca este parámetro con la dirección real. Este documento usahttp://oss-demo.aliyuncs.com:23450como ejemplo.callbackBody: el contenido del cuerpo de la solicitud de callback. Puede usar marcadores de posición para incluir información de carga de forma dinámica. Por ejemplo, use${bucket}para el nombre del bucket,${object}para la ruta completa del archivo y${x:xxx}para hacer referencia a variables personalizadas. OSS reemplaza estos marcadores de posición con los valores reales durante el callback. Para obtener más información sobre los parámetros de sistema compatibles, consulte System parameters supported by callbackBody.
-
Ejemplo de configuración avanzada:
{ "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 }Para obtener más información sobre los campos, consulte Callback parameter.
-
-
Construya el parámetro
callback-var(opcional)ImportanteEl parámetro callback-var debe estar en formato JSON. La clave de cada parámetro personalizado debe comenzar con x: y contener únicamente letras minúsculas; por ejemplo,
x:uid.Utilice este parámetro para enviar información comercial personalizada a su servidor de aplicaciones, como un identificador de usuario o un número de pedido. Ejemplo:
{ "x:uid": "12345", "x:order_id": "67890" }El parámetro
callback-vardebe usarse junto con el parámetrocallbackBody. Para las variables personalizadas del ejemplo anterior (uidyorder_id), haga referencia a ellas encallbackBodymediante el marcador de posición${x:xxx}. Ejemplo:{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }Cuando se activa el callback, OSS envía el siguiente contenido. En este caso se asume que
callbackBodyTypeestá establecido enapplication/x-www-form-urlencoded:uid=12345&order=67890 -
Codifique en Base64 los parámetros
callbackycallback-var.-
Ejemplo: codificación del parámetro
callback****Parámetro
callbackoriginal:{ "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 }Resultado tras la codificación en Base64:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 -
Ejemplo: codificación del parámetro
callback-var****Parámetro
callback-varoriginal:{ "x:uid": "12345", "x:order_id": "67890" }Resultado tras la codificación en Base64:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
-
-
Agregue los parámetros codificados a la solicitud.
Una vez codificados los parámetros, puede enviarlos a OSS de cualquiera de las siguientes maneras.
Header (Recommended)
Este método es adecuado para cargas desde un SDK o código de backend. Ofrece un alto nivel de seguridad y es el método recomendado. Puede pasar los parámetros de callback si establece los campos de encabezado HTTP
x-oss-callbackyx-oss-callback-var.x-oss-callback: el parámetrocallbackcodificado en Base64.x-oss-callback-var(opcional): el parámetrocallback-varcodificado en Base64.
Nota: Al calcular la firma de la solicitud, estos dos parámetros deben incluirse en los encabezados canónicos para garantizar que la solicitud sea válida.
Ejemplo: pasar parámetros de callback en el encabezado
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
Este método solo aplica para cargas mediante PostObject. Los parámetros de callback deben pasarse como campos de formulario en el cuerpo de la solicitud POST.
-
Parámetro
callback: pase este parámetro como un campo de formulario independiente. El valor es la configuración JSON codificada en Base64.--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 -
Parámetro
callback-var(variables personalizadas): cada variable personalizada debe pasarse como un campo de formulario independiente. No es posible encapsularlas en un único campocallback-var.Por ejemplo, considere las variables personalizadas
uidyorder_id:{ "x:uid": "12345", "x:order_id": "67890" }Debe convertirlas en dos campos de formulario independientes.
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890 -
Compruebe el parámetro
callback(opcional): puede especificar condiciones de validación para el parámetrocallbackdentro depolicy. Si omite esta condición, el parámetro no se valida durante la carga. Ejemplo:{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"] ] }
URL
Este método suele utilizarse para cargar objetos con una URL prefirmada. Los parámetros de callback codificados en Base64 se agregan a la URL para habilitar el callback automático. Sin embargo, expone la información del callback en la URL y representa riesgos de seguridad. Úselo únicamente para accesos temporales o en escenarios de baja sensibilidad.
-
Si decide pasar los parámetros de callback en la URL, debe incluir el parámetro
callback. El parámetrocallback-vares opcional. Al calcular la firma, estos parámetros deben incluirse como parte de la cadena de consulta canónica (Canonical Query String). Para obtener más información, consulte Signature Version 4.Ejemplo:
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
Implementación del lado del servidor
A continuación se describe el flujo de procesamiento del lado del servidor. Para ver ejemplos de código en distintos lenguajes de programación, consulte Server-side sample code .
Su servidor de aplicaciones debe poder ejecutar las siguientes acciones:
-
Recibir solicitudes POST de OSS
Tras una carga de objeto correcta, OSS envía automáticamente una solicitud POST a su servidor de aplicaciones. El siguiente código muestra un ejemplo de solicitud:
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 -
Comprobar la firma de la solicitud por motivos de seguridad (opcional)
Para asegurarse de que las solicitudes de callback provienen de OSS, compruebe la firma de la solicitud en su servidor de aplicaciones. Para obtener instrucciones detalladas, consulte Recommended configurations.
NotaLa comprobación de la firma es opcional y puede habilitarse según sus requisitos de seguridad.
-
Enviar una respuesta de callback
Cuando su servidor de aplicaciones recibe una solicitud de callback, debe enviar una respuesta a OSS. La respuesta debe cumplir con los siguientes requisitos:
El servidor de aplicaciones debe devolver
HTTP/1.1 200 OKpara indicar que la operación se completó correctamente.El encabezado de la respuesta debe incluir
Content-Length.El cuerpo de la respuesta admite el formato JSON o XML. Este documento utiliza JSON como ejemplo. Si desea usar el formato XML, agregue
Content-Type: application/xmlal encabezado de la respuesta.
Por ejemplo, el servidor de aplicaciones devuelve
{"Status": "OK"}.Nota: la versión de Python utilizada en este ejemplo es la 2.7.6. Se recomienda usar Python 3 para el desarrollo.
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"}Luego, OSS reenvía esta respuesta al cliente. Ejemplo:
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"}ImportanteEn una solicitud
CompleteMultipartUpload, si el cuerpo de la respuesta original contiene información (por ejemplo, datos en formato JSON), dicho contenido se sobrescribe con la respuesta del callback cuando el callback de carga está habilitado. Por ejemplo, en este caso el contenido se sobrescribe con{"Status": "OK"}.
Configuraciones recomendadas
Comprobar la firma de la solicitud
Una vez configurados los parámetros de callback, OSS envía una solicitud POST de callback al servidor de aplicaciones según la callbackUrl especificada. Para asegurarse de que la solicitud proviene de OSS, puede comprobar la firma de la solicitud de callback. A continuación se describen los pasos del proceso de comprobación.
-
Cómo genera OSS la firma
OSS utiliza el algoritmo de cifrado asimétrico RSA con un hash MD5 para generar una firma del contenido de la solicitud. Después, incluye la firma en el campo
authorizationdel encabezado de la solicitud.-
La firma se calcula mediante la siguiente fórmula:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))NotaEn esta fórmula,
private_keyes la clave privada,pathes la ruta del recurso de la solicitud de callback,query_stringes la cadena de consulta ybodyes el cuerpo del mensaje del callback. -
Pasos para generar la firma:
Construya la cadena que se va a firmar: decodifique la URL de la ruta del recurso y agregue la cadena de consulta original, un carácter de nueva línea (
\n) y el cuerpo del mensaje de callback.Genere la firma RSA: utilice la clave privada para firmar la cadena. La función de hash utilizada para la firma es MD5.
Codifique el resultado en Base64 para obtener la firma final e inclúyala en el encabezado
authorizationde la solicitud de callback.
-
Ejemplo de generación de firma:
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=examplebucketLa ruta es
/index.php, la cadena de consulta (query_string) es?id=1&index=2, el cuerpo (body) esbucket=examplebuckety la firma resultante eskKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****.
-
-
El servidor de callback comprueba la firma
Su servidor de aplicaciones debe comprobar la firma de la solicitud proveniente de OSS para confirmar su autenticidad. El proceso de comprobación es el siguiente:
-
Obtenga la clave pública:
Obtenga la URL de la clave pública codificada en Base64 desde el campo
x-oss-pub-key-urldel encabezado de la solicitud y decodifíquela.public_key = urlopen(base64_decode(value of the x-oss-pub-key-url header))Valor de ejemplo antes de la decodificación:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==Después de la decodificación:
http://gosspublic.alicdn.com/callback_pub_key_v1.pemNotaLa URL de la clave pública debe comenzar con
http://gosspublic.alicdn.com/ohttps://gosspublic.alicdn.com/. Dado que el contenido de la URL de la clave pública no cambia, se recomienda almacenar la clave pública en caché para evitar interrupciones del servicio provocadas por fluctuaciones de red. -
Decodifique la firma.
Obtenga la firma del campo
authorizationdel encabezado de la solicitud y decodifíquela desde Base64.signature = base64_decode(value of the authorization header) -
Construya la cadena que se va a verificar.
Concatene la ruta del recurso, la cadena de consulta, un carácter de nueva línea (
\n) y el cuerpo del mensaje de callback con el siguiente formato:sign_str = url_decode(path) + query_string + ‘\n’ + body -
Compruebe la firma.
Utilice el hash MD5 y la clave pública RSA para realizar la comprobación.
result = rsa_verify(public_key, md5(sign_str), signature)
-
-
Ejemplo de comprobación de firma
El siguiente código de Python 3 muestra cómo comprobar una firma en un servidor de aplicaciones. Este ejemplo requiere la biblioteca M2Crypto.
import http.client import base64 import hashlib import urllib.request import urllib.parse import socket from http.server import BaseHTTPRequestHandler, HTTPServer from M2Crypto import RSA from M2Crypto import BIO def get_local_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return "" class MyHTTPRequestHandler(BaseHTTPRequestHandler): ''' def log_message(self, format, *args): return ''' def do_POST(self): # 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 continuación se muestran ejemplos de código del lado del servidor para otros lenguajes.
Lenguaje
Descripción
Java
URL de descarga: Java
Método de ejecución: descomprima el paquete y ejecute
java -jar oss-callback-server-demo.jar 9000(9000 es el número de puerto, el cual puede modificar).
Python
URL de descarga: Python
Descomprima el paquete y ejecute
python callback_app_server.py. Este programa requiere la dependencia RSA.
PHP
URL de descarga: PHP
Para ejecutarlo: despliegue el script en un entorno Apache. Es posible que deba modificar el ejemplo, ya que la obtención de encabezados en PHP puede variar según el entorno.
.NET
URL de descarga: .NET
Para ejecutar la aplicación, descomprima el paquete y consulte el archivo
README.md.
Node.js
URL de descarga: Node.js
Para ejecutar el ejemplo, descomprima el paquete y ejecute
node example.js.
Ruby
URL de descarga: Ruby
Para ejecutarlo:
ruby aliyun_oss_callback_server.rb
Parámetro callback
A continuación se describen los campos del parámetro callback. Estos campos permiten configurar el contenido y el comportamiento de la solicitud de callback que se envía después de cargar correctamente un objeto en OSS.
Parámetro | Obligatorio | Descripción |
callbackUrl | Sí | URL a la que OSS envía una solicitud POST de callback tras cargar el objeto.
|
callbackBody | Sí | Contenido del cuerpo de la solicitud de callback. El formato debe coincidir con el parámetro
El campo |
callbackHost | No | Valor del encabezado Host en la solicitud de callback. Puede ser un nombre de dominio o una dirección IP.
|
callbackSNI | No | Indica si se incluye Server Name Indication (SNI) en la solicitud de callback. En una solicitud HTTPS, SNI permite que el servidor presente el certificado correcto para el nombre de host solicitado. Si
|
callbackBodyType | No | El Content-Type de la solicitud de callback, es decir, el formato de datos de Se admiten los siguientes tipos:
|
Parámetros del sistema compatibles con callbackBody
El campo callbackBody del parámetro callback admite varios parámetros del sistema. Estos sirven para pasar información sobre el objeto cargado dentro de la solicitud de callback. A continuación se describen los parámetros del sistema compatibles.
Parámetro | Descripción |
bucket | Nombre del bucket. |
object | Ruta completa del objeto. |
etag | El etag del objeto, idéntico al valor de etag devuelto al cliente. |
size | Tamaño del objeto. Si se invoca la operación CompleteMultipartUpload, |
mimeType | Tipo de recurso. Por ejemplo, el tipo de recurso de una imagen JPEG es |
imageInfo.height | Alto de la imagen. Esta variable solo está disponible para archivos de imagen. |
imageInfo.width | Ancho de la imagen. Esta variable solo está disponible para archivos de imagen. |
imageInfo.format | Formato de la imagen, como JPG o PNG. Esta variable solo está disponible para archivos de imagen. |
crc64 | Coincide con el valor del encabezado |
contentMd5 | Coincide con el valor del encabezado Importante Esta variable solo está disponible para objetos cargados mediante las operaciones PutObject o PostObject. |
vpcId | ID de VPC del cliente que envía la solicitud. Queda vacío si la solicitud no se originó en una VPC. |
clientIp | Dirección IP del cliente que envía la solicitud. |
reqId | ID de la solicitud. |
operation | Nombre de la operación solicitada, como PutObject o PostObject. |
SDK
A continuación se muestran los enlaces a las demostraciones de implementación del lado del cliente.
|
Carga simple (mediante la operación PutObject) |
Carga multiparte (mediante la operación CompleteMultipartUpload) |
Carga con URL prefirmada (mediante la operación PutObject) |
|
|
Java |
|||
|
Python V2 |
- |
||
|
Go V2 |
Solución de problemas
Si ocurre un error durante el proceso de callback, utilice el código de error devuelto por OSS para solucionarlo. Cada código corresponde a una causa específica. Para consultar los códigos de error relacionados con callbacks, consulte 07-CALLBACK.
Preguntas frecuentes
Callback cuando falla la carga
No. OSS activa un callback únicamente después de cargar correctamente un objeto. Si la carga falla, no se envía ningún callback y se devuelve un mensaje de error directamente al cliente.
Error "Response body is not valid json format"
-
Una excepción durante el procesamiento en el servidor de aplicaciones provoca que este envíe un cuerpo de respuesta con un formato JSON no válido, como se muestra en el siguiente código:
# 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)Solución:
-
Ejecute el siguiente comando para comprobar el contenido.
curl -d "<Content>" <CallbackServerURL> -v -
Capture paquetes para inspeccionar el contenido.
En Windows, se recomienda usar Wireshark para capturar paquetes. En Linux, utilice el comando tcpdump para capturar paquetes.
-
-
El cuerpo de respuesta que el servidor de aplicaciones devuelve a OSS contiene un encabezado BOM.
Este error es común en servidores de aplicaciones basados en PHP. El SDK de PHP devuelve un encabezado BOM que añade tres bytes adicionales al inicio del cuerpo de respuesta recibido por OSS. Esto invalida el cuerpo como objeto JSON. En la siguiente captura de paquetes, los bytes
ef bb bfrepresentan el encabezado BOM.Frame 6: 448 bytes on wire (3584 bits), 448 bytes captured (3584 bits) Ethernet II, Src: Inventec_5e:4f:5c (00:8c:fa:5e:4f:5c), Dst: Inventec_5e:4b:64 (00:8c:fa:5e:4b:64) Internet Protocol Version 4, Src: 10.101.166.30, Dst: 10.101.166.53 Transmission Control Protocol, Src Port: 8083 (8083), Dst Port: 49607 (49607), Seq: 1, Ack: 518, Len: 382 Hypertext Transfer Protocol Line-based text data: text/html \357\273\277{"Status":"Ok"} 0090 64 20 48 61 74 29 0d 0a 53 65 74 2d 43 6f 6b d Hat).. Set-Cook 00a0 69 65 3a 20 50 48 50 53 45 53 53 49 44 3d 66 61 ie: PHPS ESSID=fa 00b0 74 37 33 6e 74 6c 70 68 30 6e 63 67 38 68 33 30 t73ntlph 0ncg8h30 00c0 65 6e 75 35 31 34 67 31 3b 20 48 74 74 70 4f 6e enu514g1 ; HttpOn 00d0 6c 79 0d 0a 45 78 70 69 72 65 73 3a 20 54 68 75 ly..Expi res: Thu 00e0 2c 20 31 39 20 4e 6f 76 20 31 39 38 31 20 30 38 , 19 Nov 1981 08 00f0 3a 35 32 3a 30 30 20 47 4d 54 0d 0a 43 61 63 68 :52:00 G MT..Cach 0100 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 73 74 e-Contro l: no-st 0110 6f 72 65 2c 20 6e 6f 2d 63 61 63 68 65 2c 20 6d ore, no- cache, m 0120 75 73 74 2d 72 65 76 61 6c 69 64 61 74 65 2c 20 ust-reva lidate, 0130 70 6f 73 74 2d 63 68 65 63 6b 3d 30 2c 20 70 72 post-che ck=0, pr 0140 65 2d 63 68 65 63 6b 3d 30 0d 0a 50 72 61 67 6d e-check= 0..Pragm 0150 61 3a 20 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e a: no-ca che..Con 0160 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 31 38 0d tent-Len gth: 18. 0170 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f .Connect ion: clo 0180 73 65 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 se..Cont ent-Type 0190 3a 20 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 : text/h tml; cha 01a0 72 73 65 74 3d 55 54 46 2d 38 0d 0a 0d 0a ef bb rset=UTF -8..... 01b0 bf 7b 22 53 74 61 74 75 73 22 3a 22 4f 6b 22 7d .{"Statu s":"Ok"}Solución: elimine el encabezado BOM del cuerpo de respuesta que su servidor de aplicaciones devuelve a OSS.