DEV Community

loading...
Cover image for Consume Rest API With Go

Consume Rest API With Go

#go
💜May Meow🌼
💜 MSFT System Administrator, MCP, MCTS 👾, Love ❤ To learn new things 💎
・2 min read

A few days ago I have to look at consuming API with GO from Ghost so here is what I learnt.

A very simple example of how to consume API and print it as text to console. It's not much but it's good to start.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

func main() {
    var endpoint = "http://your-addres.domain/api/endpoint"

    response, err := http.Get(endpoint)

    if err != nil {
        fmt.Print(err.Error())
        os.Exit(1)
    }

    responseData, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(responseData))
}
Enter fullscreen mode Exit fullscreen mode

Next, it will be good if I can return objects to use in my app instead of text. And go has to function for it called unmarshall. Unmarshalling JSON response need JSON module so I have to import "encoding/json".

Another thing I need was struct in which will be my json respone parsed. Following syntax is example for Ghost API for posts.

type Response struct {
    Posts []Post    `json: "posts"`
}

type Post struct {
    Id string       `json: "id"`
    Title string    `json: "title"`
    Slug string     `json: "slug"`
    Excerpt string  `json: "excerpt"`
    Html string     `json: "html"`
}
Enter fullscreen mode Exit fullscreen mode

and define new variable in main function var responseObject Response

next i add unmarshall after response which will parse json string to my object syntax for it is as follows:

json.Unmarshal(responseData, &responseObject)
Enter fullscreen mode Exit fullscreen mode

Now you can go trough array of object.

for _, post := range responseObject.Posts {
  fmt.Println("Id:", post.Id, "with title:", post.Title, "slug:", post.Slug)
}
Enter fullscreen mode Exit fullscreen mode

Complete example is here:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

type Response struct {
    Posts []Post    `json: "posts"`
}

type Post struct {
    Id string       `json: "id"`
    Title string    `json: "title"`
    Slug string     `json: "slug"`
    Excerpt string  `json: "excerpt"`
    Html string     `json: "html"`
}

func main() {
    var endpoint = "http://your-addres.domain/api/endpoint"
    var responseObject Response

    response, err := http.Get(endpoint)

    if err != nil {
        fmt.Print(err.Error())
        os.Exit(1)
    }

    responseData, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    // fmt.Println(string(responseData))

    json.Unmarshal(responseData, &responseObject)

    for _, post := range responseObject.Posts {
        fmt.Println("Id:", post.Id, "with title:", post.Title, "slug:", post.Slug)
    }
}
Enter fullscreen mode Exit fullscreen mode

Thank You for reading.

Photo by NASA on Unsplash

Discussion (0)