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创建一个工程

请求工具类

Go 复制代码
package util

import (
    "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) {
	// 解析合约的 ABI
	var 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

编写实体

Go 复制代码
package entity

type HelloWorld struct {
	Name string `json:"name"`
}

编写服务层

Go 复制代码
package service

import (
	"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
}

编写控制层

Go 复制代码
package controller

import (
	"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"})
}

编写路由

Go 复制代码
package router

import (
	"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

Go 复制代码
package main

import (
	"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测试

合约查看结果

相关推荐
微三云马玮均—GEO源码系统 私有化部署7 小时前
消费返物业费:消费+服务趋势的必然产物!
大数据·人工智能·物联网·区块链·生活
55873 生态系统8 小时前
第 22 篇|社区聊天|55873 文明共建者的日常交流与协作界面
人工智能·区块链·55873全域文明生态体系·55873操作系统·55873社区聊天
IvorySQL16 小时前
PostgreSQL 日报| relchecks 溢出导致表无法删除(9 月 28 日)
数据库·人工智能·ai·postgresql·区块链
怒放de生命201018 小时前
【web3基础】区块链演化逻辑:从分布式账本到可编程世界
web3·区块链·分布式账本
troy12821 小时前
金融财务系统 Reference Data Asset 构建指南:从模型设计到落地实践
大数据·金融·区块链
墨鱼老师1 天前
Go+Gin+Vue 毕设项目:Gin 框架搭建后端基础接口实战
vue.js·golang·go·gin·前后端分离·计算机毕业设计·go 后端
ZDGJ60993 天前
新手该如何入门国际期货
区块链
EatFan3 天前
多智能体协作的三套通信语言:MCP、A2A 与 Tool Calling 怎么选(附 LangGraph/DeepAgents 实战分工模式)
区块链·多智能体·ai agent·mcp·a2a·tool calling
ttwuai3 天前
Golang Web后台管理框架推荐:Gin、GoFrame与数据面板项目怎么分
前端·golang·gin