Bewerkingen REST API aanroepen met gedeelde sleutelautorisatie

In dit artikel wordt beschreven hoe u de Azure Storage REST API's aanroept, inclusief hoe u de autorisatieheader maakt. Het is geschreven vanuit het oogpunt van een ontwikkelaar die niets weet over REST en geen idee heeft hoe een REST-oproep moet worden gedaan. Nadat u hebt geleerd hoe u een REST-bewerking aanroept, kunt u deze kennis gebruiken om andere Azure Storage REST-bewerkingen te gebruiken.

Vereisten

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

  • Visual Studio 2019 installeren met de Azure-ontwikkelworkload.

  • 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 vermeldt. Als u de uitvoer wilt zien, voegt u enkele containers toe aan blobopslag in 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, opent u deze en dubbelklikt u op StorageRestApiAuth.sln.

Over REST

REST staat voor representational state transfer. Zie Wikipedia voor een specifieke definitie.

REST is een architectuur waarmee u met een service kunt communiceren via een internetprotocol, zoals HTTP/HTTPS. REST staat los van de software die wordt uitgevoerd op de server of de client. De REST API kunnen 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, iPhone, iPod of website en dezelfde REST API gebruiken voor al deze platforms.

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

Over de voorbeeldtoepassing

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

Als u het Blob-REST API voor servicesbekijkt, ziet u alle bewerkingen die u kunt uitvoeren op blob-opslag. De opslagclientbibliotheken zijn wrappers rond de REST API's. U hebt dan eenvoudig toegang tot de opslag zonder de REST API's rechtstreeks te gebruiken. Maar zoals hierboven is vermeld, wilt u soms de REST API in plaats van een opslagclientbibliotheek.

Bewerking Containers opslijst

Bekijk de naslag voor de bewerking ListContainers. Deze informatie helpt u te begrijpen waar sommige velden vandaan komen 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 het eindpunt van het Blob Storage-account https://myaccount.blob.core.windows.net en de resourcereeks /?comp=list .

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

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

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

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

Aanvraagheaders:in deze sectie worden de vereiste en optionele aanvraagheaders vermeld. Drie van de headers zijn vereist: een Autorisatie-header, x-ms-date (bevat de UTC-tijd voor de aanvraag) en x-ms-version (hiermee geeft u de versie van de REST API te gebruiken). Het toevoegen van x-ms-client-request-id in de headers is optioneel. U kunt de waarde voor dit veld op alles instellen. Deze wordt naar de logboeken van Opslaganalyse geschreven wanneer logboekregistratie is ingeschakeld.

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

Antwoordstatuscode:geeft aan welke statuscodes u moet kennen. In dit voorbeeld is een HTTP-statuscode 200 ok. Zie Statuscodedefinities voor een volledige lijst met HTTP-statuscodes. Zie Veelvoorkomende foutcodes voor Storage voor meer informatie over foutcodes die specifiek zijn voor REST API Storage REST-API's

Antwoordheaders: dit zijn inhoudstype; x-ms-request-id, de aanvraag-id die u hebt doorgegeven; x-ms-version, waarmee de versie van de gebruikte Blob service aangegeven; en de datum, die zich in UTC voordeed op welk tijdstip de aanvraag is ingediend.

Antwoord body:dit veld is een XML-structuur die de aangevraagde gegevens levert. In dit voorbeeld is het antwoord een lijst met containers en hun eigenschappen.

De REST-aanvraag maken

Gebruik voor beveiliging bij gebruik in productie altijd HTTPS in plaats van HTTP. Voor deze oefening moet u HTTP gebruiken, zodat u de aanvraag- en antwoordgegevens kunt bekijken. Als u de aanvraag- en antwoordgegevens in de werkelijke REST-aanroepen wilt weergeven, kunt u Fiddler of een vergelijkbare toepassing downloaden. In de Visual Studio worden de naam en sleutel van het opslagaccount in de klasse hardcoded. 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 zouden de naam en sleutel van het opslagaccount zich in een configuratiebestand of omgevingsvariabelen bevinden of worden opgehaald uit een Azure Key Vault.

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

Als u de aanvraag wilt maken, 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 object HttpRequestMessage en stel de nettolading in. De nettolading is null voor ListContainersAsyncREST omdat we niets doorgeven.
  • Voeg de aanvraagheaders toe voor x-ms-date en x-ms-version.
  • Haal de autorisatieheader op en voeg deze toe.

Basisinformatie die u nodig hebt:

  • Voor ListContainers is de methode GET . 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, staat de resource op de pagina met referentiedocumentatie met de informatie over de ListContainers-API.
  • De URI wordt samengesteld door het eindpunt voor Blob service opslagaccount te maken en de resource samen tevoegen. De waarde voor aanvraag-URI wordt http://contosorest.blob.core.windows.net/?comp=list uiteindelijk .
  • Voor ListContainers is requestBody null en zijn er geen extra headers.

Verschillende API's kunnen andere parameters hebben om door te geven, zoals ifMatch. Een voorbeeld van waar u ifMatch kunt gebruiken, is wanneer u PutBlob aanroept. In dat geval stelt u ifMatch in op een eTag en wordt de blob alleen bijgewerkt als de door u op te geven eTag 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 overgeslagen.

Stel eerst de uri en payload in.

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

Vervolgens maakt u een instantisatie van de aanvraag en geeft u de methode op GET en geeft u 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 toe voor x-ms-date en x-ms-version . Op deze plaats in de code voegt u ook eventuele extra aanvraagheaders toe die vereist zijn voor de aanroep. In dit voorbeeld zijn er geen extra headers. Een voorbeeld van een API die extra headers door geeft, is de bewerking Container ACL instellen. Met deze API-aanroep wordt een header toegevoegd met de naam 'x-ms-blob-public-access' en de waarde voor het toegangsniveau.

