Go client for the Write.as API https://developers.write.as
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

146 satır
3.6 KiB

  1. // Package writeas provides the binding for the Write.as API
  2. package writeas
  3. import (
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/writeas/impart"
  8. "io"
  9. "net/http"
  10. "time"
  11. )
  12. const (
  13. apiURL = "https://write.as/api"
  14. devAPIURL = "https://development.write.as/api"
  15. )
  16. // Client is used to interact with the Write.as API. It can be used to make
  17. // authenticated or unauthenticated calls.
  18. type Client struct {
  19. baseURL string
  20. // Access token for the user making requests.
  21. token string
  22. // Client making requests to the API
  23. client *http.Client
  24. }
  25. // defaultHTTPTimeout is the default http.Client timeout.
  26. const defaultHTTPTimeout = 10 * time.Second
  27. // NewClient creates a new API client. By default, all requests are made
  28. // unauthenticated. To optionally make authenticated requests, call `SetToken`.
  29. //
  30. // c := writeas.NewClient()
  31. // c.SetToken("00000000-0000-0000-0000-000000000000")
  32. func NewClient() *Client {
  33. return &Client{
  34. client: &http.Client{Timeout: defaultHTTPTimeout},
  35. baseURL: apiURL,
  36. }
  37. }
  38. // NewDevClient creates a new API client for development and testing. It'll
  39. // communicate with our development servers, and SHOULD NOT be used in
  40. // production.
  41. func NewDevClient() *Client {
  42. return &Client{
  43. client: &http.Client{Timeout: defaultHTTPTimeout},
  44. baseURL: devAPIURL,
  45. }
  46. }
  47. // SetToken sets the user token for all future Client requests. Setting this to
  48. // an empty string will change back to unauthenticated requests.
  49. func (c *Client) SetToken(token string) {
  50. c.token = token
  51. }
  52. func (c *Client) get(path string, r interface{}) (*impart.Envelope, error) {
  53. method := "GET"
  54. if method != "GET" && method != "HEAD" {
  55. return nil, fmt.Errorf("Method %s not currently supported by library (only HEAD and GET).\n", method)
  56. }
  57. return c.request(method, path, nil, r)
  58. }
  59. func (c *Client) post(path string, data, r interface{}) (*impart.Envelope, error) {
  60. b := new(bytes.Buffer)
  61. json.NewEncoder(b).Encode(data)
  62. return c.request("POST", path, b, r)
  63. }
  64. func (c *Client) put(path string, data, r interface{}) (*impart.Envelope, error) {
  65. b := new(bytes.Buffer)
  66. json.NewEncoder(b).Encode(data)
  67. return c.request("PUT", path, b, r)
  68. }
  69. func (c *Client) delete(path string, data map[string]string) (*impart.Envelope, error) {
  70. r, err := c.buildRequest("DELETE", path, nil)
  71. if err != nil {
  72. return nil, err
  73. }
  74. q := r.URL.Query()
  75. for k, v := range data {
  76. q.Add(k, v)
  77. }
  78. r.URL.RawQuery = q.Encode()
  79. return c.doRequest(r, nil)
  80. }
  81. func (c *Client) request(method, path string, data io.Reader, result interface{}) (*impart.Envelope, error) {
  82. r, err := c.buildRequest(method, path, data)
  83. if err != nil {
  84. return nil, err
  85. }
  86. return c.doRequest(r, result)
  87. }
  88. func (c *Client) buildRequest(method, path string, data io.Reader) (*http.Request, error) {
  89. url := fmt.Sprintf("%s%s", c.baseURL, path)
  90. r, err := http.NewRequest(method, url, data)
  91. if err != nil {
  92. return nil, fmt.Errorf("Create request: %v", err)
  93. }
  94. c.prepareRequest(r)
  95. return r, nil
  96. }
  97. func (c *Client) doRequest(r *http.Request, result interface{}) (*impart.Envelope, error) {
  98. resp, err := c.client.Do(r)
  99. if err != nil {
  100. return nil, fmt.Errorf("Request: %v", err)
  101. }
  102. defer resp.Body.Close()
  103. env := &impart.Envelope{
  104. Code: resp.StatusCode,
  105. }
  106. if result != nil {
  107. env.Data = result
  108. err = json.NewDecoder(resp.Body).Decode(&env)
  109. if err != nil {
  110. return nil, err
  111. }
  112. }
  113. return env, nil
  114. }
  115. func (c *Client) prepareRequest(r *http.Request) {
  116. r.Header.Add("User-Agent", "go-writeas v1")
  117. r.Header.Add("Content-Type", "application/json")
  118. if c.token != "" {
  119. r.Header.Add("Authorization", "Token "+c.token)
  120. }
  121. }