REST API-bewerkingen aanroepen via autorisatie met gedeelde sleutels

In dit artikel wordt beschreven hoe u een Azure Storage REST API-bewerking aanroept door een geautoriseerde REST-aanvraag te maken met behulp van C#. Nadat u hebt geleerd hoe u een REST API-bewerking aanroept voor Blob Storage, kunt u vergelijkbare stappen gebruiken voor elke andere Azure Storage REST-bewerking.

Vereisten

De voorbeeldtoepassing bevat de blobcontainers voor een opslagaccount. Als u de code in dit artikel wilt uitproberen, hebt u het volgende nodig:

  • Installeer Visual Studio en neem de Azure-ontwikkelworkload op. Dit voorbeeld is gebouwd met Visual Studio 2019. Als u een andere versie gebruikt, kunnen de richtlijnen enigszins variëren.

  • Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.

  • Een opslagaccount voor algemeen gebruik. Zie Een opslagaccount maken als u nog geen opslagaccount hebt.

  • In het voorbeeld in dit artikel ziet u hoe u de containers in een opslagaccount weergeeft. Als u uitvoer wilt zien, voegt u enkele blobcontainers toe aan het opslagaccount voordat u begint.

De voorbeeldtoepassing downloaden

De voorbeeldtoepassing is een consoletoepassing die is geschreven in C#.

Gebruik git om een kopie van de toepassing naar uw ontwikkelomgeving te downloaden.

git clone https://github.com/Azure-Samples/storage-dotnet-rest-api-with-auth.git

Met deze opdracht wordt de opslagplaats naar uw lokale git-map gekloond. Als u de Visual Studio-oplossing wilt openen, gaat u naar de map storage-dotnet-rest-api-with-auth en opent u StorageRestApiAuth.sln.

Over REST

Representational State Transfer (REST) is een architectuur waarmee u kunt communiceren met een service via een internetprotocol, zoals HTTP/HTTPS. REST is onafhankelijk van de software die wordt uitgevoerd op de server of de client. De REST API kan worden aangeroepen vanaf elk platform dat HTTP/HTTPS ondersteunt. U kunt een toepassing schrijven die wordt uitgevoerd op een Mac, Windows, Linux, een Android-telefoon of -tablet, i Telefoon, iPod of website en dezelfde REST API voor al deze platforms gebruiken.

Een aanroep naar de REST API bestaat uit een aanvraag die door de client is ingediend en een antwoord dat door de service wordt geretourneerd. In de aanvraag verzendt u een URL met informatie over welke bewerking u wilt aanroepen, de resource waarop moet worden gehandeld, queryparameters en headers, en afhankelijk van de bewerking die is aangeroepen, een nettolading van gegevens. Het antwoord van de service bevat een statuscode, een set antwoordheaders en afhankelijk van de bewerking die is aangeroepen, een nettolading met gegevens.

Over de voorbeeldtoepassing

In de voorbeeldtoepassing worden de containers in een opslagaccount vermeld. Zodra u begrijpt hoe de informatie in de REST API-documentatie overeenkomt met uw werkelijke code, zijn andere REST-aanroepen gemakkelijker te achterhalen.

Als u de Blob Service REST API bekijkt, ziet u alle bewerkingen die u op blobopslag kunt uitvoeren. De opslagclientbibliotheken zijn wrappers rond de REST API's, zodat u eenvoudig toegang hebt tot opslagresources zonder de REST API's rechtstreeks te gebruiken. Soms wilt u echter de REST API gebruiken in plaats van een opslagclientbibliotheek.

Bewerking Containers weergeven

Dit artikel is gericht op de bewerking Lijstcontainers . De volgende informatie helpt u inzicht te hebben in een aantal velden in de aanvraag en het antwoord.

Aanvraagmethode: GET. Dit werkwoord is de HTTP-methode die u opgeeft als een eigenschap van het aanvraagobject. Andere waarden voor dit werkwoord zijn HEAD, PUT en DELETE, afhankelijk van de API die u aanroept.

