You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译为WASM模块的Rego策略是否支持http.send内置函数?

OPA WASM中http.send函数的运行验证

OPA WASM文档指出http.send这类内置函数并非WASM原生支持,但实际测试中,我成功编译并运行了包含该函数的Rego策略生成的WASM模块。

测试用例

Rego策略(policy.rego)

package example
 
result contains response if {
    request := {
        "method": "GET",
        "url": "https://httpbin.org/get",
        "headers": {"Accept": "application/json"},
    }
    response := http.send(request)
}

输入数据(data.json)

{}

三种编译与执行方式

1. OPA命令行工具

执行脚本(script.sh):

curl -L -o opa https://openpolicyagent.org/downloads/v1.3.0/opa_linux_amd64
chmod +x ./opa
./opa build -t wasm -e example/result policy.rego
./opa eval --bundle bundle.tar.gz --input data.json 'data.example.result' > result.json

结果:执行成功,生成result.json。

2. golang-opa-wasm库

核心代码(main.go):

package main

import (
	"context"
	"fmt"
	"os"

	"github.com/open-policy-agent/golang-opa-wasm"
)

func main() {
	ctx := context.Background()
	wasmBytes, err := os.ReadFile("./policy.wasm")
	if err != nil {
		panic(err)
	}

	vm, err := opa.NewVM(wasmBytes)
	if err != nil {
		panic(err)
	}
	defer vm.Close()

	input := []byte(`{}`)
	if err := vm.SetInput(input); err != nil {
		panic(err)
	}

	result, err := vm.Eval(ctx, "data.example.result")
	if err != nil {
		panic(err)
	}

	fmt.Println(result)
}

执行脚本(script.sh):

curl -L -o opa https://openpolicyagent.org/downloads/v1.3.0/opa_linux_amd64
chmod +x ./opa
./opa build -t wasm -e example/result policy.rego
tar -xf bundle.tar.gz policy.wasm
go mod init opa-wasm-test
go get github.com/open-policy-agent/golang-opa-wasm
go run main.go > output.txt

结果:执行成功,生成output.txt。

3. OPA官方Go库

核心代码(main.go):

package main

import (
	"context"
	"fmt"
	"os"

	"github.com/open-policy-agent/opa/rego"
	"github.com/open-policy-agent/opa/storage"
	"github.com/open-policy-agent/opa/storage/inmem"
)

func main() {
	ctx := context.Background()
	store := inmem.NewFromObject(map[string]interface{}{})

	query, err := rego.New(
		rego.Query("data.example.result"),
		rego.Load([]string{"policy.rego"}, nil),
		rego.Store(store),
	).PrepareForEval(ctx)
	if err != nil {
		panic(err)
	}

	input := map[string]interface{}{}
	rs, err := query.Eval(ctx, rego.EvalInput(input))
	if err != nil {
		panic(err)
	}

	fmt.Println(rs)
}

执行脚本(script.sh):

go mod init opa-test
go get github.com/open-policy-agent/opa
go run main.go > output.txt

结果:执行成功,生成output.txt。


内容的提问来源于stack exchange,提问作者Tarang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:57:29