当前位置:网站首页>什么是现货期权合约交易所系统开发丨现货期权合约交易所系统开发详解技术
什么是现货期权合约交易所系统开发丨现货期权合约交易所系统开发详解技术
2022-08-07 16:35:00 【I357O98O7I8】
通过mux定义了两个Handler,URL都是/,但是对应的Method是不一样的。
GET方法通过handleGetBlockchain函数实现,用于获取区块链的信息。
func handleGetBlockchain(w http.ResponseWriter, r *http.Request) {
bytes, err := json.MarshalIndent(Blockchain, "", " ")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
io.WriteString(w, string(bytes))
}Blockchain是一个[]Block,handleGetBlockchain函数的作用是把Blockchain格式化为JSON字符串,然后显示出来。io.WriteString是一个很好用的函数,可以往Writer里写入字符串。更多参考 Go语言实战笔记(十九)| Go Writer 和 Reader
'POST'方法通过handleWriteBlock函数实现,用于模拟区块的生成。
func handleWriteBlock(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
//使用了一个Mesage结构体,更方便的存储BPM
var msg Message
//接收请求的数据信息,类似{"BPM":60}这样的格式
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&msg); err != nil {
respondWithJSON(w, r, http.StatusBadRequest, r.Body)
return
}
defer r.Body.Close()
//控制并发,生成区块链,并且校验
mutex.Lock()
prevBlock := Blockchain[len(Blockchain)-1]
newBlock := generateBlock(prevBlock, msg.BPM)
//校验区块链
if isBlockValid(newBlock, prevBlock) {
Blockchain = append(Blockchain, newBlock)
spew.Dump(Blockchain)
}
mutex.Unlock()
//返回新的区块信息
respondWithJSON(w, r, http.StatusCreated, newBlock)
}以上代码我进行了注释,便于理解。主要是通过POST发送一个{"BPM":60}格式的BODY来添加区块,如果格式正确,那么就生成区块进行校验,合格了就加入到区块里;如果格式不对,那么返回错误信息。
用于控制并发的锁可以参考Go语言实战笔记(十七)| Go 读写锁
这个方法里有个Message结构体,主要是为了便于操作方便。
// Message takes incoming JSON payload for writing heart rate
type Message struct {
BPM int
}返回的JSON信息,也被抽取成了一个函数respondWithJSON,便于公用。
func respondWithJSON(w http.ResponseWriter, r *http.Request, code int, payload interface{}) {
response, err := json.MarshalIndent(payload, "", " ")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("HTTP 500: Internal Server Error"))
return
}
w.WriteHeader(code)
w.Write(response)
}好了,快完成了,以上Web的Handler已经好了,现在我们要启动我们的Web服务了。
// web server
func run() error {
mux := makeMuxRouter()
//从配置文件里读取监听的端口
httpPort := os.Getenv("PORT")
log.Println("HTTP Server Listening on port :", httpPort)
s := &http.Server{
Addr: ":" + httpPort,
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
if err := s.ListenAndServe(); err != nil {
return err
}
return nil
}和原生的http.Server基本一样,应该比较好理解。mux其实也是一个Handler,这就是整个Handler处理链。现在我们就差一个main主函数来启动我们整个程序了。
//控制并发的锁
var mutex = &sync.Mutex{}
func main() {
//加载env配置文件
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
//开启一个goroutine生成一个创世区块
go func() {
t := time.Now()
genesisBlock := Block{}
genesisBlock = Block{0, t.String(), 0, calculateHash(genesisBlock), ""}
spew.Dump(genesisBlock)
mutex.Lock()
Blockchain = append(Blockchain, genesisBlock)
mutex.Unlock()
}()
log.Fatal(run())
}整个main函数并不太复杂,主要就是加载env配置文件,开启一个go协程生成一个创世区块并且添加到区块链的第一个位置,然后就是通过run函数启动Web服务。
一个区块链都有一个创世区块,也就是第一个区块。有了第一个区块我们才能添加第二个,第三个,第N个区块。创世区块因为是第一个区块,所以它是没有PrevHash的。
边栏推荐
- 注册股票开户的流程 网上开户安全吗
- 如何得到股票开户的优惠活动?网上开户是否安全?
- 【kali-权限提升】(4.2)社会工程学工具包(上):启动监听设置payload
- 详解 SSL(一):网址栏的小绿锁有什么意义?
- UICamrea和其他Camera的区别,Camera跟随人物移动的脚本,人物移动结合遥感
- Redis high frequency interview questions full version
- pytorch save training log
- 北京股票开户安不安全?
- 股票账户手机开户安全吗 同花顺开户靠谱吗
- 【论文翻译和解释(2)】LOF:Identifying Density-Based Local Outliers论文精读
猜你喜欢

LeetCode Daily Question 02: There are duplicate elements (1200 questions in each)

windows系统关闭oracle监听程序提示用户无权限

2022-08-06 第四小组 修身课 学习笔记(every day)

差点被ECCV错过的Oral论文:视频理解新框架,仅用微调的「成本」,达到预训练的「全能」

LeetCode Daily 2 Questions 01: Rotating Arrays (both 1200 questions)

A brief description of the function stack

Chapter 3 Mobile Terminal - Elementary Classroom Online Education System Effect Demonstration and Technical Preparation

2.10 - 存储管理 2.11 - 页式存储 2.12 - 段式存储 2.13 - 段页式存储

技术岗面试中的一些常见问题

File upload and download based on FTP protocol
随机推荐
yolov5使用GPU
证券下载app注册有没有风险 办理股票账户安全吗
HDU 1712:ACboy needs your help ← 分组背包问题
手机开户股票开户安全吗 股票开户流程具体是什么
Shell系统学习之子Shell与进程处理
LeetCode_796_Rotate String
基于FTP协议的文件上传与下载
907. 区间覆盖
8. 动态 WEB 开发核心-Servlet
ETCD快速入门-01 ETCD概述
2.10 - 存储管理 2.11 - 页式存储 2.12 - 段式存储 2.13 - 段页式存储
MySQL-Advanced CRUD
【数学建模】matlab向量(数组)
LeetCode Daily 2 Questions 01: Rotating Arrays (both 1200 questions)
易趋受邀参加第十届中国核电信息技术高峰论坛
JVM
R语言向前或者向后移动时间序列数据(自定义滞后或者超前的期数):使用lag函数将时间序列数据向后移动一天(设置参数k为负值)
Is it safe to open a stock account in Hangzhou?
SAP CRM Fiori 应用 My Opportunity 的分页读取逻辑,在 GM4 - AG3 无法正常工作
手机注册股票开户安全吗要钱吗 开户怎么办理