Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2024-06-25 GMT+08:00

Acceso autenticado mediante un AK/SK

Si un servicio en tiempo real está en el estado Running, el servicio en tiempo real se ha implementado correctamente. Este servicio proporciona una API RESTful estándar para que los usuarios llamen. Los usuarios pueden llamar a la API mediante autenticación basada en AK/SK.

Cuando se utiliza la autenticación basada en AK/SK, puede utilizar el SDK de APIG o el SDK de ModelArts para acceder a las API. Para obtener más información, consulte Autenticación basada en AK/SK. Esta sección describe cómo utilizar el SDK de APIG para acceder a un servicio en tiempo real. El proceso es el siguiente:

  1. Obtención de un par AK/SK
  2. Obtención de información sobre un servicio en tiempo real
  3. Envío de una solicitud de inferencia
  1. La autenticación basada en AK/SK admite solicitudes de API con un cuerpo de no más de 12 MB. Para las solicitudes de API con un cuerpo más grande, se recomienda la autenticación basada en tokens.
  2. La hora local en el cliente debe sincronizarse con el servidor de reloj para evitar un offset grande en el valor del encabezado de solicitud X-Sdk-Date. API Gateway comprueba el formato de hora y compara la hora con la hora en que API Gateway recibe la solicitud. Si la diferencia de tiempo supera los 15 minutos, API Gateway rechazará la solicitud.

Obtención de un par AK/SK

Si un par AK/SK ya está disponible, omita este paso. Encuentre el archivo AK/SK descargado, que normalmente se llama credentials.csv.

Como se muestra en la siguiente figura, el archivo contiene el nombre de usuario, AK y SK.

Figura 1 Contenido del archivo credential.csv
Realice las siguientes operaciones para generar un par AK/SK:
  1. Regístrese e inicie sesión en la consola de gestión.
  2. Haga clic en el nombre de usuario y elija My Credentials en la lista desplegable.
  3. En la página My Credentials, elija Access Keys en el panel de navegación.
  4. Haga clic en Create Access Key. Aparece el cuadro de diálogo Identity Verification.
  5. Complete la autenticación de identidad como se le indique, descargue la clave de acceso y manténgala segura.

Obtención de información sobre un servicio en tiempo real

Al llamar a una API, es necesario obtener la dirección API y los parámetros de entrada del servicio en tiempo real. Siga el siguiente procedimiento:

  1. Inicie sesión en la consola de gestión del ModelArts. En el panel de navegación izquierdo, elija Service Deployment > Real-Time Services. De forma predeterminada, el sistema cambia a la página Real-Time Services.
  2. Haga clic en el nombre del servicio de destino. Se muestra la página de detalles del servicio.
  3. En la página de detalles de un servicio en tiempo real, obtenga la dirección API y los parámetros de entrada del servicio.
    La dirección API es la URL del servicio en tiempo real.
    Figura 2 Obtención de información sobre un servicio en tiempo real

