需求背景:
今天帮同学解决一个问题,对方给了一个英文文档,intel那边只给了一些文章id(文章ID是放在很多个文件的json数组里的.),要把文章内容拿到在平板上进行展示.
我看了下文档上提供了两种方案,第一种是通过AWS的方式.第二种直接通过URL把文章内容呈现出来.
比较而言,第二种通过http请求,只需要生成token信息,在带上文章ID,发出一个请求后,拿到真正的文章的URL就基本搞定了.再次请求,直接把返回的页面内容展示出来即可.
但是同学的需求是,希望拿到一些信息按照自己的方式来展示.而第一种方法,是通过文章id获取json信息(里面包含了文章的一些元数据,比如标题,内容,图片等),这样的信息就可以根据自己的需要灵活展现了.
难点是这个要访问S3进行获取,于是去网上研究了下S3.
S3是啥?
英文含义为:Simple storage serviece (简称S3),顾名思义,提供存储服务,这是一个公开的服务,使 Web 开发人员能够存储数字资产(如图片、视频、音乐和文档等),以便在应用程序中使用。
Amazon 的 S3 服务没有重复开发,它公开了 RESTful API,使您能够使用任何支持 HTTP 通信的语言访问 S3 。关于REST,这也是比较火的一种Web服务架构。简单来说,资源是由URI指定,对资源的操作包括GET、PUT、POST、DELETE和HEAD,返回结果常常是XML或者其他形式。
S3里的几个概念:
Amazon S3的操作包括三部分:Service,Buckets和Objects。Service只包括GET操作,就是返回所有的Buckets的列表。Object顾名思义,是指存储在云端的文件,值得注意的是,S3中并没有明确的文件夹的概念,而是通过指定object的路径来实现,比如说,object可以为“photos/1.jpg”。而Bucket拥有全局名,名称由用户定义,用来存放Object,由于是全局名,所以要确保名字是别人没用过的。
通过REST的方式访问资源,根据官方文档:
在S3上注册后,会给你Access Key Id和Secret Access Key.前者是标识你的身份,后者是秘钥用来生成签名,确保内容安全.无论是创建bucket,还是对object进行操作,都需要经过系统的认证才行.
在发出请求时,请求方会对请求内容通过HMAC-SHA1算法生成签名.
在服务端收到请求后,会再次针对请求内容生成签名,与请求发过来的签名进行对比,如果一致,则为合法,否则认证不通过.
发出的请求格式大致如下:
Host: johnsmith.s3.amazonaws.com
Date: Mon, 26 Mar 2007 19:37:58 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg=
重点是Authorization这个串的生成.由如下部分组成:
如下是构建认证请求头的伪代码:
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( YourSecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"]; CanonicalizedAmzHeaders = <described below>
代码例子:
把同学的例子按照python的方式进行编写的话,如下:
#-*- coding: utf-8 -*- import urllib2 import hashlib import datetime import base64 import exceptions import hmac GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT' MyAccessKey = 'xxxxxxxxxxx' MySecretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' myDate = datetime.datetime.utcnow().strftime(GMT_FORMAT) def authStr(): mystr = "GET\n\n\n" + myDate + "\n/tmc-json/70226.json" myhmac = hmac.new(MySecretKey, digestmod=hashlib.sha1) myhmac.update(mystr) signStr=base64.encodestring( myhmac.digest()) result = "AWS %s:%s" % (MyAccessKey, signStr) return result.strip() def start(): req = urllib2.Request('http://s3.amazonaws.com/tmc-json/70226.json') req.add_header('Date', myDate) req.add_header('AWSAccessKeyId', MyAccessKey) req.add_header('Authorization', authStr()) print req.headers response = urllib2.urlopen(req) print response.read() if __name__ == "__main__": start()
因为我们是get信息,所以请求头里的Content-MD5,Content-Type等信息默认可以为空.但是换行符什么的还是要有的. 这里的tmc-json就是一个bucket,70226是文章的id.最终认证通过可以获取到文章的json信息.
多插一句,如果通过js来做这个事情,就是要找支持这个加密算法的类库了.
https://code.google.com/p/crypto-js/#HMAC
参考如下代码:
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js"></script> <script> var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "Secret Passphrase"); hmac.update("Message Part 1"); hmac.update("Message Part 2"); hmac.update("Message Part 3"); var hash = hmac.finalize(); </script>
参考资源链接:
http://www.lixin.me/blog/2012/01/28/29213
http://aws.amazon.com/cn/console/
http://www.91r.net/ask/15599337.html
http://www.ibm.com/developerworks/cn/java/j-s3/ IBM上的文章提到了一个java类库: JetS3t可以简化实现类似的效果.
相关推荐
亚马逊S3 API文档是Amazon Simple Storage Service (S3)的官方参考手册,它详细描述了如何使用S3的REST API进行数据的存储和检索。文档中包含了关于如何操作S3的基本概念、使用方法、身份验证以及数据类型等重要信息...
亚马逊S3(Simple Storage Service)是亚马逊网络服务(Amazon Web Services,AWS)提供的一个高度可扩展的对象存储服务,主要用于网络上存储和检索任意大小的数据。本文将根据提供的文件内容,详细解读亚马逊S3接口...
# Amazon S3 API 手册知识点详解 ## Amazon S3 REST API ...对于开发者来说,理解这些知识点对于高效地使用 Amazon S3 服务至关重要。无论是构建 Web 应用程序还是移动应用,Amazon S3 都能提供强大的数据存储支持。
在Android项目中使用亚马逊S3服务,首先需要引入亚马逊的SDK。这可以通过在`build.gradle`文件中添加依赖来完成。例如,如果你使用的是Gradle,可以在app模块的`build.gradle`文件中添加如下依赖: ```groovy ...
Amazon S3,全称为Amazon Simple Storage Service,是亚马逊云服务提供的一个高度可扩展、安全且持久的云存储解决方案。这个服务允许用户存储和检索任意数量的数据,无论数据规模大小,适用于备份、归档、网站托管等...
本文档为Amazon S3 Java SDK使用手册,旨在为开发者提供关于如何在Java项目中安装与使用Amazon S3(Simple Storage Service)服务的详细指南。文档涵盖从安装SDK、初始化配置到操作对象存储的各项功能,包括管理存储...
首先,文档提到了版权信息,指出Amazon的商标和外观设计不得与非亚马逊产品或服务一起使用,也不得用于可能导致混淆客户或以任何方式贬低或不尊重亚马逊的方式。其他不属于亚马逊的商标是各自所有者的财产。 接着,...
1. S3对象存储接口文档的中文版本提供了关于亚马逊S3存储的官方技术文档,当前主要版本为2015年8月13日发布的版本。 2. 文档中提到了适用于.NET框架的开发工具包(***SDK),它是用于Amazon Web Services的一个开源C#...
亚马逊S3(Simple Storage Service)是亚马逊Web Services(AWS)提供的一个高度可扩展、安全可靠的云存储服务。它允许开发者和企业存储、检索和备份大量数据,并提供了丰富的数据管理功能。在本文中,我们将深入...
亚马逊简单存储服务(Amazon S3)是亚马逊网络服务(AWS)提供的对象存储服务,适用于数据存储、备份和大数据分析等多种场景。S3 API是S3服务的接口,允许开发者通过编程方式与S3进行交互。从提供的文件内容中,我们...
Amazon S3(Simple Storage Service)是亚马逊公司提供的一项云存储服务,旨在为互联网应用程序提供安全、可扩展且高度可用的数据存储。本开发指南是作者对官方文档的中文翻译,尽管可能存在一些翻译上的不准确之处...
而Amazon S3(Simple Storage Service)是AWS提供的一个云存储服务,用于存储和检索任何数量的数据,无论何时何地。本篇文章将深入探讨如何在SpringBoot项目中集成AWS S3 SDK(Java V2版本),实现对象的分页列表、...
标题中的“aws亚马逊的S3库实现”指的是Amazon S3(Simple Storage Service)的客户端库,这是一种由亚马逊提供的云存储服务。S3允许用户在线存储和检索数据,并提供了高可用性、耐用性和可扩展性。这个库是用C语言...
《使用Coldfusion与Amazon AWS S3服务的实战指南》 在现代互联网开发中,云存储服务已经成为不可或缺的一部分,其中Amazon的AWS S3(Simple Storage Service)尤为突出。本篇文章将详细解析如何在Coldfusion环境中...
亚马逊的对象存储,通常被称为Amazon S3(Simple Storage Service),是亚马逊网络服务(AWS)提供的一种云存储解决方案。它为开发者和企业提供了高度可扩展、可靠且安全的数据存储平台,用于托管静态网页、备份数据...
亚马逊云存储AWS S3是亚马逊提供的一项全球性的存储服务,允许用户存储并检索任何数量的数据,任何时候,任何地点,通过互联网访问。第三方应用通过AWS提供的API接口可以实现对S3的读写操作,但是实际使用过程中,会...
Amazon S3,全称为Amazon Simple Storage Service,是亚马逊公司提供的一种云存储服务,旨在为互联网用户提供高可用性、高持久性和低成本的数据存储解决方案。通过使用S3,开发者和企业能够安全地存储和检索任何数量...
Amazon S3 是亚马逊云科技提供的一种高效、可靠的对象存储服务。通过本指南,读者可以全面了解 Amazon S3 的功能、如何设置环境、实现基本的操作以及使用第三方库来优化开发流程。无论是对于初学者还是有经验的...
使用 Amazon S3 sdk 将文件上传到 amazon s3 的示例 AWS-SDK 要安装所有组件,请打开终端并导航到您将项目克隆到的目录。 然后运行以下命令: npm install 配置 如果要启用 Amazon S3 服务,请确保设置适当的...