命令行实现词典
命令行版本词典实现:调用第三方api实现
1.抓包在线词典:fanyi.caiyunapp.com/ 打开后查看network请求,json的post
生成请求:利用curl工具返回json并打印
2.curlconverter.com/#go
包括创建请求,设置请求头,发起请求,读取响应
首先复制post为curl命令
body = '{"trans_type":"en2zh","source":"good"}' Invoke-WebRequest -Uri "api.interpreter.caiyunai.com/v1/dict" -Method POST -Headers body ` -ContentType "application/json"
得到返回值 StatusCode : 200 StatusDescription : OK Content : {"rc":0,"wiki":{},"dictionary":{"prons":{"en-us":"[g\u028ad]","en":"[gud]"},"explanations":["a.\u59 7d\u7684;\u5584\u826f\u7684;\u5feb\u4e50\u7684;\u771f\u6b63\u7684;\u5bbd\u5927\u7684;\u6709\u76ca\u 76... RawContent : HTTP/1.1 200 OK Transfer-Encoding: chunked Connection: keep-alive Access-Control-Allow-Origin: fanyi.caiyunapp.com Access-Control-Allow-Credentials: true Vary: Origin Content-Encoding: g... Forms : {} Headers : {[Transfer-Encoding, chunked], [Connection, keep-alive], [Access-Control-Allow-Origin, https://fany i.caiyunapp.com], [Access-Control-Allow-Credentials, true]...} Images : {} InputFields : {} Links : {} ParsedHtml : mshtml.HTMLDocumentClass RawContentLength : 1466
通过json序列化来读取可变输入,转化到data字段;解析response并提取特定字段
fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs) for _, item := range dictResponse.Dictionary.Explanations { fmt.Println(item) } }使用range循环把需要的字段打印出来
涉及知识点
1. HTTP 请求
使用 net/http 包创建和发送 HTTP 请求,设置请求头和请求体
net/http 包是 Go 标准库中用于处理 HTTP 请求和响应的核心组件。通过这个包,你可以轻松地创建和发送 HTTP 请求,从远程服务器获取数据。
关键步骤:
-
导入包:
go 深色版本 import ( "net/http" "io/ioutil" "strings" ) -
创建请求:
- 使用
http.NewRequest函数创建一个新的 HTTP 请求对象。你需要指定请求方法(如 POST)、目标 URL 和请求体。请求体通常是一个字符串或字节切片,可以通过strings.NewReader转换为io.Reader类型。
go 深色版本 req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", strings.NewReader(body)) if err != nil { fmt.Println("Error creating request:", err) return } - 使用
-
设置请求头:
- 使用
req.Header.Set方法设置请求头。请求头用于传递额外的信息,如用户代理(User-Agent)、内容类型(Content-Type)等。这些头信息对于服务器正确处理请求至关重要。
go 深色版本 req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0") req.Header.Set("Content-Type", "application/json;charset=utf-8") - 使用
-
发送请求:
- 使用
http.Client对象发送请求。http.Client是一个高效的 HTTP 客户端,可以复用连接以提高性能。通过client.Do(req)发送请求,并读取响应体。使用defer resp.Body.Close()确保在请求完成后关闭响应体,释放系统资源。
go 深色版本 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() respBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response body:", err) return } - 使用
2. JSON 解析
使用 encoding/json 包定义结构体并解析 JSON 响应
encoding/json 包是 Go 标准库中用于编码和解码 JSON 数据的核心组件。通过这个包,你可以轻松地将 JSON 数据解析为 Go 结构体,或者将 Go 结构体编码为 JSON 数据。
关键步骤:
-
导入包:
go 深色版本 import ( "encoding/json" "fmt" ) -
定义结构体:
- 定义与 JSON 响应结构匹配的结构体。使用结构体标签(如
json:"field_name")来指定 JSON 字段与结构体字段的对应关系。这使得解析 JSON 数据变得更加直观和准确。
go 深色版本 type DictionaryResponse struct { Rc int `json:"rc"` Wiki map[string]string `json:"wiki"` Dictionary Dictionary `json:"dictionary"` } type Dictionary struct { Prons Pronunciations `json:"prons"` Explanations []string `json:"explanations"` } type Pronunciations struct { En string `json:"en"` EnUs string `json:"en-us"` } - 定义与 JSON 响应结构匹配的结构体。使用结构体标签(如
-
解析 JSON 数据:
- 使用
json.Unmarshal函数将 JSON 字符串解析为定义的结构体。如果解析成功,结构体将包含 JSON 响应中的数据。通过检查解析错误,确保数据解析的准确性。
go 深色版本 var dictResponse DictionaryResponse err = json.Unmarshal(respBody, &dictResponse) if err != nil { fmt.Println("Error parsing JSON response:", err) return } - 使用
3. 字符串处理
使用 strings 包提供的函数处理字符串
strings 包是 Go 标准库中用于处理字符串的强大工具。它提供了许多有用的函数,可以帮助你进行字符串的格式化、查找、替换等操作,使数据处理更加灵活和高效。
关键步骤:
-
导入包:
go 深色版本 import ( "strings" ) -
常用函数:
strings.ToUpper(s string):将字符串中的所有字符转换为大写。strings.ToLower(s string):将字符串中的所有字符转换为小写。strings.TrimSpace(s string):去除字符串首尾的空白字符。strings.Contains(s, substr string):检查字符串是否包含指定的子字符串。strings.Replace(s, old, new, n int):将字符串中的某个子字符串替换为另一个子字符串,最多替换n次。
4. 错误处理
使用 if err != nil 语句检查错误,并使用 defer 关键字确保资源关闭
错误处理是编写健壮代码的重要部分。在 Go 中,错误通常通过返回值传递,因此你需要在每个可能出错的地方进行错误检查。通过合理的错误处理,可以确保程序在遇到错误时能够优雅地处理,并释放系统资源。
关键步骤:
-
检查错误:
- 使用
if err != nil语句检查错误。如果发生错误,打印错误信息并终止程序或采取其他适当的措施。这有助于及时发现和解决问题。
go 深色版本 if err != nil { fmt.Println("Error:", err) return } - 使用
-
延迟关闭资源:
- 使用
defer关键字确保在函数结束时关闭资源。这对于确保文件、网络连接等资源在使用完毕后正确关闭非常重要。defer语句会在函数返回前执行,确保资源释放。
go 深色版本 resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() - 使用
5. 文件读写
使用 ioutil 包读取和写入文件
ioutil 包是 Go 标准库中用于文件操作的便捷工具。它提供了许多简洁的函数,可以帮助你轻松地读取和写入文件。通过这些函数,你可以轻松地处理文件操作,如读取配置文件或保存数据。
关键步骤:
-
导入包:
go 深色版本 import ( "io/ioutil" "os" ) -
读取文件:
- 使用
ioutil.ReadFile函数读取文件内容。该函数返回一个字节切片,表示文件的内容。通过检查读取错误,确保文件读取的准确性。
go 深色版本 data, err := ioutil.ReadFile("filename.txt") if err != nil { fmt.Println("Error reading file:", err) return } - 使用
-
写入文件:
- 使用
ioutil.WriteFile函数写入文件内容。该函数接受文件名、要写入的数据(字节切片)和权限模式。通过检查写入错误,确保文件写入的准确性。
go 深色版本 err = ioutil.WriteFile("filename.txt", []byte("Hello, World!"), 0644) if err != nil { fmt.Println("Error writing file:", err) return } - 使用
总结
通过以上步骤,你可以实现一个命令行版本的词典,调用第三方 API 获取单词的定义和发音。每个部分的详细解释如下:
-
HTTP 请求:
- 使用
net/http包创建和发送 HTTP 请求,设置请求头和请求体。这一步骤确保你可以与远程服务器进行通信并获取所需的响应。
- 使用
-
JSON 解析:
- 使用
encoding/json包定义结构体并解析 JSON 响应。这一步骤确保你可以将接收到的 JSON 数据转换为易于操作的 Go 结构体。
- 使用
-
字符串处理:
- 使用
strings包提供的函数处理字符串。这一步骤帮助你进行字符串的格式化、查找、替换等操作,使数据处理更加灵活。
- 使用
-
错误处理:
- 使用
if err != nil语句检查错误,并使用defer关键字确保资源关闭。这一步骤确保你的程序在遇到错误时能够优雅地处理,并释放系统资源。
- 使用
-
文件读写:
- 使用
ioutil包读取和写入文件。这一步骤帮助你轻松地处理文件操作,如读取配置文件或保存数据。
- 使用