我正在尝试对 openshift 服务的 2 部分 API 调用.来自 GET 的结果用作开机自检的有效载荷



我正在尝试对 openshift 服务的 2 部分 API 调用。 第一次调用使我能够获取我们正在创建的 POD 的模板数据,第二次调用将调用 POST 命令,该命令利用有效负载中 GET 的结果,如下所示。 GET 返回一个大的 json 对象。 当我从GET命令获取结果时,我将结果写入ioutil。ReadAll(( 工作正常。 然后,我使用 string(( 转换为字符串,并尝试将其用作"模板"的字符串参数。 我面临的问题是字符串参数包含转义字符。 即"{\"kind\":\"模板",\"apiVersion\":\"template.openshift.io/v1\"...

我可以使用 bash 脚本执行此操作,但试图消除代码中对脚本的调用。

由 Openshift 提供的 BASH 脚本示例

$ curl -k 
-X POST 
-d @- 
-H "Authorization: Bearer $TOKEN" 
-H 'Accept: application/json' 
-H 'Content-Type: application/json' 
https://$ENDPOINT/apis/template.openshift.io/v1/namespaces/$NAMESPACE/templateinstances <<EOF
{
"kind": "TemplateInstance",
"apiVersion": "template.openshift.io/v1",
"metadata": {
"name": "templateinstance"
},
"spec": {
"secret": {
"name": "secret"
},
"template": $(curl -k 
-H "Authorization: Bearer $TOKEN" 
-H 'Accept: application/json' 
https://$ENDPOINT/apis/template.openshift.io/v1/namespaces/openshift/templates/cakephp-mysql-example)
}
}
EOF

示例 Go 代码...

func main() {
b, res := getTemplateData()
if !b{
fmt.Println(res)
os.Exit(1)
}else{
createTemplate(res)
}
}
type templateInstance struct{
Kind string `json:"kind"`
ApiVersion string `json:"apiVersion"`
Metadata MetaData `json:"metadata"`
Spec spec `json:"spec"`
}
type spec struct {
Secret Tsecret `json:"secret"`
Template string `json:"template"`
}
type Tsecret struct{
Name string `json:"name"`
}
func createTemplate(t string) {
var md MetaData
var sp spec
var ts Tsecret
md.Name = "template_name"
ts.Name = "secret_name"

sp.Secret = ts
sp.Template = t
var ti = templateInstance {
Kind: "TemplateInstance",
ApiVersion: "template.openshift.io/v1",
Metadata: md,
Spec: sp,
}
templateData, _ := json.Marshal(ti)
fmt.Println(string(templateData))
}

func getTemplateData() (bool, string){
URL := "https://example.com/apis/template.openshift.io/v1/namespaces/mynamespace/templates/mytemplate"
client := &http.Client{
Timeout:5*time.Second,
Transport: &http.Transport{
Proxy:nil,
TLSClientConfig: &tls.Config{InsecureSkipVerify:true},
},
}
req, err := http.NewRequest("GET", URL, nil)
if err != nil{
fmt.Println(err)
os.Exit(0)
}
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", myToken)
req.Header.Add("cache-control", "no-cache")
res, err := client.Do(req)
if err != nil{
fmt.Println("client.Do error")
fmt.Println(err)
return false, "Error calling get template"
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil{
return false, "Error reading Template result"
}else{
return true, string(body)
//string(body) gets used as the string value for "template" parameter of the payload in the bash script example...
}
}

额外的转义是将 JSON 文档编码为 JSON 的结果。

使用 json。原始消息,用于按原样将 JSON 模板传递到输出。

type spec struct {
Secret   Tsecret         `json:"secret"`
Template json.RawMessage `json:"template"`
}
...
sp.Template = json.RawMessage(t)

最新更新