Operasi panggilan REST API dengan otorisasi Kunci Bersama

Artikel ini memperlihatkan cara memanggil operasi REST API Azure Storage dengan membuat permintaan REST resmi menggunakan C#. Setelah mempelajari cara memanggil operasi REST API untuk Blob Storage, Anda dapat menggunakan langkah serupa untuk operasi Azure Storage REST lainnya.

Prasyarat

Aplikasi sampel mencantumkan kontainer blob untuk akun penyimpanan. Untuk mencoba kode dalam artikel ini, Anda memerlukan item berikut:

  • Instal Visual Studio dan sertakan beban kerja pengembangan Azure. Contoh ini dibuat menggunakan Visual Studio 2019. Jika Anda menggunakan versi yang berbeda, panduan mungkin sedikit berbeda.

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

  • Akun penyimpanan tujuan umum. Jika Anda tidak memiliki akun penyimpanan, lihat Membuat akun penyimpanan.

  • Contoh dalam artikel ini memperlihatkan cara mencantumkan kontainer di akun penyimpanan. Untuk melihat output, tambahkan beberapa kontainer blob ke akun penyimpanan sebelum Anda memulai.

Mengunduh aplikasi contoh

Aplikasi contoh adalah aplikasi konsol yang ditulis dalam C#.

Gunakan git untuk mengunduh salinan aplikasi ke lingkungan pengembangan Anda.

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

Perintah ini mengkloning repositori ke folder git lokal Anda. Untuk membuka solusi Visual Studio, navigasikan ke folder storage-dotnet-rest-api-with-auth dan buka StorageRestApiAuth.sln.

Tentang REST

Representational State Transfer (REST) adalah arsitektur yang memungkinkan Anda berinteraksi dengan layanan melalui protokol internet, seperti HTTP/HTTPS. REST tidak tergantung pada perangkat lunak yang berjalan di server atau klien. REST API dapat dipanggil dari platform apa pun yang mendukung HTTP/HTTPS. Anda dapat menulis aplikasi yang berjalan di Mac, Windows, Linux, ponsel atau tablet Android, iPhone, iPod, atau situs web, dan menggunakan REST API yang sama untuk semua platform tersebut.

Panggilan ke REST API terdiri dari permintaan yang dibuat oleh klien, dan respons yang dikembalikan oleh layanan. Dalam permintaan, Anda mengirim URL berisi informasi tentang operasi mana yang ingin Anda panggil, sumber daya untuk ditindaklanjuti, parameter dan header kueri apa pun, dan tergantung pada operasi yang dipanggil, muatan data. Respons dari layanan ini mencakup kode status, sekumpulan header respons, dan tergantung pada operasi yang dipanggil, muatan data.

Tentang aplikasi sampel

Aplikasi sampel mencantumkan kontainer dalam akun penyimpanan. Setelah Anda memahami bagaimana informasi dalam dokumentasi REST API berkorelasi dengan kode aktual, panggilan REST lainnya lebih mudah dimengerti.

Jika Anda melihat Blob Service REST API, Anda akan melihat semua operasi yang dapat Anda lakukan pada penyimpanan blob. Pustaka klien penyimpanan adalah pembungkus di sekitar REST API, sehingga memudahkan untuk mengakses sumber daya penyimpanan tanpa menggunakan REST API secara langsung. Namun, terkadang, Anda mungkin ingin menggunakan REST API alih-alih pustaka klien penyimpanan.

Operasi List Containers

Artikel ini berfokus pada operasi Daftar Kontainer . Informasi berikut membantu Anda memahami beberapa bidang dalam permintaan dan respons.

Metode Permintaan: GET. Kata kerja ini adalah metode HTTP yang Anda tentukan sebagai properti objek permintaan. Nilai lain untuk kata kerja ini termasuk HEAD, PUT, dan DELETE, tergantung pada API yang Anda panggil.

URI Permintaan: https://myaccount.blob.core.windows.net/?comp=list. URI Permintaan dibuat dari titik akhir akun penyimpanan blob https://myaccount.blob.core.windows.net dan string sumber daya /?comp=list.

Parameter URI: Ada parameter kueri tambahan yang dapat Anda gunakan saat memanggil ListContainers. Beberapa parameter ini adalah timeout panggilan (dalam detik) dan awalan, yang digunakan untuk pemfilteran.

