第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Go 處理 JSON 響應(yīng)和請(qǐng)求

Go 處理 JSON 響應(yīng)和請(qǐng)求

Go
胡說叔叔 2023-06-01 15:02:26
我是 Go 的新手,雖然到目前為止我已經(jīng)很好地理解了其中的大部分內(nèi)容,但我無法確切地弄清楚應(yīng)該如何處理 JSON。所以假設(shè)我在前端有一個(gè)訪問令牌。我想傳遞它并想向 API 發(fā)出請(qǐng)求以驗(yàn)證它。這是傳遞給后端的 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)}我能找到的所有文檔似乎都表明應(yīng)該為所有 JSON 響應(yīng)/請(qǐng)求創(chuàng)建一個(gè)結(jié)構(gòu)(除非我誤解了)。那不是很不方便嗎?如果我有一個(gè)非常大的嵌套 JSON 響應(yīng)怎么辦?我必須創(chuàng)建完整響應(yīng)的結(jié)構(gòu)嗎?我在上面使用的方法是 ioutil 不好的做法嗎?我在哪里可以傳回整個(gè)字符串表示并在前端管理解碼?我想我的主要問題是,什么時(shí)候應(yīng)該將我的 JSON 分配給結(jié)構(gòu)?什么是最佳實(shí)踐?如果我只想立即將響應(yīng)返回給前端,有什么意義嗎?假設(shè)我確實(shí)想在后端維護(hù)數(shù)據(jù),是否有任何“更好”的方法來處理大型響應(yīng)?
查看完整描述

1 回答

?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

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


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)

但是,如果您真正使用的是大型數(shù)據(jù)集,請(qǐng)查看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)


}

這將使您能夠以更高效的內(nèi)存方式工作。

對(duì)于您的更多問題:

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

  2. 你做對(duì)了嗎?- 你沒有做任何本質(zhì)上錯(cuò)誤的事情嗎?

如果有什么我沒有回答的,請(qǐng)告訴我。

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


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 1 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)