笔记—华为OBS存储API调用
1 获取AK和SK
购买后从官网获取
略
2 计算鉴权签名
采用在请求头headers中携带签名的方式
Java和Python的计算方式:https://support.huaweicloud.com/api-obs/obs_04_0010.html#section1
Ruby的计算方式:
# @@UserName 桶名
# @@AccessKeyId AK
# @@SecretAccessKey SK
require 'base64'
require "uri"
require "net/http"
# 构建请求头鉴权签名
def self.get_signature(method, content_type='')
date = DateTime.now.httpdate
canonical_string = method + "\n" + "\n" + content_type + "\n" + date + "\n" + "/"
digest = OpenSSL::Digest.new('sha1')
signature = Base64.encode64(OpenSSL::HMAC.digest(digest, @@SecretAccessKey, canonical_string))
authorization = "OBS " + @@AccessKeyId + ":" + signature.to_s.strip
{authorization: authorization, date: date}
end
3 发送请求
3.1 获取桶列表
get请求
require "uri"
require 'rexml/document'
require 'active_support/core_ext/hash'
# 获取桶列表
url = URI("http://obs.*******.huaweihaiercloud.com/")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
signature = get_signature("GET")
request["Authorization"] = signature[:authorization]
request["Host"] = "obs.*******.huaweihaiercloud.com"
request["Date"] = signature[:date]
response = http.request(request)
data = Hash.from_xml(response.read_body)
data["ListAllMyBucketsResult"]["Buckets"]["Bucket"]
3.2 上传对象
PUT/POST请求
以PUT请求为例
require "uri"
require 'rexml/document'
require 'active_support/core_ext/hash'
@@UserName = '桶名'
# 上传对象
url = URI('http://' + @@UserName + '.obs.*******.huaweihaiercloud.com/' + '对象名')
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Put.new(url)
signature = get_signature("PUT", file[:file_type])
request["Authorization"] = signature[:authorization]
request["Host"] = @@UserName + '.obs.*******.huaweihaiercloud.com'
request["Date"] = signature[:date]
request["Content-Type"] = file[:file_type]
request.body = file[:data]
response = http.request(request)
data = Hash.from_xml(response.read_body)
3.3 下载对象
require 'base64'
require "uri"
require "net/http"
require 'nokogiri'
require 'rexml/document'
require 'active_support/core_ext/hash'
@@UserName = '桶名'
# 下载文件 示例:a=HuaweiObsLib.downloadFile({:uuid=>'11111',:filename => "test.png"})
def self.downloadFile(file)
ext = file[:filename].split(".").last.to_s || ''
new_filename = [file[:uuid], ext].join(".")
url = URI('http://' + @@UserName + '.obs.*******.huaweihaiercloud.com/' + new_filename)
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
signature = get_signature("GET", "", "", '/' + @@UserName + '.obs.*******.huaweihaiercloud.com/' + new_filename)
request["Authorization"] = signature[:authorization]
request["Host"] = 'http://' + @@UserName + '.obs.*******.huaweihaiercloud.com/'
request["Date"] = signature[:date]
request["HTTP-Verb"] = "GET"
response = http.request(request)
end
3.4 删除对象
require 'base64'
require "uri"
require "net/http"
require 'nokogiri'
require 'rexml/document'
require 'active_support/core_ext/hash'
@@UserName = '桶名'
# 删除文件
def self.deleteFile(file)
ext = file[:filename].split(".").last.to_s || ''
new_filename = [file[:uuid], ext].join(".")
url = URI('http://' + @@UserName + '.obs.*******.huaweihaiercloud.com/' + new_filename)
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Delete.new(url)
signature = get_signature("DELETE", "", "", '/' + @@UserName + '.obs.*******.huaweihaiercloud.com/' + new_filename)
request["Authorization"] = signature[:authorization]
request["Host"] = 'http://' + @@UserName + '.obs.*******.huaweihaiercloud.com/'
request["Date"] = signature[:date]
response = http.request(request)
end
-…—…–.-/–…----…–/-.-…–…–…-/-…—.-…–.