Todos los productos
Search
Centro de documentos

Object Storage Service:callback

Última actualización: Sep 10, 2026

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:

  1. El cliente carga un objeto con parámetros de callback

    Al cargar un objeto, el cliente debe incluir el parámetro callback para 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 opcional callback-var.

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

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

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

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

    1. 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 usa http://oss-demo.aliyuncs.com:23450 como 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.

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

  2. Construya el parámetro callback-var (opcional)

    Importante

    El 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-var debe usarse junto con el parámetro callbackBody. Para las variables personalizadas del ejemplo anterior (uid y order_id), haga referencia a ellas en callbackBody mediante 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 callbackBodyType está establecido en application/x-www-form-urlencoded:

    uid=12345&order=67890
  3. Codifique en Base64 los parámetros callback y callback-var.

    • Ejemplo: codificación del parámetro callback****

      Parámetro callback original:

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

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

      Resultado tras la codificación en Base64:

      eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
  4. 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-callback y x-oss-callback-var.

    • x-oss-callback: el parámetro callback codificado en Base64.

    • x-oss-callback-var (opcional): el parámetro callback-var codificado 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****************
    Test

    POST 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 campo callback-var.

      Por ejemplo, considere las variables personalizadas uid y order_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ámetro callback dentro de policy. 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ámetro callback-var es 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:

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

    Nota

    La comprobación de la firma es opcional y puede habilitarse según sus requisitos de seguridad.

  3. 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 OK para 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/xml al 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"}
    Importante

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

  1. 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 authorization del 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))
      Nota

      En esta fórmula, private_key es la clave privada, path es la ruta del recurso de la solicitud de callback, query_string es la cadena de consulta y body es el cuerpo del mensaje del callback.

    • Pasos para generar la firma:

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

      2. Genere la firma RSA: utilice la clave privada para firmar la cadena. La función de hash utilizada para la firma es MD5.

      3. Codifique el resultado en Base64 para obtener la firma final e inclúyala en el encabezado authorization de 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=examplebucket

      La ruta es /index.php, la cadena de consulta (query_string) es ?id=1&index=2, el cuerpo (body) es bucket=examplebucket y la firma resultante es kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****.

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

    1. Obtenga la clave pública:

      Obtenga la URL de la clave pública codificada en Base64 desde el campo x-oss-pub-key-url del 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.pem
      Nota

      La URL de la clave pública debe comenzar con http://gosspublic.alicdn.com/ o https://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.

    2. Decodifique la firma.

      Obtenga la firma del campo authorization del encabezado de la solicitud y decodifíquela desde Base64.

      signature = base64_decode(value of the authorization header)
    3. 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
    4. 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)
  3. 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.

  • Es posible especificar hasta cinco URL separadas por punto y coma (;). OSS envía las solicitudes en orden hasta recibir la primera respuesta de callback correcta.

  • Se admiten URL HTTPS.

  • No es posible especificar direcciones IPv6 ni nombres de dominio que resuelvan a direcciones IPv6.

  • Para procesar correctamente caracteres como los chinos, codifique callbackUrl con formato URL. Por ejemplo, https://example.com/中文.php?key=value&中文名称=中文值 debe codificarse como 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.

callbackBody

Sí

Contenido del cuerpo de la solicitud de callback. El formato debe coincidir con el parámetro callbackBodyType.

  • Cuando callbackType tiene el valor predeterminado application/x-www-form-urlencoded, callbackBody debe usar el formato de pares clave-valor. Por ejemplo: bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • Si callbackType es application/json, callbackBody debe tener formato JSON. Por ejemplo: {\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

El campo callbackBody admite referencias a parámetros del sistema de OSS, variables personalizadas y constantes. Para obtener más información sobre los parámetros del sistema, consulte System parameters supported by callbackBody.

callbackHost

No

Valor del encabezado Host en la solicitud de callback. Puede ser un nombre de dominio o una dirección IP.

  • Si no configura callbackHost, OSS analiza callbackUrl y utiliza el host extraído como valor de callbackHost.

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 callbackUrl usa HTTPS, se recomienda habilitar este parámetro. De lo contrario, el callback podría fallar por una discrepancia de certificados y generar un error como 502 callback failed. Valores válidos:

  • true: envía SNI.

  • false (predeterminado): no envía SNI.

    Nota

    En la región UK (London), SNI siempre se envía, sin importar la configuración de este parámetro.

callbackBodyType

No

El Content-Type de la solicitud de callback, es decir, el formato de datos de callbackBody.

Se admiten los siguientes tipos:

  • application/x-www-form-urlencoded (predeterminado)

    Reemplaza las variables de callbackBody por sus valores codificados con formato URL.

  • application/json

    Reemplaza las variables de callbackBody según las reglas de formato JSON.

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, size representa el tamaño total del objeto.

mimeType

Tipo de recurso. Por ejemplo, el tipo de recurso de una imagen JPEG es image/jpeg.

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 x-oss-hash-crc64ecma devuelto tras cargar el objeto.

contentMd5

Coincide con el valor del encabezado Content-MD5 devuelto tras cargar el objeto.

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

demo

demo

demo

Python V2

demo

-

demo

Go V2

demo

demo

demo

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 bf representan 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.