Необходимо запросить данные Json в Golang, используя параметры URL - PullRequest
0 голосов
/ 05 июля 2019

Я строю сервер в Голанге, который возвращает данные из локального файла json. Я создал соответствующие структуры и могу заставить сервер возвращать ВСЕ данные из файла json, но что, если я хочу, чтобы он только возвращал определенные записи?

Есть ли способ запроса данных. Я хочу, чтобы пользователь мог вводить параметр в URL, идентификатор и соответствующий json, который должен быть возвращен для соответствующей записи с этим идентификатором.

См. Код для получения дополнительной информации:

func main() {

    //Initialises basic router and endpoints
    r := mux.NewRouter()
    r.HandleFunc("/", getAll).Methods("GET")
    r.HandleFunc("/games/{id:[0-9]+}", getGame).Methods("GET")
    r.HandleFunc("/games/report/{id}", getReport).Methods("GET")

    fmt.Println("Listening on port 8080")
    http.ListenAndServe(":8080", r)

}

Текущий код для извлечения всех данных из файла Json.

func getAll(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    // Open jsonFile and handle the error
    jsonFile, err := os.Open("./data/games.json")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened games.json")

    // defer the closing of our jsonFile so that we can parse it later on
    defer jsonFile.Close()

    // read the opened file as a byte array.
    byteValue, _ := ioutil.ReadAll(jsonFile)

    // initialize our Games array
    var games models.Games

    // unmarshal our byteArray which contains our
    // jsonFile's content into 'games' which we defined above
    json.Unmarshal(byteValue, &games)
    json.NewEncoder(w).Encode(games)
}

Соответствующие структуры:

type Games struct {
    Games []Game `json:"games"`
}

type Comment struct {
    User        string `json:"user"`
    Message     string `json:"message"`
    DateCreated string `json:"dateCreated"`
    Like        int    `json:"like"`
}

type Game struct {
    ID          int     `json:"id"`
    Title       string  `json:"title"`
    Description string  `json:"description"`
    By          string  `json:"by"`
    Platform    string  `json:"platform"`
    AgeRating   string  `json:"age_rating"`
    Likes       int     `json:"likes"`
    Comment     Comment `json:"comments"`
}

Как вы должны видеть на маршрутизаторе, я хочу, чтобы пользователь передал параметр {id}, который затем вставляется в запрос. Возможно ли то, что я спрашиваю?

1 Ответ

2 голосов
/ 05 июля 2019

Как предложил Пархам Алвани, загрузите свои игры на карту, но со значениями указателя, например:

gameMap := make(map[string]*Game)
for _, game := range games{
    gameMap[game.ID] = &game
}

в вашем GET / game-route вы можете передать идентификатор игры на карту и вернуть его результат любым способом, который вам нравится, если он не существует, значение указателя будет равно нулю, и вы можете вернуть 404 :

game := gameMap[id]
if game == nil{ // return 404}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...