字节后端青训营 day01

2023-10-14 03:50
文章标签 后端 day01 字节 青训营

本文主要是介绍字节后端青训营 day01,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  第一天,学了些Golang的基础语法,然后做了三个小项目。

1. 猜数字

  随机生成一个0~100的整数,然后猜数,程序很简单,就不贴了。

2. 英汉字典程序

目的:查询一个单词,输出音标和释义,如下所示:

$ go run dictionary.go hello
hello UK: [ˈheˈləu]  US: [həˈlo]
int.喂;哈罗
n.引人注意的呼声
v.向人呼()

2.1 用网页的F12功能抓包

打开一个翻译网页,比如 https://fanyi.caiyunapp.com/
按F12可进入开发者工具,里面可以查看network,然后可以看到好多网页请求。
找到请求方式为“POST”的dict请求,里面有Payload和Preview。
在这里插入图片描述

其中,Payload是请求的信息,包含trans_typesource两个字段
在这里插入图片描述

Preview则是响应信息,包含了查询单词的相关信息,是个非常复杂的结构体
在这里插入图片描述

2.2 代码生成

上面这个URL请求可以用Go来写,而且可以自动生成相应代码。步骤如下:

首先,复制cURL。
在这里插入图片描述

然后,在 https://curlconverter.com/go/ 网站,把复制的内容粘贴进去,就能自动生成相应的代码

package mainimport ("fmt""io""log""net/http""strings"
)func main() {client := &http.Client{}var data = strings.NewReader(`{"trans_type":"en2zh","source":"hello"}`)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", "en-US,en;q=0.9,zh-CN;q=0.8,zh-TW;q=0.7,zh;q=0.6")req.Header.Set("app-name", "xy")req.Header.Set("content-type", "application/json;charset=UTF-8")req.Header.Set("device-id", "e3da338b14045a9a8f59777769d1c977")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", `"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"`)req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("sec-ch-ua-platform", `"Linux"`)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 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54")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)}fmt.Printf("%s\n", bodyText)
}

最后输出的是web响应结果的json字符串:

{"rc":0,"wiki":{},"dictionary":{"prons":{"en-us":"[h\u0259\u02c8lo]","en":"[\u02c8he\u02c8l\u0259u]"},"explanations":["int.\u5582;\u54c8\u7f57","n.\u5f15\u4eba\u6ce8\u610f\u7684\u547c\u58f0","v.\u5411\u4eba\u547c(\u5582)"],"synonym":["greetings","salutations"],"antonym":[],"wqx_example":[["say hello to","\u5411\u67d0\u4eba\u95ee\u5019,\u548c\u67d0\u4eba\u6253\u62db\u547c"],["Say hello to him for me . ","\u4ee3\u6211\u95ee\u5019\u4ed6\u3002"]],"entry":"hello","type":"word","related":[],"source":"wenquxing"}}

2.3 JSON转换

web请求和响应的数据采用JSON格式,可以将其转化为Go结构体。
请求的结构体比较简单,可以直接手写:

type DictRequest struct {TransType string `json:"trans_type"`  // 表示翻译方式,比如英译中Source    string `json:"source"`      // 表示要翻译的单词
}

而响应的结构体非常复杂,依旧可以用代码生成:
在F12工具中,找到Preview,然后复制
在这里插入图片描述
进入 https://oktools.net/json2go 把刚刚复制的粘贴进去,然后就能把JSON字符串转为Go结构体:

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      []interface{} `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"`
}

和JSON转换相关的函数:

// 结构体 -> JSON字符串
func json.Marshal(v any) ([]byte, error)
// JSON字符串 -> 结构体
func json.Unmarshal(data []byte, v any) error

用法如下:

import ("encoding/json""log"// ...
)func main() {// ...request := DictRequest{TransType: "en2zh", Source: word}buf, err := json.Marshal(request)if err != nil {log.Fatal(err)}// ...var response DictResponseerr = json.Unmarshal(bodyText, &response)if err != nil {log.Fatal(err)}
}

2.4 os 包

用 os 包可以读取程序的输入参数(类似C/C++的main参数),也能使用os.Exit()提前退出程序,实例如下:

if len(os.Args) != 2 {fmt.Println("usage error: need a input word")os.Exit(-1)}

2.5 完整程序

package mainimport ("bytes""encoding/json""fmt""io""log""net/http""os"
)type DictRequest struct {TransType string `json:"trans_type"`Source    string `json:"source"`
}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      []interface{} `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)}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", "en-US,en;q=0.9,zh-CN;q=0.8,zh-TW;q=0.7,zh;q=0.6")req.Header.Set("app-name", "xy")req.Header.Set("content-type", "application/json;charset=UTF-8")req.Header.Set("device-id", "e3da338b14045a9a8f59777769d1c977")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", `"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"`)req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("sec-ch-ua-platform", `"Linux"`)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 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54")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)}var response DictResponseerr = json.Unmarshal(bodyText, &response)if err != nil {log.Fatal(err)}fmt.Printf("%s UK: %s  US: %s\n", response.Dictionary.Entry, response.Dictionary.Prons.En, response.Dictionary.Prons.EnUs)for i := 0; i < len(response.Dictionary.Explanations); i++ {fmt.Printf("%s\n", response.Dictionary.Explanations[i])}
}func main() {if len(os.Args) != 2 {fmt.Println("usage error: need a input word")os.Exit(-1)}query(os.Args[1])
}

结果如下:

$ go run dictionary.go hello
hello UK: [ˈheˈləu]  US: [həˈlo]
int.喂;哈罗
n.引人注意的呼声
v.向人呼()
$ go run dictionary.go beauty
beauty UK: [ˈbjuːti]  US: [ˈbjutɪ]
n.美人;美丽;美观;佳丽;美的事物;好处;优点

3. SOCKS5 代理

未完待续…

这篇关于字节后端青训营 day01的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207935

相关文章

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

Java后端微服务架构下的服务网关设计:Spring Cloud Zuul

Java后端微服务架构下的服务网关设计:Spring Cloud Zuul 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,服务网关是微服务系统与外部世界的入口点,它负责请求路由、负载均衡、认证、监控等任务。Spring Cloud Zuul是一个基于Spring Boot的网关服务,它为微服务架构提供了一种灵活、高效的网关解决方案。 服务

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器 类加载器的分类 启动类加载器  扩展类加载器 应用程序类加

javaweb-day01-7(XML 解析-案例)

1、以如下格式的exam.xml文件为例 exam.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?><exam><student examid="222" idcard="111"><name>张三</name><location>沈阳</location><grade>89.00</grade></student><st

javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析)

Jaxp解析开发包     JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成  在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的DOM 或SAX 的解析器对象。   DOM解析方式: 步骤: 1.        调用javax.xml.

javaweb-day01-5(XML 解析-概述)

XML 解析:   (create  read  update  delete)   XML 解析方式有两种:DOM 和SAX   DOM(Document  Object  Model)基于树和节点的文档对象模型。w3c组织推荐的处理xml文档的一种方式。      *优点:crud方便,操作速度也特别快。       *缺点:耗内存,易导致内存溢出,不适合操作大的xml文档。