2 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
服務(wù)器.go
package main
import (
"log"
"net/http"
)
func main() {
s := `
{
"members": [
"test12",
"test8800",
"test0032",
"test1234"
],
"owners": [
"test000",
"test111",
"test12",
"test1234"
]
}
`
http.HandleFunc("/projects", func(w http.ResponseWriter, _ *http.Request) {
log.Println("Getting Projects")
w.WriteHeader(http.StatusOK)
w.Write([]byte(s))
})
log.Println("Listening...")
log.Fatal(http.ListenAndServe(":8000", nil))
}
data_source_projects.go
package hashicups
import (
"context"
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceProjects() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceProjectsRead,
Schema: map[string]*schema.Schema{
"members": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"owners": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
},
}
}
func dataSourceProjectsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := &http.Client{Timeout: 10 * time.Second}
// Warning or errors can be collected in a slice type
var diags diag.Diagnostics
req, err := http.NewRequest("GET", fmt.Sprintf("%s/projects", "http://localhost:8000"), nil)
if err != nil {
return diag.FromErr(err)
}
r, err := client.Do(req)
if err != nil {
return diag.FromErr(err)
}
defer r.Body.Close()
var projects map[string]interface{}
err = json.NewDecoder(r.Body).Decode(&projects)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("members", projects["members"]); err != nil {
return diag.FromErr(err)
}
if err := d.Set("owners", projects["owners"]); err != nil {
return diag.FromErr(err)
}
// always run
d.SetId(strconv.FormatInt(time.Now().Unix(), 10))
return diags
}
輸出:
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
project = {
"id" = "1651575329"
"members" = tolist([
"test12",
"test8800",
"test0032",
"test1234",
])
"owners" = tolist([
"test000",
"test111",
"test12",
"test1234",
])
}

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
正如 Matt 和提到的錯(cuò)誤代碼一樣,您正試圖將您的身體解組為不正確的結(jié)構(gòu)。
基本上,您在 Body 中沒(méi)有數(shù)組,您有一個(gè)包含字符串?dāng)?shù)組的字段的對(duì)象。
你的解組方式適用于像這樣的機(jī)構(gòu)
["test12", "test23", "test34"]
嘗試按如下方式對(duì)其進(jìn)行解碼,因此請(qǐng)使用具有顯式映射的結(jié)構(gòu)。
package main
import (
"encoding/json"
"fmt"
)
type Schema struct {
Members []string `json:"members"`
Owners []string `json:"owners"`
}
var jsonBody = `{
"members": [
"test12",
"test8800",
"test0032",
"test1234"
],
"owners": [
"test000",
"test111",
"test12",
"test1234"
]
}`
func main() {
var s Schema
err := json.Unmarshal([]byte(jsonBody), &s)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(s)
}
}
- 2 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)