首頁 > 後端開發 > Golang > 從 Go 中的 REST API 端點傳回 json 對象

從 Go 中的 REST API 端點傳回 json 對象

WBOY
發布: 2024-02-09 08:00:31
轉載
650 人瀏覽過

从 Go 中的 REST API 端点返回 json 对象

php小編百草在這篇文章中將為大家介紹如何從Go語言寫的REST API端點傳回json物件。作為一種常見的資料交換格式,json在web開發中被廣泛使用。透過使用Go語言的net/http套件和encoding/json套件,我們可以輕鬆地將資料轉換為json格式並傳回給客戶端。本文將詳細說明這個過程,並提供範例程式碼來幫助讀者理解和實踐。無論您是初學者還是有經驗的開發者,本文都將對您有所幫助。讓我們開始吧!

問題內容

我正在使用 golang 建立 api。我希望此端點返回 json 數據,以便我可以在我的前端中使用它。

http.handlefunc("/api/orders", createorder)
登入後複製

目前我的函數沒有傳回 json 對象,而且 jsonmap 變數沒有使用 create struc 將回應正文對應到伺服器

我的結構

type createorder struct {
    id     string  `json:"id"`
    status string  `json:"status"`
    links  []links `json:"links"`
}
登入後複製

我的createorder函數(根據評論更新)

func createorder(w http.responsewriter, r *http.request) {
    accesstoken := generateaccesstoken()
    w.header().set("access-control-allow-origin", "*")
    fmt.println(accesstoken)

    body := []byte(`{
        "intent":"capture",
        "purchase_units":[
           {
              "amount":{
                 "currency_code":"usd",
                 "value":"100.00"
              }
           }
        ]
     }`)

    req, err := http.newrequest("post", base+"/v2/checkout/orders", bytes.newbuffer(body))
    req.header.set("content-type", "application/json")
    req.header.set("authorization", "bearer "+accesstoken)

    client := &http.client{}
    resp, err := client.do(req)

    if err != nil {
        log.fatalf("an error occured %v", err)
    }

    fmt.println(resp.statuscode)
    defer resp.body.close()

    if err != nil {
        log.fatal(err)
    }

    var jsonmap createorder

    error := json.newdecoder(resp.body).decode(&jsonmap)

    if error != nil {
        log.fatal(err)
    }

    w.writeheader(resp.statuscode)
    json.newencoder(w).encode(jsonmap)

}
登入後複製

這就是列印的內容。列印不帶物件鍵的值

{2mh36251c2958825n created [{something self get} {soemthing approve get}]}
登入後複製

應該要列印

{
  id: '8BW01204PU5017303',
  status: 'CREATED',
  links: [
    {
      href: 'url here',
      rel: 'self',
      method: 'GET'
    },
    ...
  ]
}
登入後複製

解決方法

func createorder(w http.responsewriter, r *http.request) {
    // ...

    resp, err := http.defaultclient.do(req)
    if err != nil {
        log.println("an error occured:", err)
        return
    }
    defer resp.body.close()
    
    if resp.statuscode != http.statusok /* or http.statuscreated (depends on the api you're using) */ {
        log.println("request failed with status:", http.status)
        w.writeheader(resp.statuscode)
        return
    }

    // decode response from external service
    v := new(createorder)
    if err := json.newdecoder(resp.body).decode(v); err != nil {
        log.println(err)
        return
    }
    
    // send response to frontend
    w.writeheader(resp.statuscode)
    if err := json.newencoder(w).encode(v); err != nil {
        log.println(err)
    }
}
登入後複製

或者,如果您想要將資料從外部服務不變地傳送到前端,您應該可以執行以下操作:

func createOrder(w http.ResponseWriter, r *http.Request) {
    // ...

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Println("An Error Occured:", err)
        return
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK /* or http.StatusCreated (depends on the API you're using) */ {
        log.Println("request failed with status:", http.Status)
        w.WriteHeader(resp.StatusCode)
        return
    }

    // copy response from external to frontend
    w.WriteHeader(resp.StatusCode)
    if _, err := io.Copy(w, resp.Body); err != nil {
        log.Println(err)
    }
}
登入後複製

以上是從 Go 中的 REST API 端點傳回 json 對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板