Parameter bermanfaat lainnya adalah maxresults: jika lebih banyak kontainer tersedia daripada nilai ini, isi respons akan berisi elemen NextMarker yang menunjukkan kontainer berikutnya untuk kembali pada permintaan berikutnya. Untuk menggunakan fitur ini, Anda menyediakan nilai NextMarker sebagai parameter penanda di URI saat Anda membuat permintaan berikutnya. Saat menggunakan fitur ini, dianalogikan untuk penomoran halaman melalui hasilnya.

Untuk menggunakan parameter tambahan, tambahkan parameter tersebut ke string resource dengan nilai, seperti contoh ini:

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

Header Permintaan: Bagian ini mencantumkan header permintaan yang diperlukan dan opsional. Tiga header diperlukan: header Otorisasi, x-ms-date (berisi waktu UTC untuk permintaan), dan x-ms-version (menentukan versi REST API yang akan digunakan). Menyertakan x-ms-client-request-id di header bersifat opsional. Anda dapat mengatur nilai untuk bidang ini ke apa pun, dan ditulis ke log analitik penyimpanan saat pengelogan diaktifkan.

Isi Permintaan: Tidak ada isi permintaan untuk ListContainers. Isi Permintaan digunakan pada semua operasi PUT saat mengunggah blob, termasuk SetContainerAccessPolicy. Isi Permintaan memungkinkan Anda mengirim daftar XML kebijakan akses tersimpan untuk diterapkan. Kebijakan akses tersimpan dibahas dalam artikel Menggunakan Tanda Tangan Akses Bersama (SAS).

Kode Status Respons: Memberi tahu kode status apa pun yang perlu Anda ketahui. Dalam contoh ini, kode status HTTP 200 adalah ok. Untuk daftar lengkap kode status HTTP, lihat Definisi Kode Status. Untuk melihat kode galat khusus untuk Storage REST API, lihat Kode galat REST API umum

Header Respons: Ini termasuk Jenis Konten; x-ms-request-id, yang merupakan ID permintaan yang Anda lewati; x-ms-version, yang menunjukkan versi layanan Blob yang digunakan; dan Tanggal , yang dalam UTC dan memberitahu jam berapa permintaan dibuat.

Badan Respons: Bidang ini adalah struktur XML yang menyediakan data yang diminta. Dalam contoh ini, responsnya adalah daftar kontainer dan propertinya.

Membuat permintaan REST

Untuk keamanan saat berjalan dalam produksi, selalu gunakan HTTPS alih-alih HTTP. Untuk tujuan latihan ini, kami menggunakan HTTP sehingga Anda dapat melihat data permintaan dan respons. Untuk melihat informasi permintaan dan respons dalam panggilan REST aktual, Anda dapat mengunduh Fiddler atau aplikasi serupa. Dalam solusi Visual Studio, nama dan kunci akun penyimpanan dikodekan keras di kelas. Metode ListContainersAsyncREST meneruskan nama akun penyimpanan dan kunci akun penyimpanan ke metode yang digunakan untuk membuat berbagai komponen permintaan REST. Dalam aplikasi nyata, nama akun penyimpanan dan kunci akan berada dalam file konfigurasi, variabel lingkungan, atau diambil dari Azure Key Vault.

Dalam sampel proyek kami, kode untuk membuat header Otorisasi berada di kelas terpisah. Idenya adalah Anda dapat membawa seluruh kelas dan menambahkannya ke solusi Anda sendiri dan menggunakannya "sebagaimana adanya". Kode header Otorisasi berfungsi untuk sebagian besar panggilan REST API ke Azure Storage.

Untuk membuat permintaan, yang merupakan objek HttpRequestMessage, buka ListContainersAsyncREST di Program.cs. Langkah-langkah untuk membangun permintaan adalah:

  • Buat URI yang akan digunakan untuk memanggil layanan.
  • Buat objek HttpRequestMessage dan atur payload. Payload bersifatt null untuk ListContainersAsyncREST karena kita tidak memasukkan apa pun.
  • Tambahkan header permintaan untuk x-ms-date dan x-ms-version.
  • Dapatkan header otorisasi dan tambahkan.

Beberapa informasi dasar yang Anda butuhkan:

  • Untuk ListContainers, metodenya adalah GET. Nilai ini diatur saat instansiasi permintaan.
  • Sumber dayanya adalah bagian kueri dari URI yang menunjukkan API mana yang dipanggil, sehingga nilainya adalah /?comp=list. Seperti yang telah disebutkan, sumber daya ada di halaman dokumentasi referensi yang menampilkan informasi tentang ListContainers API.
  • URI dibangun dengan membuat titik akhir layanan Blob untuk akun penyimpanan tersebut dan menggabungkan sumber daya. Nilai URI permintaan akhirnya menjadi http://contosorest.blob.core.windows.net/?comp=list.
  • Untuk ListContainers, requestBody menjadi null dan tidak ada header tambahan.

