当前位置: 首页 > news >正文

FISCO BCOS Gin调用WeBASE-Front接口发请求

前提环境

需要提前搭建好一条FISCO-BCOS链和WeBASE-Front中间件

访问WeBase-Front

部署案例合约 

pragma solidity>=0.4.24 <0.6.11;contract HelloWorld {string name;constructor() public {name = "Hello, World!";}function get() public view returns (string memory) {return name;}function set(string memory n) public {name = n;}
}

获取合约地址、合约名称和合约ABI 

使用GoLand创建一个工程

请求工具类 

package utilimport ("bytes""encoding/json""fmt""io/ioutil""net/http"
)type RequestData struct {GroupId         string        `json:"groupId"`User            string        `json:"user"`ContractName    string        `json:"contractName"`Version         string        `json:"version"`FuncName        string        `json:"funcName"`FuncParam       []interface{} `json:"funcParam"`ContractAddress string        `json:"contractAddress"`ContractAbi     []interface{} `json:"contractAbi"`UseAes          bool          `json:"useAes"`UseCns          bool          `json:"useCns"`CnsName         string        `json:"cnsName"`
}var (contractAbi     = `[{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]`contractName    = "HelloWorld"contractAddress = "0x3dd7ab770f48c8c828c3b7bd8b2e152764bb3a6c"transUrl        = "http://192.168.200.147:5002/WeBASE-Front/trans/handle"ownerAddress    = "0x7bccfc8f2eb60ade058b1427d2bfbb2bb8c37c2a"
)func WriteContract(userAddress, funcName string, funcParam []interface{}) (map[string]interface{}, error) {// 调用 CommonReq 函数发送请求并获取响应result, err := CommonReq(userAddress, funcName, funcParam)if err != nil {return nil, err}// 解析返回的 JSON 数据var response map[string]interface{}err = json.Unmarshal([]byte(result), &response)if err != nil {return nil, err}// 判断交易是否成功if code, ok := response["code"].(float64); ok && code > 0 {// 失败时打印响应并返回错误fmt.Println(response)return nil, fmt.Errorf("transaction failed with code: %d", int(code))}// 检查状态是否为 "0x0"(表示成功)status, ok := response["status"].(string)if !ok || status != "0x0" {// 失败时打印响应并返回错误fmt.Println(response)return nil, fmt.Errorf("transaction failed with status: %s", status)}// 返回成功的响应数据return response, nil
}func OwnerWriteContract(funcName string, funcParam []interface{}) (map[string]interface{}, error) {return WriteContract(ownerAddress, funcName, funcParam)
}func CommonReq(userAddress, funcName string, funcParam []interface{}) (string, error) {// 解析合约的 ABIvar abiJSON []interface{}err := json.Unmarshal([]byte(contractAbi), &abiJSON)if err != nil {return "", fmt.Errorf("error parsing ABI: %v", err)}// 构建请求数据data := RequestData{GroupId:         "1",User:            userAddress,ContractName:    contractName,Version:         "",FuncName:        funcName,FuncParam:       funcParam,ContractAddress: contractAddress,ContractAbi:     abiJSON,UseAes:          false,UseCns:          false,CnsName:         "",}// 将请求数据转为 JSON 字符串payloadBytes, err := json.Marshal(data)if err != nil {return "", fmt.Errorf("error marshalling data: %v", err)}// 发送 HTTP POST 请求resp, err := http.Post(transUrl, "application/json; charset=utf-8", bytes.NewBuffer(payloadBytes))if err != nil {return "", fmt.Errorf("error making POST request: %v", err)}defer resp.Body.Close()// 读取响应体body, err := ioutil.ReadAll(resp.Body)if err != nil {return "", fmt.Errorf("error reading response body: %v", err)}// 返回响应的字符串return string(body), nil
}

将contractAbi、contractName、contractAddress、ownerAddress改成在wefront-front部署abi、合约名称、合约地址、部署合约用户

transUrl的IP改成对应虚拟机IP

编写实体

package entitytype HelloWorld struct {Name string `json:"name"`
}

 编写服务层

package serviceimport ("SDK/entity""SDK/util""log"
)// Set 函数用于设置 HelloWorld 实体
func Set(helloworld *entity.HelloWorld) bool {funcParams := []interface{}{helloworld.Name,}res, err := util.OwnerWriteContract("set", funcParams)if err != nil || res == nil {log.Printf("set失败: %v", err)return false}return true
}

 编写控制层

package controllerimport ("SDK/entity""SDK/service""github.com/gin-gonic/gin""net/http"
)// Set 处理 POST 请求以设置 HelloWorld 实体
func Set(c *gin.Context) {var helloworld entity.HelloWorld// 将 JSON 数据绑定到 HelloWorld 结构体if err := c.ShouldBindJSON(&helloworld); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 调用服务层以设置 HelloWorld 实体if success := service.Set(&helloworld); !success {c.JSON(http.StatusInternalServerError, gin.H{"error": "fail"})return}// 返回成功响应c.JSON(http.StatusOK, gin.H{"message": "success"})
}

 编写路由

package routerimport ("SDK/controller""github.com/gin-gonic/gin"
)func SetupRouter() *gin.Engine {// 创建一个新的 Gin 引擎并手动添加中间件r := gin.New()r.Use(gin.Logger(), gin.Recovery()) // 手动添加 Logger 和 Recovery 中间件// 设置路由r.POST("/set", controller.Set)return r
}

 编写main.go

package mainimport ("SDK/router""log"
)func main() {r := router.SetupRouter() // 通过 SetupRouter 获取初始化好的路由// 启动服务器if err := r.Run("127.0.0.1:8080"); err != nil {log.Fatalf("Unable to start the server: %v", err)}
}

Postman测试 

合约查看结果 

 

http://www.dtcms.com/a/308041.html

相关文章:

  • 【Kiro Code】Chat 聊天功能
  • React的介绍和特点
  • Linux的访问权限(保姆级别)
  • 深入浅出HTML5 CSS类扩展:getElementsByClassName和classList属性
  • Vercel 全面介绍与网站部署指南
  • CSS和XPATH选择器对比
  • AI与AGI:从狭义智能到通用智能
  • Opus音频编码器全解析:从技术原理到实战应用
  • C++_HELLO算法_哈希表的简单实现
  • Docker 实战 -- cloudbeaver
  • C语言---结构体(格式、用法、嵌套、初始化)、共用体、枚举类型、typedef类型
  • 【RAG Query Expansion论文解析】用 LLM 进行查询扩展 (Query Expansion)
  • 在MySQL中DECIMAL 类型的小数位数(Scale)如何影响分组查询?
  • 30天入门Python(基础篇)——第25天:标准库学习之OS模块
  • 一次 web 请求响应中,通常那个部分最耗时?
  • git ETAS包 使其可以本地编辑
  • 借助于llm将pdf转化为md文本
  • PDF源码解析
  • 数据结构第4问:什么是栈?
  • CUDA系列之CUDA安装与使用
  • freeRTOS 消息队列
  • Cesium 快速入门(三)Viewer:三维场景的“外壳”
  • 【MySQL】MySQL大偏移量查询优化方案
  • 若依框架-前端二次开发快速入门简述
  • [硬件电路-109]:模拟电路 - 自激振荡器的原理,一种把直流能量转换成交流信号的装置!
  • Linux软件包管理器深度解析:从概念到实战
  • React开发依赖分析
  • TRAE 软件使用攻略
  • 快速搭建Node.js服务指南
  • python制作的软件工具安装包