Maison  >  Article  >  développement back-end  >  Renvoie l'objet json du point de terminaison de l'API REST dans Go

Renvoie l'objet json du point de terminaison de l'API REST dans Go

WBOY
WBOYavant
2024-02-09 08:00:31557parcourir

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

Dans cet article, l'éditeur PHP Baicao présentera comment renvoyer un objet json à partir d'un point de terminaison d'API REST écrit en langage Go. En tant que format d'échange de données courant, json est largement utilisé dans le développement Web. En utilisant le package net/http et le package encoding/json du langage Go, nous pouvons facilement convertir les données au format json et les renvoyer au client. Cet article expliquera ce processus en détail et fournira un exemple de code pour aider les lecteurs à comprendre et à mettre en pratique. Que vous soyez débutant ou développeur expérimenté, cet article vous aidera. commençons!

Contenu de la question

J'utilise Golang pour créer une API. Je souhaite que ce point de terminaison renvoie des données json afin de pouvoir les utiliser dans mon interface.

http.handlefunc("/api/orders", createorder)

Actuellement, ma fonction ne renvoie pas d'objet json et la variable jsonmap n'est pas utilisée create struc pour mapper le corps de la réponse au serveur

Ma structure

type createorder struct {
    id     string  `json:"id"`
    status string  `json:"status"`
    links  []links `json:"links"`
}

Ma fonction de création de commande (mise à jour en fonction des commentaires)

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)

}

C'est ce qui s'imprime. Imprimer la valeur sans clé d'objet

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

devrait imprimer

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

Solution

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

Alternativement, si vous souhaitez envoyer des données d'un service externe vers le frontend de manière immuable, vous devriez pouvoir procéder comme suit :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer