Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-09 08:00:31
avant
621 Les gens l'ont consulté

从 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)
Copier après la connexion

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"`
}
Copier après la connexion

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)

}
Copier après la connexion

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

{2mh36251c2958825n created [{something self get} {soemthing approve get}]}
Copier après la connexion

devrait imprimer

{
  id: '8BW01204PU5017303',
  status: 'CREATED',
  links: [
    {
      href: 'url here',
      rel: 'self',
      method: 'GET'
    },
    ...
  ]
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal