以下是一个使用Ruby实现的Amazon销售合作伙伴API签名请求的示例代码:
require 'uri'
require 'net/http'
require 'openssl'
require 'base64'
def generate_signature(request_url, http_method, secret_key, access_key, timestamp)
# 构建要签名的字符串
string_to_sign = "#{http_method}\n#{URI.parse(request_url).host}\n#{URI.parse(request_url).path}\n#{URI.parse(request_url).query}\n#{timestamp}"
# 使用HMAC-SHA256算法计算签名
signature = OpenSSL::HMAC.digest('sha256', secret_key, string_to_sign)
# 对签名进行Base64编码
encoded_signature = Base64.strict_encode64(signature)
# 返回编码后的签名
return encoded_signature
end
def send_api_request(request_url, http_method, access_key, secret_key)
# 获取当前时间戳
timestamp = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
# 生成签名
signature = generate_signature(request_url, http_method, secret_key, access_key, timestamp)
# 构建HTTP请求
uri = URI.parse(request_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == 'https'
if http_method == 'GET'
request = Net::HTTP::Get.new(uri.request_uri)
elsif http_method == 'POST'
request = Net::HTTP::Post.new(uri.request_uri)
else
# 其他HTTP方法的处理...
end
# 设置必要的请求头
request['Authorization'] = "AWS #{access_key}:#{signature}"
request['Content-Type'] = 'application/json'
request['Host'] = uri.host
request['x-amz-date'] = timestamp
# 发送请求并返回响应
response = http.request(request)
return response
end
# 示例用法
request_url = 'https://api.example.com/products'
http_method = 'GET'
access_key = 'your-access-key'
secret_key = 'your-secret-key'
response = send_api_request(request_url, http_method, access_key, secret_key)
puts response.body
请注意,这只是一个示例代码,需要根据实际情况进行适当的修改和调整,比如根据实际的API请求URL、HTTP方法和请求头等进行设置。另外,在实际使用中,建议将access key和secret key存储在安全的地方,并使用环境变量或其他安全的方式进行读取。