Método 1: Usar Python para enviar una solicitud de inferencia

  1. Descargue el SDK de Python y configúrelo en la herramienta de desarrollo. Para obtener más información, consulte Integración del SDK de Python para la firma de solicitudes de API.
  2. Cree un cuerpo de solicitud para inferencia.
    • Ingreso de archivo
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      # coding=utf-8
      
      import requests
      from apig_sdk import signer
      
      if __name__ == '__main__':
          # Config url, ak, sk and file path.
          url = "URL of the real-time service"
          ak = "AK"
          sk = "SK"
          file_path = "Local path to the inference file"
      
          # Create request, set method, url, headers and body.
          method = 'POST'
          headers = {"x-sdk-content-sha256": "UNSIGNED-PAYLOAD"}
          request = signer.HttpRequest(method, url, headers)
      
          # Create sign, set the AK/SK to sign and authenticate the request.
          sig = signer.Signer()
          sig.Key = ak
          sig.Secret = sk
          sig.Sign(request)
      
          # Send request
          files = {'images': open(file_path, 'rb')}
          resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, files=files)
      
          # Print result
          print(resp.status_code)
          print(resp.text)
      

      file_path es la ruta local al archivo de inferencia. La ruta puede ser una ruta absoluta (por ejemplo, D:/test.png para Windows y /opt/data/test.png para Linux) o una ruta relativa (por ejemplo,./test.png).

      Formato del cuerpo de la solicitud de files: files = {"Request parameter": ("Load path", File content, "File type")}. Para obtener más información sobre los parámetros de files, consulte Tabla 1.
      Tabla 1 Parámetros de files

      Parámetro

      Obligatorio

      Descripción

      Request parameter

      Introduzca el nombre del parámetro del servicio en tiempo real.

      Load path

      No

      Ruta de acceso en la que se almacena el archivo.

      File content

      Contenido del archivo que se va a cargar.

      File type

      No

      Tipo del archivo que se va a cargar, que puede ser una de las siguientes opciones:

      • txt: text/plain
      • jpg/jpeg: image/jpeg
      • png: image/png
    • Ingreso de texto (JSON)

      A continuación se muestra un ejemplo del cuerpo de la solicitud para leer el archivo de inferencia local y realizar la codificación Base64:

      # coding=utf-8
      
      import base64
      import json
      import requests
      from apig_sdk import signer
      
      if __name__ == '__main__':
          # Config url, ak, sk and file path.
          url = "URL of the real-time service"
          ak = "AK"
          sk = "SK"
          file_path = "Local path to the inference file"
          with open(file_path, "rb") as file:
              base64_data = base64.b64encode(file.read()).decode("utf-8")
      
          # Create request, set method, url, headers and body.
          method = 'POST'
          headers = {
              'Content-Type': 'application/json'
          }
          body = {
              'image': base64_data
          }
          request = signer.HttpRequest(method, url, headers, json.dumps(body))
      
          # Create sign, set the AK/SK to sign and authenticate the request.
          sig = signer.Signer()
          sig.Key = ak
          sig.Secret = sk
          sig.Sign(request)
      
          # Send request
          resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, data=request.body)
      
          # Print result
          print(resp.status_code)
          print(resp.text)

      El nombre de body viene determinado por el parámetro de entrada del servicio en tiempo real. Se recomienda que el nombre del parámetro sea el mismo que el del parámetro de entrada del tipo de string.

Método 2: Usar Java para enviar una solicitud de inferencia

  1. Descargue el SDK de Java y configúrelo en la herramienta de desarrollo. Para obtener más información, consulte Integración del SDK de Java para la firma de solicitudes de API.
  2. Cree un cuerpo de solicitud Java para inferencia.

    En el SDK de Java APIG, request.setBody() solo puede ser una string. Por lo tanto, solo se admiten solicitudes de inferencia de texto.

    A continuación se muestra un ejemplo del cuerpo de la solicitud (JSON) para leer el archivo de inferencia local y realizar la codificación Base64:

    // Package name of the demo.
    package com.apig.sdk.demo;
    
    import com.cloud.apigateway.sdk.utils.Client;
    import com.cloud.apigateway.sdk.utils.Request;
    import org.apache.http.HttpHeaders;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpRequestBase;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    public class MyAkSkTest {
    
        public static void main(String[] args) {
            String url = "URL of the real-time service";
            String ak = "AK";
            String Sk = "SK";
            String body = "{}";
    
            try {
                // Create request
                Request request = new Request();
    
                // Set the AK/SK to sign and authenticate the request.
                request.setKey(ak);
                request.setSecret(sk);
    
                // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH.
                request.setMethod(HttpPost.METHOD_NAME);
    
                // Add header parameters
                request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
    
                // Set a request URL in the format of https://{Endpoint}/{URI}.
                request.setUrl(url);
    
                // Special characters, such as the double quotation mark ("), contained in the body must be escaped.
                request.setBody(body);
    
                // Sign the request.
                HttpRequestBase signedRequest = Client.sign(request);
    
                // Send request.
                CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest);
    
                // Print result
                System.out.println(response.getStatusLine().getStatusCode());
                System.out.println(EntityUtils.toString(response.getEntity()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    body está determinado por el formato de texto. JSON se utiliza como ejemplo.