go语言调用阿里云openAPI实战

2017-05-18  江永道 

简介:

目前在一家云计算公司做测试,所以会接触阿里云的一些相关知识,其中就包括调用阿里云的open API,当然也有封装好的sdk,像python,java的,都是有sdk,不过没看到有go语言的sdk,所以研究了下这方面的知识,目前正好可以使用,就和大家分享分享,以便帮助需要的同学.

用途:

为什么要调用阿里的open API,其实做测试有的时候一些数据,还是需要自己去获取或制造的,写个什么脚本啊,与云计算相关的都要用到。


案例:

以发送邮件为例子,阿里云每天有200封的免费额度可以使用,像个人网站就可以用用,找回密码什么的就可以用阿里云的邮件推送服务




好了,先看看这个邮件发送接口的参数(详情可以去阿里云帮助文档找到产品邮件推送),有些是必填,有些是可选的,其中有一项比较重要的就是签名(不过这个是包含在公共参数中)

接口参数:

公共参数:


看下面代码:


package main

import (
	"crypto/hmac"
	"crypto/sha1"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
	"time"
)

const (
	//这里需要替换成自己的,我就用星号代替了
	AccessKeyId = "******"
	secret      = "*****"
)

var Aliyun map[string]interface{}

func PercentEncode(str string) string {
	//替换字符串
	str = strings.Replace(str, "+", "%20", -1)
	str = strings.Replace(str, "*", "%2A", -1)
	str = strings.Replace(str, "%7E", "~", -1)
	return str
}

func CreateSignature(secret, StringToSign string) string {
	//创建签名
	key := []byte(secret + "&")
	mac := hmac.New(sha1.New, key)
	mac.Write([]byte(StringToSign))
	s := base64.StdEncoding.EncodeToString(mac.Sum(nil))
	return s
}

func GetUtcTime() string {
	//获取utc时间
	now := time.Now()
	year, mon, day := now.UTC().Date()
	hour, min, sec := now.UTC().Clock()
	s := fmt.Sprintf("%d-%02d-%02dT%02d:%02d:%02dZ", year, mon, day, hour, min, sec)
	return s
}

func SendMail(toaddress, htmlbody, subject string) *map[string]interface{} {
	urldata := url.Values{}
	//获取utc时间
	utc := GetUtcTime()
	//把请求参数一一添加起来
	urldata.Add("Action", "SingleSendMail")
	urldata.Add("AccountName", "admin@testwd.cn")
	urldata.Add("ReplyToAddress", "true")
	urldata.Add("AddressType", "1")
	urldata.Add("ToAddress", toaddress)
	urldata.Add("FromAlias", "测试阿里云openAPI")
	urldata.Add("Subject", subject)
	urldata.Add("HtmlBody", htmlbody)
	urldata.Add("Format", "JSON")
	urldata.Add("Version", "2015-11-23")
	urldata.Add("SignatureMethod", "HMAC-SHA1")
	urldata.Add("SignatureNonce", utc)
	urldata.Add("SignatureVersion", "1.0")
	urldata.Add("AccessKeyId", AccessKeyId)
	urldata.Add("Timestamp", utc)
	fmt.Println(urldata.Encode())
	//参数encode编码,并替换参数中的特殊字符
	percent := PercentEncode(urldata.Encode())
	//获取待签名数据
	StringToSign := "GET" + "&" + url.QueryEscape("/") + "&" + url.QueryEscape(percent)
	//生成签名值
	Signature := CreateSignature(secret, StringToSign)
	//把签名内容带到请求参数中
	urldata.Add("Signature", Signature)

	//发起get请求
	res, err := http.Get("https://dm.aliyuncs.com/?" + PercentEncode(urldata.Encode()))
	if err != nil {
		fmt.Println(err)
	}
	//读取完成后关闭链接
	defer res.Body.Close()

	//读取返回的数据
	data, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println(err)
	}
	//json解析响应的数据
	json.Unmarshal(data, &Aliyun)
	return &Aliyun
}

func main() {
	fmt.Println(SendMail("jiangyd@jiagouyun.com", "hello,测试窝", "测试窝演示"))
}


运行代码,必须有安装配置golang境:


发送邮件截图



总结:通过这个示例,可以学习到sha1加密,http发送get请求,json解析相关知识,我相信再调用其它阿里的openapi应该是没什么问题的


660°/6587 人阅读/2 条评论 发表评论

邓智群  2017-05-21

走语言


江永道  2017-05-26

@邓智群 啥?


登录 后发表评论