API yang berbeda mungkin memiliki parameter lain untuk diteruskan seperti ifMatch. Contoh tempat Anda dapat menggunakan ifMatch adalah saat memanggil PutBlob. Dalam hal ini, Anda mengatur ifMatch ke eTag, dan hanya memperbarui blob jika eTag yang Anda sediakan cocok dengan eTag saat ini pada blob. Jika orang lain telah memperbarui blob sejak mengambil eTag, perubahan mereka tidak akan ditimpa.

Pertama, atur uri dan 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;

Selanjutnya, instansiasi permintaan, atur metodenya ke GET dan sediakan URI.

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

Tambahkan header permintaan untuk x-ms-date dan x-ms-version. Tempat ini dalam kode juga merupakan tempat Anda menambah header permintaan tambahan yang diperlukan untuk panggilan. Dalam contoh ini, tidak ada header tambahan. Contoh API yang melewati header tambahan adalah operasi Set Container ACL. Panggilan API ini menambahkan header yang disebut "x-ms-blob-public-access" dan nilai untuk tingkat akses.

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

Panggil metode yang membuat header otorisasi dan tambahkan ke header permintaan. Header otorisasi dibuat nanti di artikel. Nama metodenya adalah GetAuthorizationHeader, yang dapat Anda lihat dalam cuplikan kode ini:

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

Pada titik ini, httpRequestMessage berisi permintaan REST lengkap dengan header otorisasi.

Mengirim permintaan

Setelah membuat permintaan, Anda dapat memanggil metode SendAsync untuk mengirimkannya ke Azure Storage. Periksa apakah nilai kode status respons adalah 200, yang berarti operasinya telah berhasil. Selanjutnya, memilah respons. Dalam hal ini, Anda mendapatkan daftar kontainer XML. Mari kita lihat kode untuk memanggil metode GetRESTRequest untuk membuat permintaan, menjalankan permintaan, lalu memeriksa respons untuk daftar kontainer.

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

Jika Anda menjalankan pelacak jaringan seperti Fiddler saat melakukan panggilan ke SendAsync, Anda dapat melihat informasi permintaan dan respons. Mari kita lihat. Nama akun penyimpanannya adalah contosorest.

Permintaan:

GET /?comp=list HTTP/1.1

Header permintaan:

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

Kode status dan header respons dikembalikan setelah eksekusi:

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

Badan respons (XML): Untuk operasi List Containers, ini memperlihatkan daftar kontainer dan propertinya.

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

Sekarang setelah Anda memahami cara membuat permintaan, memanggil layanan, dan memilah hasilnya, mari kita lihat cara membuat header otorisasi.

Buat header otorisasi

Tip

Azure Storage mendukung integrasi Microsoft Entra untuk blob dan antrean. ID Microsoft Entra menawarkan pengalaman yang jauh lebih sederhana untuk mengotorisasi permintaan ke Azure Storage. Untuk informasi selengkapnya tentang menggunakan ID Microsoft Entra untuk mengotorisasi operasi REST, lihat Mengotorisasi dengan ID Microsoft Entra. Untuk gambaran umum integrasi Microsoft Entra dengan Azure Storage, lihat Mengautentikasi akses ke Azure Storage menggunakan ID Microsoft Entra.

Untuk mempelajari selengkapnya tentang konsep otorisasi, lihat Mengotorisasi permintaan ke Azure Storage.

Mari kita suling artikel itu ke yang diperlukan dan lihat kodenya.

Pertama, gunakan otorisasi Kunci Bersama. Format header otorisasi terlihat seperti ini:

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

Bidang tanda tangan adalah Kode Autentikasi Pesan Berbasis Hash (HMAC) yang dibuat dari permintaan dan dihitung menggunakan algoritma SHA256, lalu dikodekan menggunakan pengodean Base64.

Cuplikan kode ini memperlihatkan format string tanda tangan Kunci Bersama:

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;  

Untuk penyimpanan Blob, Anda menentukan KATA KERJA, md5, panjang konten, Header Kanonis, dan Sumber Daya Kanonis. Anda dapat membiarkan yang lain kosong untuk contoh ini, tetapi dimasukkan \n ke untuk menentukan bahwa mereka kosong.

