字节跳动青训营Day01 - 实战项目 - 在线翻译字典

简介: 实战项目 - 在线翻译字典


v1,测试api响应


package main
import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
  "strings"
)
func main() {
  // 建立http链接
  client := &http.Client{}
  // 要发送的请求api的信息
  var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
  // 链接api信息
  req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
  if err != nil {
    // 对于log.Fatal 接口,会先将日志内容打印到标准输出
    log.Fatal(err)
  }
  // 设置一些请求api的http请求头
  req.Header.Set("Connection", "keep-alive")
  req.Header.Set("DNT", "1")
  req.Header.Set("os-version", "")
  req.Header.Set("sec-ch-ua-mobile", "?0")
  req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
  req.Header.Set("app-name", "xy")
  req.Header.Set("Content-Type", "application/json;charset=UTF-8")
  req.Header.Set("Accept", "application/json, text/plain, */*")
  req.Header.Set("device-id", "")
  req.Header.Set("os-type", "web")
  req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
  req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
  req.Header.Set("Sec-Fetch-Site", "cross-site")
  req.Header.Set("Sec-Fetch-Mode", "cors")
  req.Header.Set("Sec-Fetch-Dest", "empty")
  req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
  req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
  // 开始发送请求
  resp, err := client.Do(req)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close() // 关闭
  // 返回请求结果存储到bodyText
  bodyText, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  // 格式化输出内容
  fmt.Printf("%s\n", bodyText)
}
-----------------------------------------
执行代码,已经获取了返回信息内容
{"rc":0,"wiki":{"known_in_laguages":63,"description":{"source":"tangible and intangible thing, except l
abor tied services, that satisfies human wants and provides utility","target":null},"id":"Q28877","item
":{"source":"good","target":"\u5546\u54c1"},"image_url":"http:\/\/www.caiyunapp.com\/imgs\/link_default
_img.png","is_subject":"true","sitelink":"https:\/\/www.caiyunapp.com\/read_mode\/?id=625b4b949c0120504
d1e7b69"},"dictionary":{"prons":{"en-us":"[g\u028ad]","en":"[gud]"},"explanations":["a.\u597d\u7684;\u5
584\u826f\u7684;\u5feb\u4e50\u7684;\u771f\u6b63\u7684;\u5bbd\u5927\u7684;\u6709\u76ca\u7684;\u8001\u7ec
3\u7684;\u5e78\u798f\u7684;\u5fe0\u5b9e\u7684;\u4f18\u79c0\u7684;\u5b8c\u6574\u7684;\u5f7b\u5e95\u7684;
\u4e30\u5bcc\u7684","n.\u5229\u76ca;\u597d\u5904;\u5584\u826f;\u597d\u4eba","ad.=well"],"synonym":["exc
ellent","fine","nice","splendid","proper"],"antonym":["bad","wrong","evil","harmful","poor"],"wqx_examp
le":[["to the good","\u6709\u5229,\u6709\u597d\u5904"],["good, bad and indifferent","\u597d\u7684,\u574
f\u7684\u548c\u4e00\u822c\u7684"],["good innings","\u957f\u5bff"],["good and ...","\u5f88,\u9887;\u5b8c
\u5168,\u5f7b\u5e95"],["do somebody's heart good","\u5bf9\u67d0\u4eba\u7684\u5fc3\u810f\u6709\u76ca,\u4
f7f\u67d0\u4eba\u611f\u5230\u6109\u5feb"],["do somebody good","\u5bf9\u67d0\u4eba\u6709\u76ca"],["be go
od for","\u5bf9\u2026\u6709\u6548,\u9002\u5408,\u80dc\u4efb"],["be good at","\u5728\u2026\u65b9\u9762(\
u5b66\u5f97,\u505a\u5f97)\u597d;\u5584\u4e8e"],["as good as one's word","\u4fe1\u5b88\u8bfa\u8a00,\u503
c\u5f97\u4fe1\u8d56"],["as good as","\u5b9e\u9645\u4e0a,\u51e0\u4e4e\u7b49\u4e8e"],["all well and good"
,"\u4e5f\u597d,\u8fd8\u597d,\u5f88\u4e0d\u9519"],["a good","\u76f8\u5f53,\u8db3\u8db3"],["He is good at
 figures . ","\u4ed6\u5584\u4e8e\u8ba1\u7b97\u3002"]],"entry":"good","type":"word","related":[],"source
":"wenquxing


v2,go语言发送api请求信息的一般方式:使用结构体格式化


package main
import (
  "bytes"
  "encoding/json"
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)
// 使用结构体来存储发送给接口的数据,下文直接使用结构体即可
type DictRequest struct {
  TransType string `json:"trans_type"`
  Source    string `json:"source"`
  UserID    string `json:"user_id"`
}
func main() {
  // 建立http链接
  client := &http.Client{}
  // 使用结构体
  request := DictRequest{TransType: "en2zh", Source: "good"}
  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("Connection", "keep-alive")
  req.Header.Set("DNT", "1")
  req.Header.Set("os-version", "")
  req.Header.Set("sec-ch-ua-mobile", "?0")
  req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
  req.Header.Set("app-name", "xy")
  req.Header.Set("Content-Type", "application/json;charset=UTF-8")
  req.Header.Set("Accept", "application/json, text/plain, */*")
  req.Header.Set("device-id", "")
  req.Header.Set("os-type", "web")
  req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
  req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
  req.Header.Set("Sec-Fetch-Site", "cross-site")
  req.Header.Set("Sec-Fetch-Mode", "cors")
  req.Header.Set("Sec-Fetch-Dest", "empty")
  req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
  req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
  resp, err := client.Do(req)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close()
  bodyText, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Printf("%s\n", bodyText)
}


v3,go语言接受api请求信息的一般方式:使用结构体格式化


这里推荐一个json转go struct的网站 json to go


package main
import (
  "bytes"
  "encoding/json"
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)
// 发送数据的结构体
type DictRequest struct {
  TransType string `json:"trans_type"`
  Source    string `json:"source"`
  UserID    string `json:"user_id"`
}
// 接受数据的结构体,将结构体字段与json字段一一对应起来
type DictResponse struct {
  Rc   int `json:"rc"`
  Wiki struct {
    KnownInLaguages int `json:"known_in_laguages"`
    Description     struct {
      Source string      `json:"source"`
      Target interface{} `json:"target"`
    } `json:"description"`
    ID   string `json:"id"`
    Item struct {
      Source string `json:"source"`
      Target string `json:"target"`
    } `json:"item"`
    ImageURL  string `json:"image_url"`
    IsSubject string `json:"is_subject"`
    Sitelink  string `json:"sitelink"`
  } `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"`
}
func main() {
  client := &http.Client{}
  request := DictRequest{TransType: "en2zh", Source: "good"}
  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("Connection", "keep-alive")
  req.Header.Set("DNT", "1")
  req.Header.Set("os-version", "")
  req.Header.Set("sec-ch-ua-mobile", "?0")
  req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
  req.Header.Set("app-name", "xy")
  req.Header.Set("Content-Type", "application/json;charset=UTF-8")
  req.Header.Set("Accept", "application/json, text/plain, */*")
  req.Header.Set("device-id", "")
  req.Header.Set("os-type", "web")
  req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
  req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
  req.Header.Set("Sec-Fetch-Site", "cross-site")
  req.Header.Set("Sec-Fetch-Mode", "cors")
  req.Header.Set("Sec-Fetch-Dest", "empty")
  req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
  req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
  resp, err := client.Do(req)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close()
  bodyText, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  // 定义结构体变量
  var dictResponse DictResponse
  // Unmarshal函数解析json编码的数据并将结果存入v指向的值
  err = json.Unmarshal(bodyText, &dictResponse)
  if err != nil {
    log.Fatal(err)
  }
  // 现在结果已经保存到结构体里面啦!
  fmt.Printf("%#v\n", dictResponse)
}


现在运行此程序,将是一个大的结构体结果,但显然我们只需要我们需要展示给用户的内容


main.DictResponse{Rc:0, Wiki:struct { KnownInLaguages int "json:\"known_in_laguages\""; Description str
uct { Source string "json:\"source\""; Target interface {} "json:\"target\"" } "json:\"description\""; 
ID string "json:\"id\""; Item struct { Source string "json:\"source\""; Target string "json:\"target\""
 } "json:\"item\""; ImageURL string "json:\"image_url\""; IsSubject string "json:\"is_subject\""; Sitel
ink string "json:\"sitelink\"" }{KnownInLaguages:63, Description:struct { Source string "json:\"source\
""; Target interface {} "json:\"target\"" }{Source:"tangible and intangible thing, except labor tied se
rvices, that satisfies human wants and provides utility", Target:interface {}(nil)}, ID:"Q28877", Item:
struct { Source string "json:\"source\""; Target string "json:\"target\"" }{Source:"good", Target:"商品
"}, ImageURL:"http://www.caiyunapp.com/imgs/link_default_img.png", IsSubject:"true", Sitelink:"https://
www.caiyunapp.com/read_mode/?id=625b4b949c0120504d1e7b69"}, Dictionary:struct { Prons struct { EnUs str
ing "json:\"en-us\""; En string "json:\"en\"" } "json:\"prons\""; Explanations []string "json:\"explana
tions\""; Synonym []string "json:\"synonym\""; Antonym []string "json:\"antonym\""; WqxExample [][]stri
ng "json:\"wqx_example\""; Entry string "json:\"entry\""; Type string "json:\"type\""; Related []interf
ace {} "json:\"related\""; Source string "json:\"source\"" }{Prons:struct { EnUs string "json:\"en-us\"
"; En string "json:\"en\"" }{EnUs:"[gʊd]", En:"[gud]"}, Explanations:[]string{"a.好的;善良的;快乐的;真 
正的;宽大的;有益的;老练的;幸福的;忠实的;优秀的;完整的;彻底的;丰富的", "n.利益;好处;善良;好人", "ad.=wel
l"}, Synonym:[]string{"excellent", "fine", "nice", "splendid", "proper"}, Antonym:[]string{"bad", "wron
g", "evil", "harmful", "poor"}, WqxExample:[][]string{[]string{"to the good", "有利,有好处"}, []string{
"good, bad and indifferent", "好的,坏的和一般的"}, []string{"good innings", "长寿"}, []string{"good and
 ...", "很,颇;完全,彻底"}, []string{"do somebody's heart good", "对某人的心脏有益,使某人感到愉快"}, []s
tring{"do somebody good", "对某人有益"}, []string{"be good for", "对…有效,适合,胜任"}, []string{"be goo
d at", "在…方面(学得,做得)好;善于"}, []string{"as good as one's word", "信守诺言,值得信赖"}, []string{"
as good as", "实际上,几乎等于"}, []string{"all well and good", "也好,还好,很不错"}, []string{"a good", 
"相当,足足"}, []string{"He is good at figures . ", "他善于计算。"}}, Entry:"good", Type:"word", Related
:[]interface {}{}, Source:"wenquxing"}}


v4,封装函数,进行查询


package main
import (
  "bytes"
  "encoding/json"
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
  "os"
)
type DictRequest struct {
  TransType string `json:"trans_type"`
  Source    string `json:"source"`
  UserID    string `json:"user_id"`
}
type DictResponse struct {
  Rc   int `json:"rc"`
  Wiki struct {
    KnownInLaguages int `json:"known_in_laguages"`
    Description     struct {
      Source string      `json:"source"`
      Target interface{} `json:"target"`
    } `json:"description"`
    ID   string `json:"id"`
    Item struct {
      Source string `json:"source"`
      Target string `json:"target"`
    } `json:"item"`
    ImageURL  string `json:"image_url"`
    IsSubject string `json:"is_subject"`
    Sitelink  string `json:"sitelink"`
  } `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"`
}
// 将查询单词释义封装成一个函数,方便使用
func query(word string) {
  client := &http.Client{}
  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("Connection", "keep-alive")
  req.Header.Set("DNT", "1")
  req.Header.Set("os-version", "")
  req.Header.Set("sec-ch-ua-mobile", "?0")
  req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
  req.Header.Set("app-name", "xy")
  req.Header.Set("Content-Type", "application/json;charset=UTF-8")
  req.Header.Set("Accept", "application/json, text/plain, */*")
  req.Header.Set("device-id", "")
  req.Header.Set("os-type", "web")
  req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
  req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
  req.Header.Set("Sec-Fetch-Site", "cross-site")
  req.Header.Set("Sec-Fetch-Mode", "cors")
  req.Header.Set("Sec-Fetch-Dest", "empty")
  req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
  req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
  resp, err := client.Do(req)
  if err != nil {
    log.Fatal(err)
  }
  defer resp.Body.Close()
  // ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾
  bodyText, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    log.Fatal(err)
  }
  // http响应返回的状态码不是200,代表发生了一些错误
  if resp.StatusCode != 200 {
    log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
  }
  var dictResponse DictResponse
  err = json.Unmarshal(bodyText, &dictResponse)
  if err != nil {
    log.Fatal(err)
  }
  // 输出UK释义和US释义
  fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
  //
  for _, item := range dictResponse.Dictionary.Explanations {
    fmt.Println(item)
  }
}
func main() {
  // 程序获取运⾏他时给出的参数,如果不符合标准
  if len(os.Args) != 2 {
    fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
    `)
    os.Exit(1)
  }
  // 去除参数(要查询的单词)
  word := os.Args[1]
  // 进行查询
  query(word)
}
目录
相关文章
|
4月前
|
存储 运维 安全
隐语第二期学习内容随笔
数据要素在采集、存储等环节内外循环,数据持有方需确保内外循环中的数据安全与管控。信任焦虑源于数据权属等问题,依赖技术信任解决。隐私计算原则与开源隐语技术保障隐私安全。数据资产化驱动价值释放,技术信任促进流通,强调数据安全、隐私和信任的核心地位。
35 0
|
4月前
|
存储 监控 安全
隐语第一期学习内容随笔
构建基于技术信任的数据可信流通体系,确保数据传输、处理、存储安全可控,防范持有权风险和越权使用导致的数据泄露、篡改。密态数据和密态天空计算强化数据安全,实现跨云互联。内外循环管理数据安全域,全程保障涉及身份确认、利益对齐等环节,依赖先进加密和跨域管控技术。
37 0
|
设计模式 NoSQL Java
直击面试!阿里技术官手码12W字面试小册在Github上爆火
临近金三银四,想必有不少老哥已经在为面试做准备了。大家想必也知道现在面试就是看项目经验+基本技术+个人潜力(也就是值不值得培养)。总之就是每一次面试都是对我们能力的检验(无论是软实力还是硬实力)。软实力其实就是简历包装,自我介绍,与面试官交谈技巧等等;所谓硬实力就是我们所掌握的技术情况了。所以每次面试之前需要做好充分的准备,切不可临时抱佛脚。技术基础打好后,面试前算题巩固也是必不可少的!
|
9月前
|
分布式计算 Java 大数据
震精,京东T8工程师每天熬夜到天明,竟只是为一套编程实战文档
大数据开发工程师系列共六本,包括Java面向对象编程、Java核心API编程、Java Web开发实战、MySQL数据库开发实战、SSM企业级框架实战、Hadoop & Spark大数据开发实战,一套比较全面的开发工程师书籍。
|
10月前
|
编译器 C++
《C++避坑神器·八》史上最全模板的使用
《C++避坑神器·八》史上最全模板的使用
41 0
|
设计模式 算法 NoSQL
冲刺金九银十!GitHub中文社区秋招趋势最热的面试题被我整理好了
面对已经过去的金三银四很多小伙伴都受到了很大的挫折! 最近收到一个小伙伴金三银四在阿里的面试流程完全被吊打,和我一起看看阿里都问了什么吧!
南大《探索数据的奥秘》课件示例代码笔记13
南大《探索数据的奥秘》课件示例代码笔记13
70 0
南大《探索数据的奥秘》课件示例代码笔记07
南大《探索数据的奥秘》课件示例代码笔记07
67 0
南大《探索数据的奥秘》课件示例代码笔记16
南大《探索数据的奥秘》课件示例代码笔记16
52 0
南大《探索数据的奥秘》课件示例代码笔记05
南大《探索数据的奥秘》课件示例代码笔记05
71 0