Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kembalikan objek json dari titik akhir REST API dalam Go

Kembalikan objek json dari titik akhir REST API dalam Go

WBOY
WBOYke hadapan
2024-02-09 08:00:31621semak imbas

从 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)

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"`
}

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)

}

Ini yang dicetak. Nilai cetakan tanpa kunci objek

{2mh36251c2958825n created [{something self get} {soemthing approve get}]}

hendaklah mencetak

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

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)
    }
}

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)
    }
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam