亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 處理 JSON 響應和請求

Go 處理 JSON 響應和請求

Go
胡說叔叔 2023-06-01 15:02:26
我是 Go 的新手,雖然到目前為止我已經很好地理解了其中的大部分內容,但我無法確切地弄清楚應該如何處理 JSON。所以假設我在前端有一個訪問令牌。我想傳遞它并想向 API 發出請求以驗證它。這是傳遞給后端的 json:{   "accessToken": "xxxxxx"}type test_struct struct {    AccessToken string `json:"accessToken"`}func validateFacebookLogin(w http.ResponseWriter, r *http.Request) {    decoder := json.NewDecoder(r.Body)    var t test_struct    err := decoder.Decode(&t)    if err != nil {        panic(err)    }    tokenCheck := "xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx"    req, err := http.NewRequest("GET", "https://graph.facebook.com/debug_token", nil)    if err != nil {        log.Print(err)        os.Exit(1)    }    q := req.URL.Query()    q.Add("input_token", t.AccessToken)    q.Add("access_token", tokenCheck)    req.URL.RawQuery = q.Encode()    resp, err := http.Get(req.URL.String())    defer resp.Body.Close()    bodyBytes, _ := ioutil.ReadAll(resp.Body)    bodyString := string(bodyBytes)    fmt.Println(bodyString);    json.NewEncoder(w).Encode(map[string]string{"message": "FINE"})    json.NewEncoder(w).Encode(resp)}我能找到的所有文檔似乎都表明應該為所有 JSON 響應/請求創建一個結構(除非我誤解了)。那不是很不方便嗎?如果我有一個非常大的嵌套 JSON 響應怎么辦?我必須創建完整響應的結構嗎?我在上面使用的方法是 ioutil 不好的做法嗎?我在哪里可以傳回整個字符串表示并在前端管理解碼?我想我的主要問題是,什么時候應該將我的 JSON 分配給結構?什么是最佳實踐?如果我只想立即將響應返回給前端,有什么意義嗎?假設我確實想在后端維護數據,是否有任何“更好”的方法來處理大型響應?
查看完整描述

1 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

在大多數情況下,您只想使用 json.Unmarshal。這個用例大部分時間都有效:


var myClient = &http.Client{Timeout: 10 * time.Second}


func getJson(url string, target interface{}) error {

? ? r, err := myClient.Get(url)

? ? if err != nil {

? ? ? ? return err

? ? }

? ? defer r.Body.Close()


? ? return json.NewDecoder(r.Body).Decode(target)

}


foo := Foo{}

getJson("http://example.com", &foo2)

fmt.Printf("%+v\n", foo)

但是,如果您真正使用的是大型數據集,請查看https://golang.org/pkg/encoding/json/#example_Decoder_Decode_stream


package main


import (

? ? "encoding/json"

? ? "fmt"

? ? "log"

? ? "strings"

)


func main() {

? ? const jsonStream = `

? ? [

? ? ? ? {"Name": "Ed", "Text": "Knock knock."},

? ? ? ? {"Name": "Sam", "Text": "Who's there?"},

? ? ? ? {"Name": "Ed", "Text": "Go fmt."},

? ? ? ? {"Name": "Sam", "Text": "Go fmt who?"},

? ? ? ? {"Name": "Ed", "Text": "Go fmt yourself!"}

? ? ]

`

? ? type Message struct {

? ? ? ? Name, Text string

? ? }

? ? dec := json.NewDecoder(strings.NewReader(jsonStream))


? ? // read open bracket

? ? t, err := dec.Token()

? ? if err != nil {

? ? ? ? log.Fatal(err)

? ? }

? ? fmt.Printf("%T: %v\n", t, t)


? ? // while the array contains values

? ? for dec.More() {

? ? ? ? var m Message

? ? ? ? // decode an array value (Message)

? ? ? ? err := dec.Decode(&m)

? ? ? ? if err != nil {

? ? ? ? ? ? log.Fatal(err)

? ? ? ? }


? ? ? ? fmt.Printf("%v: %v\n", m.Name, m.Text)

? ? }


? ? // read closing bracket

? ? t, err = dec.Token()

? ? if err != nil {

? ? ? ? log.Fatal(err)

? ? }

? ? fmt.Printf("%T: %v\n", t, t)


}

這將使您能夠以更高效的內存方式工作。

對于您的更多問題:

  1. 我是否必須解組為完整的響應結構?- 不是真的,你只需要定義你想在結構中使用的東西,其余的將被忽略

  2. 你做對了嗎?- 你沒有做任何本質上錯誤的事情嗎?

如果有什么我沒有回答的,請告訴我。

對于您的使用ioutil.ReadAll-一般來說,您需要解組為一個結構,以便您可以實際使用數據,并通過您的結構從類型安全中受益。如果您確實只需要字符串,那么您所做的就很好,但通常情況并非如此。


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號