这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记
一、引言
本篇文章将实现一个相对简单的golang网络编程案例,也是对青训营中在线词典案例的扩展和补充。简单字典案例作为golang的上手案例,能让初学者对golang有一个初步的认识。
二、设计思路
- 使用百度的翻译平台API。百度翻译开放平台 (baidu.com)
- 确定目标URL
通用翻译API HTTPS 地址:
https://fanyi-api.baidu.com/api/trans/vip/translate
通用翻译API HTTP 地址:
http://api.fanyi.baidu.com/api/trans/vip/translate
-
生成签名:
- 字符串1 = appid+q+salt+密钥
- sign = MD5(字符串1)
-
确定输入参数:
-
确定输出参数:
三、代码实现
运行:go run main.go hello
输出:hello 你好
package main
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strconv"
"sync"
"time"
)
type BaiduDictResponse struct {
From string `json:"from"`
To string `json:"to"`
TransResult []struct {
Src string `json:"src"`
Dst string `json:"dst"`
} `json:"trans_result"`
ErrorCode string `json:"error_code"`
}
func query(word string) {
appId := "" //用个人的
appKey := "" //用个人的
baseUrl := "http://api.fanyi.baidu.com/api/trans/vip/translate?"
salt := strconv.FormatInt(time.Now().UnixNano(), 10)
sign := SumString(appId + word + salt + appKey)
url := fmt.Sprintf("%sq=%s&from=auto&to=zh&appid=%s&salt=%s&sign=%s", baseUrl, word, appId, salt, sign)
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
bodyText, _ := ioutil.ReadAll(response.Body)
if response.StatusCode != 200 {
log.Fatal("bad StatusCode:", response.StatusCode, "body:", string(bodyText))
}
var baiduDictResponse BaiduDictResponse
err = json.Unmarshal(bodyText, &baiduDictResponse)
if err != nil {
log.Fatal(err)
}
log.Println(baiduDictResponse.TransResult[0].Src, baiduDictResponse.TransResult[0].Dst)
}
func SumString(content string) string {
md5Ctx := md5.New()
md5Ctx.Write([]byte(content))
bys := md5Ctx.Sum(nil)
//bys := md5.Sum([]byte(content))//这个md5.Sum返回的是数组,不是切片哦
value := hex.EncodeToString(bys)
return value
}
func main() {
if len(os.Args) != 2 {
fmt.Fprintln(os.Stderr, "lack one arg")
os.Exit(1)
}
word := os.Args[1]
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
query(word)
wg.Done()
}()
wg.Wait()
}
四、总结
本案例实现了一个go语言的简单字典,首先开启一个协程执行query函数,函数里构造请求参数后,发起一个Get请求到目标API,然后反序列化响应结果得到输出。