Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo llamar a una operación de API REST de Azure Storage mediante la creación de una solicitud REST autorizada mediante C#. Después de aprender a llamar a una operación de API REST para Blob Storage, puede usar pasos similares para cualquier otra operación rest de Azure Storage.
Prerrequisitos
En la aplicación de ejemplo se enumeran los contenedores de blobs de una cuenta de almacenamiento. Para probar el código de este artículo, necesita los siguientes elementos:
Instale Visual Studio e incluya el carga de trabajo de desarrollo de Azure. Este ejemplo se creó con Visual Studio 2019. Si usa una versión diferente, las instrucciones pueden variar ligeramente.
Una suscripción de Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Una cuenta de almacenamiento de uso general. Si aún no tiene una cuenta de almacenamiento, consulte Creación de una cuenta de almacenamiento.
En el ejemplo de este artículo se muestra cómo enumerar los contenedores de una cuenta de almacenamiento. Para ver la salida, agregue algunos contenedores de blobs a la cuenta de almacenamiento antes de empezar.
Descarga de la aplicación de ejemplo
La aplicación de ejemplo es una aplicación de consola escrita en C#.
Use Git para descargar una copia de la aplicación en el entorno de desarrollo.
git clone https://github.com/Azure-Samples/storage-dotnet-rest-api-with-auth.git
Este comando clona el repositorio en la carpeta git local. Para abrir la solución de Visual Studio, vaya a la carpeta storage-dotnet-rest-api-with-auth y abra StorageRestApiAuth.sln.
Acerca de REST
La transferencia de estado representacional (REST) es una arquitectura que permite interactuar con un servicio a través de un protocolo de Internet, como HTTP/HTTPS. REST es independiente del software que se ejecuta en el servidor o en el cliente. Se puede llamar a la API REST desde cualquier plataforma que admita HTTP/HTTPS. Puede escribir una aplicación que se ejecute en un equipo Mac, Windows, Linux, un teléfono o tableta Android, iPhone, iPod o sitio web y usar la misma API REST para todas esas plataformas.
Una llamada a la API REST consta de una solicitud realizada por el cliente y una respuesta devuelta por el servicio. En la solicitud, se envía una dirección URL con información sobre la operación a la que desea llamar, el recurso en el que actuar, los parámetros de consulta y los encabezados, y en función de la operación a la que se llamó, una carga de datos. La respuesta del servicio incluye un código de estado, un conjunto de encabezados de respuesta y, en función de la operación a la que se llamó, una carga de datos.
Acerca de la aplicación de ejemplo
En la aplicación de ejemplo se enumeran los contenedores de una cuenta de almacenamiento. Una vez que comprenda cómo la información de la documentación de la API REST se correlaciona con el código real, otras llamadas REST son más fáciles de averiguar.
Si examina la API REST de Blob Service, verá todas las operaciones que puede realizar en Blob Storage. Las bibliotecas de cliente de almacenamiento son contenedores en torno a las API REST, lo que facilita el acceso a los recursos de almacenamiento sin usar las API REST directamente. A veces, sin embargo, es posible que quiera usar la API REST en lugar de una biblioteca cliente de almacenamiento.
Operación Listar contenedores
Este artículo se centra en la operación Enumerar contenedores . La siguiente información le ayuda a comprender algunos de los campos de la solicitud y la respuesta.
Método de solicitud: GET. Este verbo es el método HTTP que se especifica como una propiedad del objeto de solicitud. Otros valores de este verbo incluyen HEAD, PUT y DELETE, en función de la API a la que llame.
URI de solicitud: https://myaccount.blob.core.windows.net/?comp=list. El URI de solicitud se crea desde el punto de conexión de la cuenta de almacenamiento de blobs https://myaccount.blob.core.windows.net y la cadena de recurso /?comp=list.
Parámetros de URI: hay parámetros de consulta adicionales que puede usar al llamar a ListContainers. Un par de estos parámetros son el tiempo de espera de la llamada (en segundos) y el prefijo, que se usa para el filtrado.
Otro parámetro útil es maxresults: si hay más contenedores disponibles que este valor, el cuerpo de la respuesta contendrá un elemento NextMarker que indica el siguiente contenedor que se va a devolver en la siguiente solicitud. Para usar esta característica, proporcione el valor NextMarker como parámetro de marcador en el URI cuando realice la siguiente solicitud. El uso de esta característica es análogo a la paginación a través de los resultados.
Para usar parámetros adicionales, anexelos a la cadena de recursos con el valor , como en este ejemplo:
/?comp=list&timeout=60&maxresults=100
Encabezados de solicitud: en esta sección se enumeran los encabezados de solicitud obligatorios y opcionales. Se requieren tres de los encabezados: un encabezado de autorización , x-ms-date (contiene la hora UTC de la solicitud) y x-ms-version (especifica la versión de la API REST que se va a usar). La inclusión de x-ms-client-request-id en los encabezados es opcional. Puede establecer el valor de este campo en cualquier cosa, y se escribirá en los registros de análisis de almacenamiento cuando el registro de datos esté habilitado.
Cuerpo de la solicitud: No hay cuerpo de solicitud para ListContainers. El cuerpo de la solicitud se usa en todas las operaciones PUT al cargar blobs, incluido SetContainerAccessPolicy. Cuerpo de la solicitud permite enviar en una lista XML de directivas de acceso almacenadas que se van a aplicar. Las directivas de acceso almacenadas se describen en el artículo Uso de firmas de acceso compartido (SAS).
Código de estado de respuesta: indica los códigos de estado que necesita saber. En este ejemplo, un código de estado HTTP de 200 es correcto. Para obtener una lista completa de códigos de estado HTTP, consulte Definiciones de códigos de estado. Para ver códigos de error específicos de las API rest de almacenamiento, consulte Códigos de error comunes de la API rest.
Encabezados de respuesta: incluyen tipo de contenido; x-ms-request-id, que es el identificador de solicitud que ha pasado; x-ms-version, que indica la versión de Blob service usada; y la fecha, que está en UTC y indica la hora en que se realizó la solicitud.
Cuerpo de respuesta: este campo es una estructura XML que proporciona los datos solicitados. En este ejemplo, la respuesta es una lista de contenedores y sus propiedades.
Creación de la solicitud REST
Para obtener seguridad al ejecutarse en producción, use siempre HTTPS en lugar de HTTP. Para los fines de este ejercicio, usamos HTTP para que pueda ver los datos de solicitud y respuesta. Para ver la información de solicitud y respuesta en las llamadas REST reales, puede descargar Fiddler o una aplicación similar. En la solución de Visual Studio, el nombre y la clave de la cuenta de almacenamiento se codifican de forma dura en la clase . El método ListContainersAsyncREST pasa el nombre de la cuenta de almacenamiento y la clave de la cuenta de almacenamiento a los métodos que se usan para crear los distintos componentes de la solicitud REST. En una aplicación real, el nombre y la clave de la cuenta de almacenamiento residirían en un archivo de configuración, variables de entorno o se recuperarían de una instancia de Azure Key Vault.
En nuestro proyecto de ejemplo, el código para crear el encabezado Authorization está en una clase independiente. La idea es que podría tomar toda la clase y agregarla a su propia solución y usarla "tal como está". El código de cabecera Authorization funciona para la mayoría de las llamadas API REST a Azure Storage.
Para compilar la solicitud, que es un objeto HttpRequestMessage, vaya a ListContainersAsyncREST en Program.cs. Los pasos para compilar la solicitud son:
- Cree el URI que se usará para llamar al servicio.
- Cree el objeto HttpRequestMessage y establezca la carga útil. La carga es nula para ListContainersAsyncREST porque no estamos pasando nada como entrada.
- Agregue los encabezados de solicitud para x-ms-date y x-ms-version.
- Obtenga el encabezado de autorización y agréguelo.
Información básica que necesita:
- Para ListContainers, el método es
GET. Este valor se establece al instanciar la solicitud. - El recurso es la parte de consulta del URI que indica a qué API se llama, por lo que el valor es
/?comp=list. Como se indicó anteriormente, el recurso se encuentra en la página de documentación de referencia que muestra la información sobre la API ListContainers. - El URI se construye mediante la creación del punto de conexión de Blob Service para esa cuenta de almacenamiento y la concatenación del recurso. El valor de URI de solicitud termina siendo
http://contosorest.blob.core.windows.net/?comp=list. - Para ListContainers, requestBody es null y no hay encabezados adicionales.
Es posible que diferentes API tengan otros parámetros para pasar como ifMatch. Un ejemplo de dónde puede usar ifMatch es al llamar a PutBlob. En ese caso, configura "ifMatch" a un "eTag" y solo actualiza el blob si el "eTag" que proporciona coincide con el "eTag" actual en el blob. Si otra persona ha actualizado el blob desde la recuperación de eTag, su cambio no se invalida.
En primer lugar, establezca el uri y el requestPayload.
// Construct the URI. It will look like this:
// https://myaccount.blob.core.windows.net/resource
String uri = string.Format("http://{0}.blob.core.windows.net?comp=list", storageAccountName);
// Provide the appropriate payload, in this case null.
// we're not passing anything in.
Byte[] requestPayload = null;
A continuación, cree una instancia de la solicitud, establezca el método en GET y proporcione el URI.
// Instantiate the request message with a null payload.
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
{ Content = (requestPayload == null) ? null : new ByteArrayContent(requestPayload) })
{
Agregue los encabezados de solicitud para x-ms-date y x-ms-version. Este lugar en el código también es donde se agregan los encabezados de solicitud adicionales necesarios para la llamada. En este ejemplo, no hay encabezados adicionales. Un ejemplo de una API que pasa encabezados adicionales es la operación de configurar el ACL del contenedor. Esta llamada API agrega un encabezado denominado "x-ms-blob-public-access" y el valor del nivel de acceso.
// Add the request headers for x-ms-date and x-ms-version.
DateTime now = DateTime.UtcNow;
httpRequestMessage.Headers.Add("x-ms-date", now.ToString("R", CultureInfo.InvariantCulture));
httpRequestMessage.Headers.Add("x-ms-version", "2017-07-29");
// If you need any additional headers, add them here before creating
// the authorization header.
Llame al método que crea el encabezado de autorización y agréguelo a los encabezados de solicitud. El encabezado de autorización se crea más adelante en el artículo. El nombre del método es GetAuthorizationHeader, que puede ver en este fragmento de código:
// Get the authorization header and add it.
httpRequestMessage.Headers.Authorization = AzureStorageAuthenticationHelper.GetAuthorizationHeader(
storageAccountName, storageAccountKey, now, httpRequestMessage);
En este momento, httpRequestMessage contiene la solicitud REST completada con los encabezados de autorización.
Envío de la solicitud
Ahora que ha creado la solicitud, puede llamar al método SendAsync para enviarlo a Azure Storage. Compruebe que el valor del código de estado de respuesta es 200, lo que significa que la operación se ha realizado correctamente. A continuación, analice la respuesta. En este caso, obtendrá una lista XML de contenedores. Echemos un vistazo al código para llamar al método GetRESTRequest para crear la solicitud, ejecutar la solicitud y, a continuación, examinar la respuesta de la lista de contenedores.
// Send the request.
using (HttpResponseMessage httpResponseMessage =
await new HttpClient().SendAsync(httpRequestMessage, cancellationToken))
{
// If successful (status code = 200),
// parse the XML response for the container names.
if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
{
String xmlString = await httpResponseMessage.Content.ReadAsStringAsync();
XElement x = XElement.Parse(xmlString);
foreach (XElement container in x.Element("Containers").Elements("Container"))
{
Console.WriteLine("Container name = {0}", container.Element("Name").Value);
}
}
}
}
Si ejecuta un búfer de red como Fiddler al realizar la llamada a SendAsync, puede ver la información de solicitud y respuesta. Echemos un vistazo. El nombre de la cuenta de almacenamiento es contosorest.
Solicitud:
GET /?comp=list HTTP/1.1
Encabezados de solicitud:
x-ms-date: Thu, 16 Nov 2017 23:34:04 GMT
x-ms-version: 2014-02-14
Authorization: SharedKey contosorest:1dVlYJWWJAOSHTCPGiwdX1rOS8B4fenYP/VrU0LfzQk=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive
Código de estado y encabezados de respuesta devueltos después de la ejecución:
HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 3e889876-001e-0039-6a3a-5f4396000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 00:23:42 GMT
Content-Length: 1511
Cuerpo de la respuesta (XML): Para la operación Enumerar contenedores, se muestra la lista de contenedores y sus propiedades.
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
ServiceEndpoint="http://contosorest.blob.core.windows.net/">
<Containers>
<Container>
<Name>container-1</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:39:48 GMT</Last-Modified>
<Etag>"0x8D46CBD5A7C301D"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-2</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:40:50 GMT</Last-Modified>
<Etag>"0x8D46CBD7F49E9BD"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-3</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:10 GMT</Last-Modified>
<Etag>"0x8D46CBD8B243D68"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-4</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:25 GMT</Last-Modified>
<Etag>"0x8D46CBD93FED46F"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-5</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:39 GMT</Last-Modified>
<Etag>"0x8D46CBD9C762815"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
</Containers>
<NextMarker />
</EnumerationResults>
Ahora que comprende cómo crear la solicitud, llamar al servicio y analizar los resultados, veamos cómo crear el encabezado de autorización.
Creación del encabezado de autorización
Sugerencia
Azure Storage admite la integración de Microsoft Entra para blobs y colas. Microsoft Entra ID ofrece una experiencia mucho más sencilla para autorizar una solicitud a Azure Storage. Para obtener más información sobre el uso de Microsoft Entra ID para autorizar las operaciones REST, consulte Autorización con el identificador de Entra de Microsoft. Para obtener información general sobre la integración de Microsoft Entra con Azure Storage, consulte Autenticación del acceso a Azure Storage mediante microsoft Entra ID.
Para más información sobre los conceptos de autorización, consulte Autorización de solicitudes a Azure Storage.
Vamos a destilar ese artículo hasta lo esencial y mostrar el código.
En primer lugar, use la autorización de clave compartida. El formato del encabezado de autorización tiene este aspecto:
Authorization="SharedKey <storage account name>:<signature>"
El campo de firma es un código de autenticación de mensajes basado en hash (HMAC) creado a partir de la solicitud y calculado mediante el algoritmo SHA256 y, a continuación, codificado mediante codificación Base64.
Este fragmento de código muestra el formato de la cadena de firma de clave compartida:
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
Con Blob Storage, especificará VERB, md5, longitud de contenido, encabezados con formato canónico y recursos con formato canónico. Puede dejar los demás en blanco para este ejemplo, pero coloque \n para especificar que están en blanco.
La canónica es un proceso de estandarización de datos que tiene más de una representación posible. En este caso, estás estandarizando los encabezados y el recurso. Los encabezados canónicos son los encabezados que comienzan por "x-ms-". El recurso canónico es el URI del recurso, incluido el nombre de la cuenta de almacenamiento y todos los parámetros de consulta (como ?comp=list). El recurso canónico incluye también cualquier parámetro de consulta adicional que pudiera haber agregado, como timeout=60, por ejemplo.
Comencemos con esos dos campos con formato canónico, puesto que son necesarios para crear el encabezado de autorización.
Encabezados canonizados
Para crear este valor, recupere los encabezados que comienzan por "x-ms-" y ordénelos, luego formateelos en una cadena de instancias de [key:value\n], concatenadas en una sola cadena. En este ejemplo, los encabezados canónicos tienen este aspecto:
x-ms-date:Fri, 17 Nov 2017 00:44:48 GMT\nx-ms-version:2017-07-29\n
Este es el código que se usa para crear esa salida:
private static string GetCanonicalizedHeaders(HttpRequestMessage httpRequestMessage)
{
var headers = from kvp in httpRequestMessage.Headers
where kvp.Key.StartsWith("x-ms-", StringComparison.OrdinalIgnoreCase)
orderby kvp.Key
select new { Key = kvp.Key.ToLowerInvariant(), kvp.Value };
StringBuilder headersBuilder = new StringBuilder();
foreach (var kvp in headers)
{
headersBuilder.Append(kvp.Key);
char separator = ':';
// Get the value for each header, strip out \r\n if found, then append it with the key.
foreach (string headerValue in kvp.Value)
{
string trimmedValue = headerValue.TrimStart().Replace("\r\n", string.Empty);
headersBuilder.Append(separator).Append(trimmedValue);
// Set this to a comma; this will only be used
// if there are multiple values for one of the headers.
separator = ',';
}
headersBuilder.Append("\n");
}
return headersBuilder.ToString();
}
Recurso canonizado
Esta parte de la cadena de firma representa la cuenta de almacenamiento de destino de la solicitud. Recuerde que el URI de solicitud es http://contosorest.blob.core.windows.net/?comp=list, con el nombre de cuenta real (contosorest en este caso). En este ejemplo, se devuelve lo siguiente:
/contosorest/\ncomp:list
Si tiene parámetros de consulta, este ejemplo también incluye esos parámetros. Este es el código, que también controla parámetros de consulta adicionales y parámetros de consulta con varios valores. Recuerde que va a compilar este código para que funcione para todas las API REST. Quiere incluir todas las posibilidades, incluso si el método ListContainers no necesita todas ellas.
private static string GetCanonicalizedResource(Uri address, string storageAccountName)
{
// The absolute path will be "/" because for we're getting a list of containers.
StringBuilder sb = new StringBuilder("/").Append(storageAccountName).Append(address.AbsolutePath);
// Address.Query is the resource, such as "?comp=list".
// This ends up with a NameValueCollection with 1 entry having key=comp, value=list.
// It will have more entries if you have more query parameters.
NameValueCollection values = HttpUtility.ParseQueryString(address.Query);
foreach (var item in values.AllKeys.OrderBy(k => k))
{
sb.Append('\n').Append(item.ToLower()).Append(':').Append(values[item]);
}
return sb.ToString();
}
Ahora que están establecidas las cadenas con formato canónico, echemos un vistazo a cómo crear el encabezado de autorización propiamente dicho. Para empezar, cree una cadena de la firma del mensaje en el formato StringToSign mostrado anteriormente en este artículo. Este concepto es más fácil de explicar mediante comentarios en el código, por lo que aquí es el método final que devuelve el encabezado de autorización:
internal static AuthenticationHeaderValue GetAuthorizationHeader(
string storageAccountName, string storageAccountKey, DateTime now,
HttpRequestMessage httpRequestMessage, string ifMatch = "", string md5 = "")
{
// This is the raw representation of the message signature.
HttpMethod method = httpRequestMessage.Method;
String MessageSignature = String.Format("{0}\n\n\n{1}\n{5}\n\n\n\n{2}\n\n\n\n{3}{4}",
method.ToString(),
(method == HttpMethod.Get || method == HttpMethod.Head) ? String.Empty
: httpRequestMessage.Content.Headers.ContentLength.ToString(),
ifMatch,
GetCanonicalizedHeaders(httpRequestMessage),
GetCanonicalizedResource(httpRequestMessage.RequestUri, storageAccountName),
md5);
// Now turn it into a byte array.
byte[] SignatureBytes = Encoding.UTF8.GetBytes(MessageSignature);
// Create the HMACSHA256 version of the storage key.
HMACSHA256 SHA256 = new HMACSHA256(Convert.FromBase64String(storageAccountKey));
// Compute the hash of the SignatureBytes and convert it to a base64 string.
string signature = Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes));
// This is the actual header that will be added to the list of request headers.
AuthenticationHeaderValue authHV = new AuthenticationHeaderValue("SharedKey",
storageAccountName + ":" + signature);
return authHV;
}
Al ejecutar este código, MessageSignature resultante se ve como este ejemplo:
GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 01:07:37 GMT\nx-ms-version:2017-07-29\n/contosorest/\ncomp:list
Este es el valor final de AuthorizationHeader:
SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=
AuthorizationHeader es el último encabezado colocado en los encabezados de solicitud antes de publicar la respuesta.
Esto abarca todo lo que necesitas saber para compilar una clase con la que puedes crear una solicitud para llamar a las API REST de Servicios de Almacenamiento.
Ejemplo: Enumeración de blobs
Veamos cómo cambiar el código para llamar a la operación List Blobs para el contenedor container-1. Este código es casi idéntico al código para enumerar contenedores, las únicas diferencias son el URI y cómo se analiza la respuesta.
Si examina la documentación de referencia de ListBlobs, encontrará que el método es GET y requestURI es:
https://myaccount.blob.core.windows.net/container-1?restype=container&comp=list
En ListContainersAsyncREST, cambie el código que establece el URI de la API para ListBlobs. El nombre del contenedor es container-1.
String uri =
string.Format("http://{0}.blob.core.windows.net/container-1?restype=container&comp=list",
storageAccountName);
A continuación, donde controle la respuesta, cambie el código para buscar blobs en lugar de contenedores.
foreach (XElement container in x.Element("Blobs").Elements("Blob"))
{
Console.WriteLine("Blob name = {0}", container.Element("Name").Value);
}
Al ejecutar este ejemplo, obtendrá resultados como los siguientes:
Encabezados con formato canónico:
x-ms-date:Fri, 17 Nov 2017 05:16:48 GMT\nx-ms-version:2017-07-29\n
Recurso canonicalizado:
/contosorest/container-1\ncomp:list\nrestype:container
Firma de mensaje:
GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 05:16:48 GMT
\nx-ms-version:2017-07-29\n/contosorest/container-1\ncomp:list\nrestype:container
Encabezado de autorización:
SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Los valores siguientes son de Fiddler:
Solicitud:
GET http://contosorest.blob.core.windows.net/container-1?restype=container&comp=list HTTP/1.1
Encabezados de solicitud:
x-ms-date: Fri, 17 Nov 2017 05:16:48 GMT
x-ms-version: 2017-07-29
Authorization: SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive
Código de estado y encabezados de respuesta devueltos después de la ejecución:
HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 7e9316da-001e-0037-4063-5faf9d000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 05:20:21 GMT
Content-Length: 1135
Cuerpo de la respuesta (XML): Esta respuesta XML muestra la lista de blobs y sus propiedades.
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
ServiceEndpoint="http://contosorest.blob.core.windows.net/" ContainerName="container-1">
<Blobs>
<Blob>
<Name>DogInCatTree.png</Name>
<Properties><Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
<Etag>0x8D52D5C4A4C96B0</Etag>
<Content-Length>419416</Content-Length>
<Content-Type>image/png</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5 />
<Cache-Control />
<Content-Disposition />
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
<ServerEncrypted>true</ServerEncrypted>
</Properties>
</Blob>
<Blob>
<Name>GuyEyeingOreos.png</Name>
<Properties>
<Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
<Etag>0x8D52D5C4A25A6F6</Etag>
<Content-Length>167464</Content-Length>
<Content-Type>image/png</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5 />
<Cache-Control />
<Content-Disposition />
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
<ServerEncrypted>true</ServerEncrypted>
</Properties>
</Blob>
</Blobs>
<NextMarker />
</EnumerationResults>
Resumen
En este artículo, ha aprendido a realizar una solicitud a la API REST de Blob Storage. Con la solicitud, puede recuperar una lista de contenedores o una lista de blobs de un contenedor. Ha aprendido a crear la firma de autorización para la llamada a la API REST y a usarlo en la solicitud REST. Por último, aprendiste a examinar la respuesta.