Aanvraag-URI: https://myaccount.blob.core.windows.net/?comp=list. De aanvraag-URI wordt gemaakt op basis van het eindpunt https://myaccount.blob.core.windows.net van het blob-opslagaccount en de resourcereeks /?comp=list.

URI-parameters: er zijn extra queryparameters die u kunt gebruiken bij het aanroepen van ListContainers. Een aantal van deze parameters zijn time-outs voor de aanroep (in seconden) en het voorvoegsel, dat wordt gebruikt voor het filteren.

Een andere nuttige parameter is maxresults: als er meer containers beschikbaar zijn dan deze waarde, bevat de hoofdtekst van het antwoord een NextMarker-element dat aangeeft dat de volgende container moet worden geretourneerd bij de volgende aanvraag. Als u deze functie wilt gebruiken, geeft u de NextMarker-waarde op als de markeringsparameter in de URI wanneer u de volgende aanvraag indient. Wanneer u deze functie gebruikt, is het vergelijkbaar met het bladeren door de resultaten.

Als u aanvullende parameters wilt gebruiken, voegt u deze toe aan de resourcetekenreeks met de waarde, zoals in dit voorbeeld:

/?comp=list&timeout=60&maxresults=100

Aanvraagheaders: deze sectie bevat de vereiste en optionele aanvraagheaders. Er zijn drie van de headers vereist: een autorisatieheader, x-ms-date(bevat de UTC-tijd voor de aanvraag) en x-ms-versie (hiermee geeft u de versie van de REST API op die moet worden gebruikt). Het opnemen van x-ms-client-request-id in de headers is optioneel. U kunt de waarde voor dit veld instellen op alles en wordt naar de logboeken voor opslaganalyse geschreven wanneer logboekregistratie is ingeschakeld.

Aanvraagbody: er is geen aanvraagbody voor ListContainers. Aanvraagbody wordt gebruikt voor alle PUT-bewerkingen bij het uploaden van blobs, inclusief SetContainerAccessPolicy. Met aanvraagbody kunt u verzenden in een XML-lijst met opgeslagen toegangsbeleidsregels om toe te passen. Opgeslagen toegangsbeleid wordt besproken in het artikel Shared Access Signatures (SAS) gebruiken.

Antwoordstatuscode: Geeft aan welke statuscodes u moet weten. In dit voorbeeld is een HTTP-statuscode van 200 in orde. Bekijk statuscodedefinities voor een volledige lijst met HTTP-statuscodes. Als u foutcodes wilt zien die specifiek zijn voor de Storage REST API's, raadpleegt u Veelvoorkomende REST API-foutcodes

Antwoordheaders: deze omvatten inhoudstype; x-ms-request-id, de aanvraag-id die u hebt doorgegeven; x-ms-version, die de versie aangeeft van de gebruikte Blob-service; en de datum, die zich in UTC bevindt en laat zien hoe laat de aanvraag is gedaan.

Antwoordtekst: Dit veld is een XML-structuur die de aangevraagde gegevens levert. In dit voorbeeld is het antwoord een lijst met containers en de bijbehorende eigenschappen.

De REST-aanvraag maken

Gebruik altijd HTTPS in plaats van HTTP voor beveiliging wanneer u in productie wordt uitgevoerd. Voor deze oefening gebruiken we HTTP, zodat u de aanvraag- en antwoordgegevens kunt bekijken. Als u de aanvraag- en antwoordgegevens in de werkelijke REST-aanroepen wilt bekijken, kunt u Fiddler of een vergelijkbare toepassing downloaden. In de Visual Studio-oplossing worden de naam en sleutel van het opslagaccount vastgelegd in de klasse. De methode ListContainersAsyncREST geeft de naam van het opslagaccount en de sleutel van het opslagaccount door aan de methoden die worden gebruikt om de verschillende onderdelen van de REST-aanvraag te maken. In een echte toepassing bevinden de naam en sleutel van het opslagaccount zich in een configuratiebestand, omgevingsvariabelen of worden ze opgehaald uit een Azure Key Vault.

