区块链控制器的编写
在上一篇文章中我们实现了编写区块链web应用编写的路由,直通车 那么这次我们就来说下区块链web应用控制器的编写,在编写控制器之前我们需要检查一下需要用到的golang的依赖包是否存在,否则的话就不能编写控制器,依赖包如下:golang依赖包 在确保依赖包都存在时我们便可以编写了控制器代码。
控制器便是一些方法代码块来实现功能。导包便不需要我们自己写,(除了一些特定的)goalnd会帮我们自动导包,我们可以将一个结构体作为一个控制器文件,在其中编写方法实现对账本的操作,我们还是直接来看代码。
package controller//这个包名是项目结构的文件夹
import (
"agricultural/application/lib"//这个是整个项目的结构体文件
"bytes"
"encoding/json"
bc "agricultural/application/blockchain"//这个便是整个项目文件的sdk了sdk编写可参照之前文章
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
// 这里是公司录入一个资产
func CreateAssets(ctx *gin.Context) {
companyId := ctx.Query("companyId")
// 解析结构体
req := new(lib.Assets)//解析lib里面的Assets结构体
if err := ctx.ShouldBind(req); err != nil {
_ = ctx.AbortWithError(http.StatusBadRequest, err)
return
}
marshal, _ := json.Marshal(req)//序列化req
resp, err := bc.ChannelExecute("createAssets", [][]byte{
//这边是ChannelExecute不知道大家还有没有印象,在sdk编写中写的一个方法,,当有保存删除修改的操作时都是使用此方法,不能使用ChannelQuery不然会报错。
marshal,
[]byte(companyId),
})
if err != nil {//抛出异常
fmt.Println("ERROR: ", err.Error())
ctx.String(http.StatusInternalServerError, err.Error())
return
}
ctx.JSON(http.StatusOK, resp)
}
// 查询公司 这个同上面一样唯一不一样的便是 ChannelQuery 查询操作都是使用此方法
func QueryCompany(ctx *gin.Context) {
companyId := ctx.Query("companyId")
resp, err := bc.ChannelQuery("queryCompany", [][]byte{
[]byte(companyId),
})
if err != nil {
fmt.Println("ERROR: ", err.Error())
ctx.String(http.StatusInternalServerError, err.Error())
return
}
ctx.String(http.StatusOK, bytes.NewBuffer(resp.Payload).String())
}
那么今天区块链web控制器的编写就到这里了,等我有时间了,我会详细出一期,Hyperledger Fabric 搭建网络以及链码编写的详细教程。