目的:
开发一个在线词典(火山翻译),用户可以在命令行中查询单词,并通过调用第三方API获取单词的翻译并打印出来
步骤:
1、抓包:打开火山翻译网页,找到用于查询单词的请求。该请求是一个POST请求,需要设置请求头和四个参数:翻译来源、单词、原始语言和目标语言。
2、需要在golang里发送这个请求,因为这个请求比较复杂,手写代码比较麻烦,右键复制url,使用 curlconverter.com/go/ 将复制好的URL粘贴进去,生成相应的请求代码。
3、在生成的代码中创建一个HTTP客户端,然后构造POST请求并设置请求头。发送请求并获取响应,对响应进行处理。第一个参数是请求方法POST,第二个参数是url,第三个参数是body,body因为可能很大,为了支持流式发送,是一个只读流,用strings.NewReader把字符串转换成流,接下来就是对HTTP request设置header,设置完成后,调用client.do(request)发送请求,若失败的话error会返回非nil,response有HTTP状态码,响应头,响应体,body同样是一个流,为了避免资源泄露,需要加一个defer来手动关闭这个流,defer会在函数运行结束后执行,接下来就是用ioutil.ReadAll来读这个流,这样我们就得到了整个body
4、从命令行读取用户输入的单词,并拼接URL。使用JSON序列化将请求参数转换为JSON格式,常用的方式是先构造一个结构体,这个结构体和我们需要生成的JSON结构是一一对应的,requestBody中包含四个字段,分别对应四个参数。
type requestBody struct {
Source string `json:"source"`
Words []string `json:"words"`
SourceLanguage string `json:"source_language"`
TargetLanguage string `json:"target_language"`
}
5、解析响应数据,创建相应的结构体用于反序列化JSON数据,根据结构体提取翻译结果并打印出来,但这个API返回的结构非常复杂,如果要一一定义结构体字段,非常繁琐且容易出错,可以打开 oktools.net/json2go 将json字符串粘贴进去,直接生成对应的结构体。
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err)
}
item := dictResponse.Details[0]
jsonStr := item.Detail //获取到需要的数据对应的json字符串
var myData DictResponseData
err2 := json.Unmarshal([]byte(jsonStr), &myData) //将json字符串解析为结构体
if err != nil {
log.Fatal(err2)
}
//遍历输出结果
for _, item := range myData.Result[0].Ce.Basic.Explains {
fmt.Println(item.Text, item.Pos, item.Trans)
}