In ons voorbeeldproject bevindt de code voor het maken van de autorisatieheader zich in een afzonderlijke klasse. Het idee is dat u de hele klas kunt nemen en deze aan uw eigen oplossing kunt toevoegen en deze 'zoals is' kunt gebruiken. De autorisatieheadercode werkt voor de meeste REST API-aanroepen naar Azure Storage.

Als u de aanvraag wilt bouwen, een HttpRequestMessage-object, gaat u naar ListContainersAsyncREST in Program.cs. De stappen voor het bouwen van de aanvraag zijn:

  • Maak de URI die moet worden gebruikt voor het aanroepen van de service.
  • Maak het HttpRequestMessage-object en stel de nettolading in. De nettolading is null voor ListContainersAsyncREST omdat er niets wordt doorgegeven.
  • Voeg de aanvraagheaders toe voor x-ms-date en x-ms-version.
  • Haal de autorisatieheader op en voeg deze toe.

Enkele basisinformatie die u nodig hebt:

  • Voor ListContainers is GETde methode . Deze waarde wordt ingesteld bij het instantiëren van de aanvraag.
  • De resource is het querygedeelte van de URI dat aangeeft welke API wordt aangeroepen, dus de waarde is /?comp=list. Zoals eerder vermeld, bevindt de resource zich op de referentiedocumentatiepagina met de informatie over de ListContainers-API.
  • De URI wordt samengesteld door het Blob-service-eindpunt voor dat opslagaccount te maken en de resource samen te stellen. De waarde voor de aanvraag-URI is http://contosorest.blob.core.windows.net/?comp=listuiteindelijk .
  • Voor ListContainers is requestBody null en zijn er geen extra headers.

Verschillende API's kunnen andere parameters hebben die moeten worden doorgegeven, zoals ifMatch. Een voorbeeld van waar u ifMatch kunt gebruiken bij het aanroepen van PutBlob. In dat geval stelt u ifMatch in op een eTag en werkt deze alleen de blob bij als de eTag die u opgeeft overeenkomt met de huidige eTag op de blob. Als iemand anders de blob heeft bijgewerkt sinds het ophalen van de eTag, wordt de wijziging niet overschreven.

Stel eerst de uri en de 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;

Maak vervolgens een instantie van de aanvraag, stel de methode GET in op en geef de URI op.

// Instantiate the request message with a null payload.
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
{ Content = (requestPayload == null) ? null : new ByteArrayContent(requestPayload) })
{

Voeg de aanvraagheaders voor x-ms-date en x-ms-version. Op deze plaats in de code voegt u ook eventuele extra aanvraagheaders toe die nodig zijn voor de aanroep. In dit voorbeeld zijn er geen extra headers. Een voorbeeld van een API die extra headers doorgeeft, is de bewerking Container-ACL instellen. Met deze API-aanroep wordt een header met de naam x-ms-blob-public-access en de waarde voor het toegangsniveau toegevoegd.

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

Roep de methode aan waarmee de autorisatieheader wordt gemaakt en voeg deze toe aan de aanvraagheaders. De autorisatieheader wordt verderop in het artikel gemaakt. De naam van de methode is GetAuthorizationHeader, die u kunt zien in dit codefragment:

// Get the authorization header and add it.
httpRequestMessage.Headers.Authorization = AzureStorageAuthenticationHelper.GetAuthorizationHeader(
    storageAccountName, storageAccountKey, now, httpRequestMessage);

Op dit moment httpRequestMessage bevat de REST-aanvraag voltooid met de autorisatieheaders.

De aanvraag verzenden

Nu u de aanvraag hebt samengesteld, kunt u de SendAsync-methode aanroepen om deze naar Azure Storage te verzenden. Controleer of de waarde van de antwoordstatuscode 200 is, wat betekent dat de bewerking is geslaagd. Parseert vervolgens het antwoord. In dit geval krijgt u een XML-lijst met containers. Laten we eens kijken naar de code voor het aanroepen van de GetRESTRequest-methode om de aanvraag te maken, de aanvraag uit te voeren en vervolgens het antwoord voor de lijst met containers te onderzoeken.

    // 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);
            }
        }
    }
}

