基于golang的简单字典 | 青训营笔记

262 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记

一、引言

本篇文章将实现一个相对简单的golang网络编程案例,也是对青训营中在线词典案例的扩展和补充。简单字典案例作为golang的上手案例,能让初学者对golang有一个初步的认识。

二、设计思路

  1. 使用百度的翻译平台API。百度翻译开放平台 (baidu.com)
  2. 确定目标URL
通用翻译API HTTPS 地址:
https://fanyi-api.baidu.com/api/trans/vip/translate

通用翻译API HTTP 地址:
http://api.fanyi.baidu.com/api/trans/vip/translate
  1. 生成签名:

    • 字符串1 = appid+q+salt+密钥
    • sign = MD5(字符串1)
  2. 确定输入参数: image.png

  3. 确定输出参数:

image.png

三、代码实现

运行: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,然后反序列化响应结果得到输出。