Consume API using GO
GOA 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.