Chamar operações da API REST com autorização de Chave Compartilhada
Este artigo mostra como chamar uma operação da API REST do Armazenamento do Microsoft Azure criando uma solicitação REST autorizada utilizando o C#. Após saber como chamar uma operação de API REST para o Armazenamento de blobs, você poderá usar etapas semelhantes para qualquer outra operação REST do Armazenamento do Microsoft Azure.
Pré-requisitos
O aplicativo de exemplo lista os contêineres de blob em uma conta de armazenamento. Para testar o código neste artigo, você precisa dos seguintes itens:
Instale o Visual Studio e inclua a carga de trabalho de desenvolvimento do Azure. Esse exemplo foi criado utilizando o Visual Studio 2019. Se você usar uma versão diferente, as diretrizes poderão variar um pouco.
Uma assinatura do Azure. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Uma conta de armazenamento de uso geral. Se você ainda não tiver uma conta de armazenamento, consulte o artigo Criar uma conta de armazenamento.
O exemplo neste artigo mostra como listar os contêineres em uma conta de armazenamento. Para ver a saída, adicione alguns contêineres de blob à conta de armazenamento antes de iniciar.
Baixar o aplicativo de exemplo
O aplicativo de exemplo é um aplicativo de console escrito em C#.
Use o git para baixar uma cópia do aplicativo para seu ambiente de desenvolvimento.
git clone https://github.com/Azure-Samples/storage-dotnet-rest-api-with-auth.git
Este comando clona o repositório para sua pasta do git local. Para abrir a solução do Visual Studio, navegue até a pasta storage-dotnet-rest-api-with-auth e abra o arquivo StorageRestApiAuth.sln.
Sobre a REST
A Transferência de Estado Representacional (REST) é uma arquitetura que permite que você interaja com um serviço por meio de um protocolo da Internet, como HTTP/HTTPS. A REST é independente do software em execução no servidor ou no cliente. A API REST pode ser chamada de qualquer plataforma que dê suporte a HTTP/HTTPS. Você pode escrever um aplicativo que é executado em Mac, Windows, Linux, telefone Android ou tablet, iPhone, iPod ou site da Web, e usar a mesma API REST para todas as plataformas.
Uma chamada à API REST consiste em uma solicitação feita pelo cliente e uma resposta retornada pelo serviço. Na solicitação, você envia uma URL com informações sobre qual operação deseja chamar, o recurso para agir, os parâmetros de consulta e cabeçalhos e, dependendo da operação que foi chamada, um conteúdo de dados. A resposta do serviço inclui um código de status, um conjunto de cabeçalhos de resposta e, dependendo da operação que foi chamada, um conteúdo de dados.
Sobre o aplicativo de exemplo
O aplicativo de exemplo lista os contêineres em uma conta de armazenamento. Depois de compreender como as informações na documentação da API REST se correlacionam com o código real, outras chamadas REST serão mais fáceis de entender.
Se você observar a API REST do serviço Blob, verá todas as operações que pode executar no armazenamento de blobs. As bibliotecas de clientes de armazenamento são wrappers em torno das APIs REST, facilitando o acesso aos recursos de armazenamento sem o uso direto das APIs REST. Entretanto, às vezes, você pode desejar usar a API REST em vez de uma biblioteca de clientes de armazenamento.
Operação Listar Contêineres
Este artigo tem como foco a operação Listar Contêineres. As informações a seguir ajudam a você a entender alguns dos campos da solicitação e da resposta.
Método de Solicitação: GET. Esse verbo é o método HTTP que você especifica como uma propriedade do objeto de solicitação. Outros valores para esse verbo incluem HEAD, PUT e DELETE, dependendo da API que você está chamando.
URI de solicitação: https://myaccount.blob.core.windows.net/?comp=list
. O URI de solicitação é criado no ponto de extremidade da conta de armazenamento de blobs https://myaccount.blob.core.windows.net
e da cadeia de caracteres do recurso /?comp=list
.
Parâmetros de URI: há parâmetros de consulta adicionais que você pode usar ao chamar ListContainers. Alguns desses parâmetros são timeout para a chamada (em segundos) e prefix, que é usado para filtragem.
Outro parâmetro útil é maxresults: se houver mais contêineres que esse valor, o corpo da resposta conterá um NextMarker, que indica o próximo contêiner a ser retornado na próxima solicitação. Para usar esse recurso, você deve fornecer o valor NextMarker como o parâmetro marker no URI ao fazer a próxima solicitação. Ao usar esse recurso, ele é analógico à paginação dos resultados.
Para usar outros parâmetros, acrescente-os à cadeia de caracteres do recurso com o valor, como neste exemplo:
/?comp=list&timeout=60&maxresults=100
Cabeçalhos de solicitação: essa seção lista os cabeçalhos de solicitação obrigatórios e opcionais. Três dos cabeçalhos são obrigatórios: um cabeçalho de Autorização, x-ms-date (contém a hora de UTC para a solicitação) e x-ms-version (especifica a versão da API REST a ser usada). A inclusão de x-ms-client-request-id nos cabeçalhos é opcional. Você pode definir o valor desse campo como qualquer coisa, e ele será gravado nos logs de análise de armazenamento quando o registro em log estiver habilitado.
Corpo da solicitação: não existe um corpo da solicitação para ListContainers. O Corpo da Solicitação é usado em todas as operações PUT ao fazer upload de blobs, incluindo SetContainerAccessPolicy. O Corpo da Solicitação permite enviar uma lista XML de políticas de acesso armazenadas para serem aplicadas. As políticas de acesso armazenadas são discutidas no artigo Usando SAS (assinaturas de acesso compartilhado).
Código de status da resposta: indica os códigos de status que você precisa saber. Neste exemplo, um código de status HTTP 200 é OK. Para obter uma lista completa de códigos de status HTTP, confira Definições de código de status. Para ver os códigos de erro específicos das APIs REST do Armazenamento, confira Códigos de erro da API REST comuns
Cabeçalhos de Resposta: incluem o Tipo de Conteúdo; a x-ms-request-id, que é a ID da solicitação transmitida; a x-ms-version, que indica a versão do serviço Blob usado e a Data, que está no formato UTC e indica a hora em que a solicitação foi feita.
Corpo da resposta: esse campo é uma estrutura XML que fornece os dados solicitados. Neste exemplo, a resposta é uma lista de contêineres e suas propriedades.
Criando a solicitação REST
Por segurança, ao executar em produção, sempre use HTTPS em vez de HTTP. Para os fins deste exercício, usaremos HTTP para que você possa exibir os dados de solicitação e resposta. Para exibir as informações de solicitação e resposta nas chamadas REST reais, você pode baixar o Fiddler ou um aplicativo semelhante. Na solução do Visual Studio, o nome e a chave da conta de armazenamento são codificados na classe. O método ListContainersAsyncREST transmite o nome e a chave da conta de armazenamento para os métodos que são usados para criar os vários componentes da solicitação REST. Em um aplicativo do mundo real, o nome da conta de armazenamento e a chave devem residir em um arquivo de configuração, em variáveis de ambiente ou ser recuperados de um Azure Key Vault.
No projeto de exemplo, o código para criar o Cabeçalho de autorização está em uma classe separada. A ideia é que você possa pegar a classe inteira e adicioná-la à sua própria solução e usá-la "como está". O código de header de Autorização funciona para a maioria das chamadas de API REST para o Azure Armazenamento.
Para criar a solicitação, que é um objeto HttpRequestMessage, vá para ListContainersAsyncREST em Program.cs. As etapas para criar a solicitação são:
- Crie o URI a ser usado para chamar o serviço.
- Crie o objeto HttpRequestMessage e defina a carga. A carga é nula para ListContainersAsyncREST porque não estamos transmitindo nada.
- Adicione os cabeçalhos de solicitação para x-ms-date e x-ms-version.
- Obtenha o cabeçalho de autorização e adicione-o.
Algumas informações básicas de que você precisa:
- Para ListContainers, o método é
GET
. Esse valor é definido ao instanciar a solicitação. - O recurso é a parte de consulta do URI que indica qual API está sendo chamada e, portanto, o valor é
/?comp=list
. Conforme observado anteriormente, o recurso está na página de documentação de referência que mostra as informações sobre a API ListContainers. - O URI é construído com a criação do ponto de extremidade do serviço Blob para essa conta de armazenamento e a concatenação do recurso. O valor da URI de solicitação acaba sendo
http://contosorest.blob.core.windows.net/?comp=list
. - Para ListContainers, requestBody é nulo e não há cabeçalhos extra.
APIs diferentes podem ter outros parâmetros a serem passados, como ifMatch. Um exemplo em que você pode usar ifMatch é ao chamar PutBlob. Nesse caso, você define ifMatch para uma eTag e ela atualiza o blob somente se a eTag fornecida corresponder à eTag atual no blob. Se outra pessoa tiver atualizado o blob desde a recuperação da eTag, a alteração não será substituída.
Primeiro, defina o uri
e a 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;
Em seguida, crie uma instância a solicitação, defina o método como GET
e forneça o URI.
// Instantiate the request message with a null payload.
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
{ Content = (requestPayload == null) ? null : new ByteArrayContent(requestPayload) })
{
Adicione os cabeçalhos de solicitação para x-ms-date
e x-ms-version
. Esse local no código também é onde você pode adicionar outros cabeçalhos de solicitação obrigatórios para a chamada. Neste exemplo, não há nenhum cabeçalho adicional. Um exemplo de uma API que passa em cabeçalhos extras é a operação Definir ACL de Contêiner. Essa chamada à API adiciona um cabeçalho chamado "x-ms-blob-public-access" e o valor para o nível de acesso.
// 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.
Chame o método que cria o cabeçalho de autorização e adicione-o aos cabeçalhos de solicitação. O cabeçalho de autorização será criado mais adiante neste artigo. O nome do método é GetAuthorizationHeader, que você pode ver neste snippet de código:
// Get the authorization header and add it.
httpRequestMessage.Headers.Authorization = AzureStorageAuthenticationHelper.GetAuthorizationHeader(
storageAccountName, storageAccountKey, now, httpRequestMessage);
Aqui, httpRequestMessage
contém a solicitação REST com os cabeçalhos de autorização.
Enviar a solicitação
Depois de construir a solicitação, você pode chamar o método SendAsync para enviá-la ao Armazenamento do Azure. Verifique se o valor do código de status de resposta é 200, o que significa que a operação foi bem-sucedida. Em seguida, analise a resposta. Nesse caso, você pode obter uma lista XML de contêineres. Vamos examinar o código para chamar o método GetRESTRequest a fim de criar a solicitação, executar a solicitação e examinar a resposta da lista de contêineres.
// 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);
}
}
}
}
Se você executar um rastreador de rede, como o Fiddler, ao fazer a chamada a SendAsync, poderá ver as informações de solicitação e resposta. Vamos conferir isso. O nome da conta de armazenamento é contosorest.
Solicitação:
GET /?comp=list HTTP/1.1
Cabeçalhos de solicitação:
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
Cabeçalhos de resposta e código de status retornado após a execução:
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
Corpo da resposta (XML): para a operação Listar Contêineres, mostra a lista de contêineres e suas propriedades.
<?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>
Agora que você entende como criar a solicitação, chame o serviço e analise os resultados, vamos ver como criar o cabeçalho de autorização.
Criando o cabeçalho de autorização
Dica
O Armazenamento do Microsoft Azure dá suporte para a integração do Microsoft Entra para blobs e filas. O Microsoft Entra ID oferece uma experiência mais simples para autorizar uma solicitação para o Armazenamento do Microsoft Azure. Para obter mais informações sobre como usar o Microsoft Entra ID para autorizar operações REST, consulte Autorizar com o Microsoft Entra ID. Para obter uma visão geral da integração do Microsoft Entra ao Armazenamento do Microsoft Azure, consulte Autenticar o acesso ao Armazenamento do Azure com o Microsoft Entra ID.
Para obter mais informações sobre os conceitos de autorização, confira Autorizar solicitações para o Armazenamento do Microsoft Azure.
Vamos ver o artigo até exatamente o for é necessário e mostrar o código.
Use a autorização de Chave compartilhada. O formato de cabeçalho de autorização tem esta aparência:
Authorization="SharedKey <storage account name>:<signature>"
O campo de assinatura é um HMAC (Hash-based Message Authentication Code) criado a partir da solicitação, calculado usando o algoritmo SHA256 e codificado usando a codificação de Base64.
Este snippet de código mostra o formato da cadeia de caracteres de assinatura de chave compartilhada:
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;
Para o armazenamento de Blobs, você pode especificar VERBO, md5, tamanho do conteúdo, cabeçalhos canonizados e recurso canonizado. Você pode deixar os outros em branco para este exemplo, mas coloque \n
para especificar que eles estão em branco.
A canonização é um processo de padronização de dados que têm mais de uma representação possível. Neste caso, você está padronizando os cabeçalhos e o recurso. Os cabeçalhos canonizados são os cabeçalhos que iniciam com "x-ms-". O recurso canonizado é o URI do recurso, incluindo o nome da conta de armazenamento e todos os parâmetros de consulta (como ?comp=list
). O recurso canonizado também inclui quaisquer parâmetros de consulta adicionais que você possa ter adicionado, como timeout=60
, por exemplo.
Vamos iniciar com os dois campos canonizados, pois eles são necessários para criar o cabeçalho de Autorização.
Cabeçalhos canonizados
Para criar esse valor, recupere os cabeçalhos que começam com "x-ms-", classifique-os e formate-os em uma cadeia de caracteres de instâncias [key:value\n]
concatenadas em uma cadeia de caracteres. Neste exemplo, os cabeçalhos canonizados têm esta aparência:
x-ms-date:Fri, 17 Nov 2017 00:44:48 GMT\nx-ms-version:2017-07-29\n
Aqui está o código usado para criar essa saída:
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 da cadeia de caracteres de assinatura representa a conta de armazenamento que é o destino da solicitação. Lembre-se de que o URI da solicitação é http://contosorest.blob.core.windows.net/?comp=list
, com o nome da conta real (contosorest
nesse caso). Neste exemplo, isto é retornado:
/contosorest/\ncomp:list
Se você tiver parâmetros de consulta, esse exemplo também vai incluí-los. Aqui está o código, que também lida com parâmetros de consulta adicionais e parâmetros de consulta com vários valores. Lembre-se de que você está criando esse código para funcionar em todas as APIs REST. Você deverá incluir todas as possibilidades, mesmo se o método ListContainers não precisar delas.
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();
}
Agora que as cadeias de caracteres canonizadas foram definidas, vamos dar uma olhada em como criar o cabeçalho de autorização. Comece criando uma cadeia de caracteres da assinatura de mensagem no formato StringToSign exibido anteriormente neste artigo. Esse conceito é mais fácil de explicar usando os comentários no código e, portanto, este é o método final que retorna o cabeçalho de autorização:
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;
}
Quando você executa esse código, o MessageSignature resultante vai ser similar a este exemplo:
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
Aqui está o valor final para AuthorizationHeader:
SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=
O AuthorizationHeader é o último cabeçalho colocado nos cabeçalhos de solicitação antes de enviar a resposta.
Isso abrange tudo o que você precisa saber para criar uma classe que pode ser usada para criar uma solicitação para chamar as APIs REST do Serviço de Armazenamento.
Exemplo: listar blobs
Vamos dar uma olhada em como alterar o código para chamar a operação Listar Blobs para o contêiner container-1. Esse código é quase idêntico ao código para listar os contêineres, as únicas diferenças são o URI e como analisar a resposta.
Se você examinar a documentação de referência de ListBlobs, verá que o método é obter e o RequestURI é:
https://myaccount.blob.core.windows.net/container-1?restype=container&comp=list
Em ListContainersAsyncREST, altere o código que define o URI para a API de ListBlobs. O nome do contêiner é container-1.
String uri =
string.Format("http://{0}.blob.core.windows.net/container-1?restype=container&comp=list",
storageAccountName);
Onde você manipula a resposta, altere o código para procurar os blobs em vez dos contêineres.
foreach (XElement container in x.Element("Blobs").Elements("Blob"))
{
Console.WriteLine("Blob name = {0}", container.Element("Name").Value);
}
Quando você executar este exemplo, poderá obter resultados semelhantes ao seguinte:
Cabeçalhos canonizados:
x-ms-date:Fri, 17 Nov 2017 05:16:48 GMT\nx-ms-version:2017-07-29\n
Recurso canonizado:
/contosorest/container-1\ncomp:list\nrestype:container
Assinatura da mensagem:
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
Cabeçalho de autorização:
SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Os valores a seguir são do Fiddler:
Solicitação:
GET http://contosorest.blob.core.windows.net/container-1?restype=container&comp=list HTTP/1.1
Cabeçalhos de solicitação:
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
Cabeçalhos de resposta e código de status retornado após a execução:
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
Corpo da resposta (XML): a resposta XML isso mostra a lista de blobs e suas propriedades.
<?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>
Resumo
Neste artigo, você aprendeu a fazer uma solicitação para a API REST do armazenamento de blobs. Com a solicitação, você pode recuperar uma lista de contêineres ou uma lista de blobs em um contêiner. Você aprendeu a criar a assinatura de autorização para a chamada à API REST e como usá-la na solicitação REST. Por fim, você aprendeu como examinar a resposta.