May Meow logo

May Meow

Subscribe
Archives
December 9, 2020

Consume Api With GO

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

}

Thank You for reading.

💜 Thank You!

URLs

  • My omg.lol page
  • What am I doing now?
  • You can also check my status page or micro.blog if you want know what I'm doing

Projects

  • I hosing my projects on GitHub
  • I'm currently working on Api Client for the omg lol service.
Don't miss what's next. Subscribe to May Meow:
About Bluesky
This email brought to you by Buttondown, the easiest way to start and grow your newsletter.