Kanonisisasi adalah proses standardisasi data yang memiliki lebih dari satu representasi yang mungkin. Dalam hal ini, Anda menstandarkan header dan sumber daya. Header kanonis adalah header yang dimulai dengan "x-ms-". Sumber daya kanonis adalah URI sumber daya, termasuk nama akun penyimpanan dan semua parameter kueri (seperti ?comp=list). Sumber daya kanonis juga menyertakan parameter kueri tambahan yang mungkin telah Anda tambahkan, seperti timeout=60, misalnya.

Mari kita mulai dengan dua bidang kanonis, karena bidang tersebut diperlukan untuk membuat header Otorisasi.

Header kanonis

Untuk membuat nilai ini, ambil header yang dimulai dengan "x-ms-" dan urutkan, lalu format menjadi serangkaian instans [key:value\n], digabungkan menjadi satu string. Untuk contoh ini, header kanonikal terlihat seperti ini:

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

Berikut adalah kode yang digunakan untuk membuat output tersebut:

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

Sumber daya kanonis

Bagian dari string tanda tangan ini mewakili akun penyimpanan yang ditargetkan oleh permintaan. Ingatlah bahwa Permintaan URI adalah http://contosorest.blob.core.windows.net/?comp=list, dengan nama akun aktual (dalam hal ini contosorest). Dalam contoh, ini dikembalikan:

/contosorest/\ncomp:list

Jika Anda memiliki parameter kueri, contoh ini juga menyertakan parameter tersebut. Berikut kodenya, yang juga menangani parameter kueri tambahan dan parameter kueri dengan banyak nilai. Ingat bahwa Anda sedang membangun kode ini agar bekerja ke semua REST API. Anda ingin menyertakan semua kemungkinan, bahkan jika metode ListContainers tidak memerlukan semuanya.

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

Sekarang setelah string kanonis diatur, mari kita lihat cara membuat header otorisasi itu sendiri. Anda mulai dengan membuat serangkaian tanda tangan pesan dalam format StringToSign yang sebelumnya ditampilkan di artikel ini. Konsep ini lebih mudah dijelaskan menggunakan komentar dalam kode, jadi ini dia, metode akhir yang mengembalikan Header Otorisasi:

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

Saat Anda menjalankan kode ini, MessageSignature yang dihasilkan terlihat seperti contoh ini:

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

Berikut adalah nilai akhir untuk AuthorizationHeader:

SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=

AuthorizationHeader adalah header terakhir yang ditempatkan di header permintaan sebelum memposting respons.

Itu mencakup semua yang perlu Anda ketahui untuk menyusun kelas sehingga Anda dapat membuat permintaan untuk memanggil Storage Services REST API.

Contoh: Daftar blob

Mari kita lihat cara mengubah kode untuk memanggil operasi List Blobs untuk kontainer container-1. Kode ini hampir identik dengan kode untuk mencantumkan kontainer, satu-satunya perbedaan adalah URI dan cara Anda memilah respons.

Jika Anda melihat dokumentasi referensi untuk ListBlobs, Anda menemukan bahwa metodenya adalah GET dan RequestURI adalah:

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

Di ListContainersAsyncREST, ubah kode yang menetapkan URI ke API untuk ListBlobs. Nama kontainernya adalah container-1.

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

Lalu di tempat Anda menangani respons, ubah kode untuk mencari blob alih-alih kontainer.

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

Saat menjalankan sampel ini, Anda mendapatkan hasil seperti berikut ini:

Header kanonis:

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

Sumber daya kanonis:

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

Tanda tangan pesan:

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

Header otorisasi:

SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=

Nilai berikut berasal dari Fiddler:

Permintaan:

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

Header permintaan:

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

Kode status dan header respons dikembalikan setelah eksekusi:

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

Badan respons (XML): Respons XML ini memperlihatkan daftar blob dan propertinya.

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

Ringkasan

Dalam artikel ini, Anda mempelajari cara membuat permintaan ke penyimpanan blob REST API. Dengan permintaan, Anda dapat mengambil daftar kontainer atau daftar blob dalam kontainer. Anda mempelajari cara membuat tanda tangan otorisasi untuk panggilan REST API dan cara menggunakannya dalam permintaan REST. Terakhir, Anda belajar cara memeriksa respons.

Langkah berikutnya