Als u een netwerksniffer zoals Fiddler uitvoert bij het aanroepen naar SendAsync, kunt u de aanvraag- en antwoordgegevens zien. We gaan eens kijken. De naam van het opslagaccount is contosorest.

Verzoek:

GET /?comp=list HTTP/1.1

Aanvraagheaders:

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

Statuscode en antwoordheaders geretourneerd na uitvoering:

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

Antwoordtekst (XML): Voor de bewerking Lijstcontainers wordt de lijst met containers en de bijbehorende eigenschappen weergegeven.

<?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>

Nu u begrijpt hoe u de aanvraag maakt, de service aanroept en de resultaten parseert, gaan we kijken hoe u de autorisatieheader maakt.

De autorisatieheader maken

Tip

Azure Storage biedt ondersteuning voor Microsoft Entra-integratie voor blobs en wachtrijen. Microsoft Entra ID biedt een veel eenvoudigere ervaring voor het autoriseren van een aanvraag bij Azure Storage. Zie Autoriseren met Microsoft Entra-id voor het autoriseren van REST-bewerkingen voor meer informatie over het gebruik van Microsoft Entra-id. Zie Toegang tot Azure Storage verifiëren met behulp van Microsoft Entra ID voor een overzicht van Microsoft Entra-integratie met Azure Storage.

Zie Aanvragen autoriseren voor Azure Storage voor meer informatie over autorisatieconcepten.

Laten we dat artikel op de juiste manier destilleren en de code weergeven.

Gebruik eerst autorisatie voor gedeelde sleutels. De indeling van de autorisatieheader ziet er als volgt uit:

Authorization="SharedKey <storage account name>:<signature>"  

Het handtekeningveld is een HMAC (Hash-based Message Authentication Code) die is gemaakt op basis van de aanvraag en berekend met behulp van het SHA256-algoritme en vervolgens gecodeerd met Base64-codering.

Dit codefragment toont de indeling van de handtekeningtekenreeks voor gedeelde sleutels:

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;  

Voor Blob Storage geeft u VERB, md5, inhoudslengte, Canonicalized Headers en Canonicalized Resource op. U kunt de anderen leeg laten voor dit voorbeeld, maar \n opgeven dat ze leeg zijn.

Canonicalisatie is een proces van het standaardiseren van gegevens met meer dan één mogelijke weergave. In dit geval standaardiseert u de headers en de resource. De canonicalized headers zijn de headers die beginnen met 'x-ms-'. De canonieke resource is de URI van de resource, inclusief de naam van het opslagaccount en alle queryparameters (zoals ?comp=list). De canonicaliseerde resource bevat ook eventuele extra queryparameters die u hebt toegevoegd, bijvoorbeeld timeout=60.

Laten we beginnen met de twee canonieke velden, omdat ze vereist zijn om de autorisatieheader te maken.

Canonicalized headers

Als u deze waarde wilt maken, haalt u de headers op die beginnen met 'x-ms-' en sorteert u ze en maakt u deze vervolgens op in een reeks [key:value\n] exemplaren, samengevoegd in één tekenreeks. In dit voorbeeld zien de canonieke headers er als volgt uit:

x-ms-date:Fri, 17 Nov 2017 00:44:48 GMT\nx-ms-version:2017-07-29\n

Dit is de code die wordt gebruikt om die uitvoer te maken:

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();
}

Canonicalized resource

