Как изменить возврат json - PullRequest
0 голосов
/ 16 марта 2020

Я беру данные с github API с golang, однако хочу отправить на фронт только необходимые данные (id, name, url, language и description) вместо того, чтобы просто возвращать все, что github API дает мне.

func GetAllReposStars(w http.ResponseWriter, r *http.Request) {
    enableCors(&w)
    params := mux.Vars(r)
    username := params["username"]

    res, err := http.Get("https://api.github.com/users/" + username + "/starred")

    body, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("Body: %s\n", body)

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

    w.Header().Set("Content-Type", "application/json")
    w.Write(body)
    json.NewEncoder(w)
}

Ответы [ 2 ]

5 голосов
/ 16 марта 2020

Вы можете определить тип, который имеет только нужные вам ключи, и декодировать ответ из API GitHub в переменную этого типа, чтобы сохранить только нужные вам ключи, а затем записать эту переменную в ответ.

Например:

package main

import (
    "encoding/json"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

type RelevantRepoData struct {
    Id          int    `json:"id"`
    Name        string `json:"name"`
    Url         string `json:"url"`
    Language    string `json:"language"`
    Description string `json:"description"`
}

func GetAllReposStars(w http.ResponseWriter, r *http.Request) {
    enableCors(&w)
    params := mux.Vars(r)
    username := params["username"]

    res, err := http.Get("https://api.github.com/users/" + username + "/starred")

    var repoData RelevantRepoData
    err = json.NewDecoder(res.Body).Decode(&repoData)
    if err != nil {
        log.Fatal(err)
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(repoData)
}

2 голосов
/ 16 марта 2020

Если вы хотите отправить определенные поля c во внешний интерфейс, но в будущем хотите обрабатывать их в бэкэнде, вы можете использовать json:"-" в своей структуре

, например:

type RelevantRepoData struct {
    Irrelevant  string `json:"-"`
    Id          int    `json:"id"`
    Name        string `json:"name"`
    Url         string `json:"url"`
    Language    string `json:"language"`
    Description string `json:"description"`
}

Когда вы возвращаете этот объект, поля с json:"-" будут игнорироваться, но вы все равно сможете использовать их в бэкэнде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...