// 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. Verder in het artikel ziet u hoe u de autorisatieheader maakt. 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);

Bevat nu de httpRequestMessage REST-aanvraag, compleet met de autorisatieheaders.

De aanvraag verzenden

Nu u de aanvraag hebt gemaakt, kunt u de SendAsync-methode aanroepen om deze naar de Azure Storage. 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 te bekijken voor de lijst met containers.

    // 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 netwerk-sniffer zoals Fiddler gebruikt bij het aanroepen van SendAsync, kunt u de aanvraag- en antwoordgegevens bekijken. 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 die na de uitvoering worden geretourneerd:

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

Antwoord body (XML): Voor de bewerking Containers weergeven wordt de lijst met containers en de eigenschappen ervan 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 weet hoe u de aanvraag maakt, de service aanroept en de resultaten parseert, gaan we kijken hoe u de autorisatieheader maakt. Het maken van die header is ingewikkeld, maar het goede nieuws is dat wanneer u de code hebt werken, deze werkt voor alle Storage Service REST API's.

De autorisatieheader maken

Tip

Azure Storage ondersteunt nu Azure Active Directory integratie (Azure AD) voor blobs en wachtrijen. Azure AD biedt een veel eenvoudigere ervaring voor het autoriseren van een aanvraag voor Azure Storage. Zie Authorize with Azure Active Directory voor meer informatie over het gebruik van Azure AD om REST-bewerkingen te autor Azure Active Directory. Zie Verificatie van toegang tot uw Azure Storage met behulp van Azure Storage Azure Active Directory voor een overzicht van Azure AD-integratie met Azure Active Directory.

Er is een artikel waarin conceptueel (geen code) wordt uitgelegd hoe u aanvragen voor Azure Storage.

Laten we dat artikel uitseen op exact wat u nodig hebt en de code laten zien.

Gebruik eerst gedeelde sleutelautorisatie. De indeling van de autorisatieheader ziet er als volgende uit:

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

Het handtekeningveld is een Hash-based Message Authentication Code (HMAC) die is gemaakt op basis van de aanvraag en wordt berekend met behulp van het SHA256-algoritme en vervolgens wordt gecodeerd met Base64-codering. Hebt u die? (Blijf hangen, u hebt nog niet eens het woord canonicalized gehoord.)

Dit codefragment toont de indeling van de shared key-handtekeningreeks:

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;  

De meeste van deze velden worden zelden gebruikt. Voor Blob Storage geeft u VERB, md5, inhoudslengte, Canonicalized Headers en Canonicalized Resource op. U kunt de andere leeg laten (maar in de \n zetten zodat deze weet dat ze leeg zijn).

Wat zijn CanonicalizedHeaders en CanonicalizedResource? Goede vraag. Wat betekent canonicalized eigenlijk? Microsoft Word herkent het niet eens als een woord. Dit is wat Wikipedia zegt over canonicalisering:In computerwetenschappen is canonicalisering (soms standaardisatie of normalisatie) een proces voor het converteren van gegevens met meer dan één mogelijke weergave naar een 'standaard', 'normaal' of canonieke vorm. Normaal gesproken betekent dit dat u de lijst met items (zoals headers in het geval van Canonicalized Headers) neemt en standaardiseer ze in een vereiste indeling. In principe heeft Microsoft gekozen voor een indeling die u moet matchen.

Laten we beginnen met deze twee canonieke velden, omdat ze vereist zijn om de autorisatie-header te maken.

Canonieke headers

Als u deze waarde wilt maken, haalt u de headers op die beginnen met 'x-ms-' en sorteert u deze, en maakt u ze op in een tekenreeks met exemplaren, die zijn samenvoegd [key:value\n] in één tekenreeks. In dit voorbeeld zien de canonieke headers er als volgende 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();

    // Create the string in the right format; this is what makes the headers "canonicalized" --
    //   it means put in a standard format. https://en.wikipedia.org/wiki/Canonicalization
    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();
}

Canonieke resource

Dit deel van de handtekeningreeks vertegenwoordigt het opslagaccount dat het doel is van de aanvraag. Houd er rekening mee dat de aanvraag-URI <http://contosorest.blob.core.windows.net/?comp=list> is, 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 is de code, die ook aanvullende queryparameters en queryparameters met meerdere waarden verwerkt. Onthoud dat u deze code bouwt om te werken voor alle REST API's. U wilt alle mogelijkheden opnemen, zelfs als de methode ListContainers deze niet allemaal 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 we de autorisatieheader zelf kunnen maken. 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 gemakkelijker uit te leggen met behulp van opmerkingen in de code. Dit is dus 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 uit te voeren, ziet de resulterende MessageSignature eruit als in dit voorbeeld:

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=

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

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

Voorbeeld: Blobs opslijst

Laten we eens kijken hoe u de code wijzigt om de bewerking List Blobs voor container container-1 aan te roepen. Deze code is bijna identiek aan de code voor het in een lijst met containers. De enige verschillen zijn de URI en hoe u het antwoord parseert.

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

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

Wijzig in ListContainersAsyncREST de code die de URI in de API voor ListBlobs in stelt. 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 uit te voeren, krijgt u resultaten als de volgende:

Canonieke headers:

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

Canonieke 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 die na de uitvoering worden geretourneerd:

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

Antwoord body (XML): Dit XML-antwoord toont de lijst met blobs en hun 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 blobopslag REST API. 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 voor de REST API en hoe u deze kunt gebruiken in de REST-aanvraag. Ten slotte hebt u geleerd hoe u het antwoord kunt onderzoeken.

Volgende stappen