Dit deel van de handtekeningtekenreeks vertegenwoordigt het opslagaccount waarop de aanvraag is gericht. Houd er rekening mee dat de aanvraag-URI is http://contosorest.blob.core.windows.net/?comp=list, met de werkelijke accountnaam (contosorest in dit geval). In dit voorbeeld wordt dit geretourneerd:

/contosorest/\ncomp:list

Als u queryparameters hebt, bevat dit voorbeeld ook deze parameters. Hier volgt de code, die ook aanvullende queryparameters en queryparameters met meerdere waarden verwerkt. Houd er rekening mee dat u deze code bouwt om te werken voor alle REST API's. U wilt alle mogelijkheden opnemen, zelfs als de methode ListContainers niet alle mogelijkheden nodig heeft.

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();
}

Nu de canonieke tekenreeksen zijn ingesteld, gaan we kijken hoe u de autorisatieheader zelf maakt. U begint met het maken van een tekenreeks van de berichthandtekening in de indeling stringToSign die eerder in dit artikel werd weergegeven. Dit concept is eenvoudiger uit te leggen met behulp van opmerkingen in de code, dus hier is het de laatste methode die de autorisatieheader retourneert:

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;
}

Wanneer u deze code uitvoert, ziet de resulterende MessageSignature er als volgt uit:

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

Dit is de uiteindelijke waarde voor AuthorizationHeader:

SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=

AuthorizationHeader is de laatste header die in de aanvraagheaders wordt geplaatst voordat het antwoord wordt geplaatst.

Dit omvat alles wat u moet weten om een klasse samen te stellen waarmee u een aanvraag kunt maken om de Storage Services REST API's aan te roepen.

Voorbeeld: Blobs vermelden

Laten we eens kijken hoe u de code wijzigt om de list-blobs-bewerking voor containercontainer-1 aan te roepen. Deze code is bijna identiek aan de code voor het weergeven van containers, de enige verschillen zijn de URI en hoe u het antwoord parseert.

Als u de referentiedocumentatie voor ListBlobs bekijkt, ziet u dat de methode GET is en dat de RequestURI:

https://myaccount.blob.core.windows.net/container-1?restype=container&comp=list

Wijzig in ListContainersAsyncREST de code waarmee de URI wordt ingesteld op de API voor ListBlobs. De containernaam is container-1.

String uri =
    string.Format("http://{0}.blob.core.windows.net/container-1?restype=container&comp=list",
      storageAccountName);

Wijzig vervolgens waar u het antwoord verwerkt de code om te zoeken naar blobs in plaats van containers.

foreach (XElement container in x.Element("Blobs").Elements("Blob"))
{
    Console.WriteLine("Blob name = {0}", container.Element("Name").Value);
}

Wanneer u dit voorbeeld uitvoert, krijgt u resultaten zoals de volgende:

Canonicalized headers:

x-ms-date:Fri, 17 Nov 2017 05:16:48 GMT\nx-ms-version:2017-07-29\n

Canonicalized resource:

/contosorest/container-1\ncomp:list\nrestype:container

Berichthandtekening:

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

Autorisatieheader:

SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=

De volgende waarden zijn afkomstig van Fiddler:

Verzoek:

GET http://contosorest.blob.core.windows.net/container-1?restype=container&comp=list HTTP/1.1

Aanvraagheaders:

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

Statuscode en antwoordheaders geretourneerd na uitvoering:

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

Antwoordtekst (XML): Dit XML-antwoord toont de lijst met blobs en de bijbehorende eigenschappen.

<?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>

Samenvatting

In dit artikel hebt u geleerd hoe u een aanvraag kunt indienen bij de REST API van Blob Storage. Met de aanvraag kunt u een lijst met containers of een lijst met blobs in een container ophalen. U hebt geleerd hoe u de autorisatiehandtekening maakt voor de REST API-aanroep en hoe u deze gebruikt in de REST-aanvraag. Ten slotte hebt u geleerd hoe u het antwoord kunt onderzoeken.

Volgende stappen