Go REST ClientΒΆ

A function to help make calls to Pinboard API:

func makeCall(command string, args []string) []byte {
  url := "https://api.pinboard.in/v1/" + command + "?format=json&auth_token=" + token
  for _, arg := range args {
    url = url + "&" + arg
  }

  resp, err := http.Get(url)
  if err != nil {
    panic(err)
  }
  if resp.StatusCode > 399 {
    panic(resp)
  }
  defer func() {
    err := resp.Body.Close()
    if err != nil {
      panic(err)
    }
  }()
  body, err := io.ReadAll(resp.Body)
  if err != nil {
    panic(err)
  }
  //fmt.Printf("response=%v\n", resp)
  //fmt.Printf("body=%s\n", body)
  return body
}

Use that function to call the GET entry point:

type PinboardBookmark struct {
  Href        string    `json:"href"`
  Description string    `json:"description"`
  Extended    string    `json:"extended"`
  Meta        string    `json:"meta"`
  Hash        string    `json:"hash"`
  Time        time.Time `json:"time"`
  Shared      string    `json:"shared"`
  Toread      string    `json:"toread"`
  Tags        string    `json:"tags"`
}

type GetResponse struct {
  Date  time.Time          `json:"date"`
  User  string             `json:"user"`
  Posts []PinboardBookmark `json:"posts"`
}

func Get(tags []string, url string) GetResponse { // date time.Time, , meta bool) {
  var args []string

  if tags != nil && len(tags) > 0 {
    if len(tags) > 3 {
      panic("Max 3 tags in a call")
    }
    tagstring := strings.Join(tags, " ")
    args = append(args, "tags="+tagstring)
  }
  if url != "" {
    args = append(args, "url="+url)
  }

  /* date  UTC date in this format: 2010-12-11. */
  /* url can be nil */
  /* tags can be 0-length or nil */
  body := makeCall("posts/recent", args)
  err := os.WriteFile("response_get.json", body, 0644)
  if err != nil {
    panic(err)
  }
  var response GetResponse
  err = json.Unmarshal(body, &response)
  if err != nil {
    panic(err)
  }
  return response
}