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测试

合约查看结果

相关推荐
u***09646 小时前
Web3去中心化身份
web3·去中心化·区块链
1***Q7841 天前
Web3去中心化存储
web3·去中心化·区块链
百***06011 天前
【Golang】——Gin 框架中的表单处理与数据绑定
microsoft·golang·gin
百***93501 天前
【Golang】——Gin 框架中间件详解:从基础到实战
中间件·golang·gin
p***43481 天前
Web3在社交网络中的去中心化
web3·去中心化·区块链
OpenBuild.xyz2 天前
加密三重演进:Balaji 眼中的 “去中心化 - 可编程 - 隐私化” 完整链路
去中心化·区块链
掘金安东尼2 天前
Solana 链条:为什么这个“最快的区块链”
区块链
Web3VentureView2 天前
从“信息不对称”到“链上博弈”:解析去中心化投融资协议的机制设计
去中心化·区块链
1***s6322 天前
React区块链开发
前端·react.js·区块链
wa的一声哭了3 天前
Webase部署Webase-Web在合约IDE页面一直转圈
linux·运维·服务器·前端·python·区块链·ssh