底层逻辑
1.获取第三方api实时翻译
在一个工具网站,例如翻译软件中打开浏览器控制台,使用network工具监测网络请求
找到我们需要的请求头复制成curl命令(我们需要通过这个名利的格式在代码生成器中生成go语言版本的http请求)
生成go语言代码 Convert curl commands to code (curlconverter.com)
运行之后我们就得到了一串json字符串,通同名结构体的操作实现json的序列化和反序列化
反序列化得到的输出一样可以通过代码生成器生成一个同名结构体方便我们输出
json转go-struct:JSON转Golang Struct - 在线工具 - OKTools 整理逻辑封装函数,最后写好main函数即可
2.发送http请求,解析json,同时使用代码生成工具提高开发效率
3.处理结果
重要步骤和包含知识
这段代码是一个用 Go 语言编写的程序,它的主要功能是调用第三方 API 实现实时翻译。它通过发送 HTTP 请求,解析 JSON 数据来实现这一功能。代码中使用了代码生成技术来提高开发效率。
首先,程序打开在线翻译软件,通过浏览器控制台的 network 工具获取 POST 请求(dict 请求)。然后复制请求的 cURL 到终端得到 cURL 代码,再将得到的 cURL 代码复制到快速转码的软件转换成 Go 语言代码快速生成网络请求搭建代码。
在程序中,首先构造一个同名首字母大写的结构体 dictRequest,通过 json.Marshal() 将请求序列化,转换成 byte 数组。然后通过代码生成,将序列化得到的 JSON 转成 Go-struct,同名大写就可以使用 unmashal 方法对 JSON 进行反序列化操作。
//通过代码生成,将序列化得到的json转成go-struct,同名大写就可以使用unmashal方法对json进行反序列化操作
type dictResponse struct {
Rc int `json:"rc"`
Wiki struct {
} `json:"wiki"`
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
Synonym []string `json:"synonym"`
Antonym []string `json:"antonym"`
WqxExample [][]string `json:"wqx_example"`
Entry string `json:"entry"`
Type string `json:"type"`
Related []interface{} `json:"related"`
Source string `json:"source"`
} `json:"dictionary"`
}
接下来,程序使用 http.NewRequest() 方法创建一个新的 HTTP 请求,并设置请求头信息。然后使用 client.Do() 方法发送请求,并获取响应数据。最后,程序使用 json.Unmarshal() 方法将响应数据反序列化为 dictResponse 结构体,并输出结果。
func query(word string) {
client := &http.Client{}
// var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
//序列化
request := dictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
req.Header.Set("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "beb03841f392cc35aa95b970ed892a3f")
req.Header.Set("origin", "https://fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", `"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
//得到的response不一定正确,比如url出错就会出现404报错,为了方便排查问题
if resp.StatusCode != 200 {
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
}
// fmt.Printf("%s\n", bodyText) 得到json串
var dictResponse dictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err) //exit(1)并且输出错误信息
}
fmt.Printf(dictResponse.Dictionary.Entry, "US:", dictResponse.Dictionary.Prons.En, "UK:", dictResponse.Dictionary.Prons.EnUs)
fmt.Println('\n')
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item, '\n')
}
}
这段代码中注释中提到的序列化操作和结构体生成是由在线转换软件直接完成的。这样可以大大提高开发效率,避免手动编写繁琐的序列化和反序列化代码。总之,这段代码通过调用第三方 API 实现了实时翻译功能,并且使用了代码生成技术来提高开发效率。
curl是什么
curl 是一个命令行工具,用于在服务器之间传输数据。它的名字代表客户端(client)的 URL 工具。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具它支持几乎所有的互联网协议(DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS,RTSP,SCP,SFTP,SMB,SMBS,SMTP ,SMTPS,TELNET和TFTP)它几乎隐藏在所有设备中,例如汽车,蓝光播放器等。它通过互联网协议传输任意类型数据它是一个开放源代码的命令行工具,也是一个跨平台的库(libcurl),用于在服务器之间传输数据,并分发给几乎所有新的操作系统它编程用于需要通过Internet协议发送或接收数据的几乎任何地方。
json是什么
JSON 是 JavaScript Object Notation 的缩写,它是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范) 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON 易于人阅读和编写,同时也易于机器解析和生成。它可以在多种语言之间进行数据交换。JSON 在 Web 开发领域有着举足轻重的地位,如果您想在 Web 开发领域大展身手的话,就必须了解 JSON。
api是什么,如何利用api API 是 Application Programming Interface 的缩写,它是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范) 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。API 易于人阅读和编写,同时也易于机器解析和生成,它可以在多种语言之间进行数据交换。
Go 语言可以通过内置的 net/http 包来操作 API。这个包提供了一系列用于 HTTP 客户端和服务器编程的函数和类型。你可以使用这个包来发送 HTTP 请求,获取响应数据,并对数据进行解析。
例如,你可以使用 http.Get 函数来发送一个 GET 请求,获取指定 URL 的内容。你也可以使用 http.Post 函数来发送一个 POST 请求,提交指定类型的数据。此外,你还可以使用 http.NewRequest 函数来创建一个自定义的 HTTP 请求,并使用 http.Client 类型的 Do 方法来发送请求。
在处理响应数据时,你可以使用 ioutil.ReadAll 函数来读取响应正文中的所有数据。如果响应数据是 JSON 格式的,你还可以使用 encoding/json 包中的函数来对数据进行解析。
总之,Go 语言提供了丰富的内置函数和类型,可以帮助你方便地操作 API。你可以根据需要选择合适的函数和类型来完成你的任务。