Kembalikan objek json dari titik akhir REST API dalam Go

WBOY
Lepaskan: 2024-02-09 08:00:31
ke hadapan
623 orang telah melayarinya

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

Dalam artikel ini, editor PHP Baicao akan memperkenalkan cara mengembalikan objek json daripada titik akhir REST API yang ditulis dalam bahasa Go. Sebagai format pertukaran data biasa, json digunakan secara meluas dalam pembangunan web. Dengan menggunakan pakej net/http bahasa Go dan pakej pengekodan/json, kami boleh menukar data ke dalam format json dengan mudah dan mengembalikannya kepada klien. Artikel ini akan menerangkan proses ini secara terperinci dan menyediakan kod sampel untuk membantu pembaca memahami dan mengamalkan. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan membantu anda. Mari mulakan!

Kandungan soalan

Saya menggunakan golang untuk membina api. Saya mahu titik akhir ini mengembalikan data json supaya saya boleh menggunakannya dalam bahagian hadapan saya.

http.handlefunc("/api/orders", createorder)
Salin selepas log masuk

Pada masa ini fungsi saya tidak mengembalikan objek json dan pembolehubah jsonmap tidak digunakan create struc untuk memetakan badan tindak balas ke pelayan

Struktur saya

type createorder struct {
    id     string  `json:"id"`
    status string  `json:"status"`
    links  []links `json:"links"`
}
Salin selepas log masuk

Fungsi pesanan cipta saya (dikemas kini berdasarkan komen)

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)

}
Salin selepas log masuk

Ini yang dicetak. Nilai cetakan tanpa kunci objek

{2mh36251c2958825n created [{something self get} {soemthing approve get}]}
Salin selepas log masuk

hendaklah mencetak

{
  id: '8BW01204PU5017303',
  status: 'CREATED',
  links: [
    {
      href: 'url here',
      rel: 'self',
      method: 'GET'
    },
    ...
  ]
}
Salin selepas log masuk

Penyelesaian

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)
    }
}
Salin selepas log masuk

Sebagai alternatif, jika anda ingin menghantar data daripada perkhidmatan luaran ke bahagian hadapan secara kekal, anda sepatutnya boleh melakukan perkara berikut:

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)
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Kembalikan objek json dari titik akhir REST API dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan