Consume API With GO

Consume API With GO
Photo by Mel Poole / Unsplash

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

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"`
}

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)

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

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