Azure REST API (2) Azure Storage

简介:

 《Windows Azure Platform 系列文章目录

 

  注意:本文适用于国内由世纪互联运维的Azure China。

  本文将会介绍如何使用REST API来直接访问Storage Service。

  项目文件在这里下载

 

  1.首先我们以管理员身份,创建一个Windows Console项目

  2.在Program.cs中,增加如下代码

复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace AzureStorageRestAPI
{
    class Program
    {

        internal class CanonicalizedString
        {

            private StringBuilder canonicalizedString = new StringBuilder();

            internal CanonicalizedString(string initialElement)
            {

                this.canonicalizedString.Append(initialElement);
            }


            internal void AppendCanonicalizedElement(string element)
            {

                this.canonicalizedString.Append("\n");
                this.canonicalizedString.Append(element);
            }

            internal string Value
            {
                get
                {
                    return this.canonicalizedString.ToString();

                }
            }

        }

        const string bloburi = @"https://leidemo.blob.core.chinacloudapi.cn";
        const string accountname = "leidemo";
        const string key = "EZNbnhPJ7+Fv6X5k9OW36ece5WflDJaUvGjdVpdwxEXsKVzEa18/Rw2f30d6ASELNYE7XlvFs78nfCw+UIs3kQ==";
        const string method = "GET";

        static void Main(string[] args)
        {
            string AccountName = accountname;
            string AccountSharedKey = key;
            string Address = bloburi;
            string container = "public";


            // 创建请求字符串
            string QueryString = "?restype=container&comp=list";
            Uri requesturi = new Uri(Address + "/" + container + QueryString);
            string MessageSignature = "";



            // 创建HttpWebRequest类

            HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(requesturi.AbsoluteUri);

            Request.Method = method;

            Request.ContentLength = 0;

            Request.Headers.Add("x-ms-date", DateTime.UtcNow.ToString("R"));

            Request.Headers.Add("x-ms-version", "2009-09-19");



            // 开始创建签名

            MessageSignature += "GET\n"; // Verb

            MessageSignature += "\n"; // Content-Encoding

            MessageSignature += "\n"; // Content-Language

            MessageSignature += "\n"; // Content-Length

            MessageSignature += "\n"; // Content-MD5

            MessageSignature += "\n"; // Content-Type

            MessageSignature += "\n"; // Date

            MessageSignature += "\n"; // If-Modified-Since

            MessageSignature += "\n"; // If-Match

            MessageSignature += "\n"; // If-None-Match

            MessageSignature += "\n"; // If-Unmodified-Since

            MessageSignature += "\n"; // Range



            // CanonicalizedHeaders

            ArrayList list = new ArrayList();

            foreach (string str in Request.Headers.Keys)
            {

                if (str.ToLowerInvariant().StartsWith("x-ms-", StringComparison.Ordinal))
                {

                    list.Add(str.ToLowerInvariant());

                }

            }

            list.Sort();

            foreach (string str2 in list)
            {

                StringBuilder builder = new StringBuilder(str2);

                string str3 = ":";

                foreach (string str4 in GetHeaderValues(Request.Headers, str2))
                {

                    string str5 = str4.Replace("\r\n", string.Empty);

                    builder.Append(str3);

                    builder.Append(str5);

                    str3 = ",";

                }

                MessageSignature += builder.ToString() + "\n";

            }

            MessageSignature += GetCanonicalizedResourceVersion2(requesturi, AccountName);



            // 开始创建签名

            byte[] SignatureBytes = System.Text.Encoding.UTF8.GetBytes(MessageSignature);

            System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(AccountSharedKey));



            // 创建Authorization HTTP消息头的值

            String AuthorizationHeader = "SharedKey " + AccountName + ":" + Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes));



            // 把编码后的签名加入到Authorization HTTP消息头中

            Request.Headers.Add("Authorization", AuthorizationHeader);



            // 获取返回消息

            using (HttpWebResponse response = (HttpWebResponse)Request.GetResponse())
            {

                if (response.StatusCode == HttpStatusCode.OK)
                {

                    // 服务器返回成功消息

                    using (Stream stream = response.GetResponseStream())
                    {

                        using (StreamReader sr = new StreamReader(stream))
                        {



                            var s = sr.ReadToEnd();

                            // 输出返回消息

                            Console.WriteLine(s);

                        }



                    }

                }

                else
                {

                    // 这里可以抛出异常信息

                }

            }

            Console.ReadLine();

        }


        static ArrayList GetHeaderValues(NameValueCollection headers, string headerName)
        {

            ArrayList list = new ArrayList();

            string[] values = headers.GetValues(headerName);

            if (values != null)
            {

                foreach (string str in values)
                {

                    list.Add(str.TrimStart(new char[0]));

                }

            }

            return list;

        }



        static string GetCanonicalizedResourceVersion2(Uri address, string accountName)
        {

            StringBuilder builder = new StringBuilder("/");

            builder.Append(accountName);

            builder.Append(address.AbsolutePath);

            CanonicalizedString str = new CanonicalizedString(builder.ToString());

            NameValueCollection values = HttpUtility.ParseQueryString(address.Query);

            NameValueCollection values2 = new NameValueCollection();

            foreach (string str2 in values.Keys)
            {

                ArrayList list = new ArrayList(values.GetValues(str2));

                list.Sort();

                StringBuilder builder2 = new StringBuilder();

                foreach (object obj2 in list)
                {

                    if (builder2.Length > 0)
                    {

                        builder2.Append(",");

                    }

                    builder2.Append(obj2.ToString());

                }

                values2.Add((str2 == null) ? str2 : str2.ToLowerInvariant(), builder2.ToString());

            }

            ArrayList list2 = new ArrayList(values2.AllKeys);

            list2.Sort();

            foreach (string str3 in list2)
            {

                StringBuilder builder3 = new StringBuilder(string.Empty);

                builder3.Append(str3);

                builder3.Append(":");

                builder3.Append(values2[str3]);

                str.AppendCanonicalizedElement(builder3.ToString());

            }

            return str.Value;

        }

    }
}
复制代码

  

  3.在调试项目的时候,注意修改以下参数:

  const string bloburi = @"https://leidemo.blob.core.chinacloudapi.cn";       //修改为Storage Endpoint

  const string accountname = "leidemo";                       //修改为你的存储账号名称

  const string key = "[YourStorageAccountKey]";                   //修改为你的存储账号Key

  string container = "public";                                //修改为存储账号的Container Name        

 

 

  4.运行成功,你将会看到Console程序输出如下信息,内容为名为存储账号leidemo,Container为public中所有Blob的信息:

 

  参考资料:http://blogs.msdn.com/b/azchina/archive/2010/03/19/windows-azure-rest-api-storage-service.aspx

 


本文转自Lei Zhang博客园博客,原文链接:http://www.cnblogs.com/threestone/p/4742214.html,如需转载请自行联系原作者

目录
相关文章
|
7天前
|
安全 Java API
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)
27 0
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
|
29天前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
21 3
|
3月前
|
JSON 缓存 API
title: 深入理解REST API设计的最佳实践
title: 深入理解REST API设计的最佳实践
36 0
|
4月前
|
分布式计算 Hadoop Java
[hadoop3.x系列]HDFS REST HTTP API的使用(二)HttpFS
[hadoop3.x系列]HDFS REST HTTP API的使用(二)HttpFS
54 1
|
4月前
|
分布式计算 Hadoop API
✨[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
✨[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
63 1
|
17天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
24天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
1月前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
1月前
|
数据采集 JSON API
如何实现高效率超简洁的实时数据采集?——Python实战电商数据采集API接口
你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据采集API接口。
|
1天前
|
API 开发者
邮件API接口使用的方法和步骤
AOKSEND指南:了解和使用邮件API接口,包括选择适合的接口(如AOKSEND、Mailgun、SMTP),获取访问权限,配置发件人、收件人及邮件内容,调用接口发送邮件,并处理返回结果,以高效集成邮件功能。