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,如需转载请自行联系原作者

目录
相关文章
|
15天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
38 10
|
1月前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
57 11
|
2月前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
4月前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
4月前
|
JSON JavaScript API
编写REST API
编写REST API
82 2
|
3月前
|
Java API Maven
使用 Smart-doc 记录 Spring REST API
使用 Smart-doc 记录 Spring REST API
77 0
|
2天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
8天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
51 11
|
1月前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
81 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
19天前
|
JSON 安全 API
淘宝商品详情API接口(item get pro接口概述)
淘宝商品详情API接口旨在帮助开发者获取淘宝商品的详细信息,包括商品标题、描述、价格、库存、销量、评价等。这些信息对于电商企业而言具有极高的价值,可用于商品信息展示、市场分析、价格比较等多种应用场景。

热门文章

最新文章