client.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package isapi
  2. import (
  3. "bytes"
  4. "errors"
  5. "io/ioutil"
  6. "net/http"
  7. "net/url"
  8. )
  9. const (
  10. contentTypeXML = `application/xml; charset="UTF-8"`
  11. contentTypeJSON = `application/json; charset="UTF-8"`
  12. contentTypeHTML = `text/html`
  13. )
  14. type Client struct {
  15. Client *http.Client
  16. BaseURL string
  17. }
  18. func (c *Client) Close() {
  19. c.Client.CloseIdleConnections()
  20. }
  21. func NewClient(host, username, password string) (*Client, error) {
  22. u, err := url.Parse("http://" + host)
  23. if err != nil {
  24. return nil, errors.New("create client error," + err.Error())
  25. }
  26. return &Client{
  27. Client: &http.Client{
  28. Transport: NewAuthTransport(username, password),
  29. },
  30. BaseURL: u.String(),
  31. }, nil
  32. }
  33. func (c *Client) Do(r *http.Request) ([]byte, error) {
  34. resp, err := c.Client.Do(r)
  35. if err != nil {
  36. return nil, err
  37. }
  38. defer resp.Body.Close()
  39. body, err := ioutil.ReadAll(resp.Body)
  40. if err != nil {
  41. return nil, err
  42. }
  43. return body, nil
  44. }
  45. func (c *Client) CommonGet(path string) (resp []byte, err error) {
  46. u, err := url.Parse(c.BaseURL + path)
  47. if err != nil {
  48. return nil, err
  49. }
  50. resp, err = c.Get(u)
  51. if err != nil {
  52. return nil, err
  53. }
  54. return resp, nil
  55. }
  56. func (c *Client) CommonPut(data []byte, path string) (resp []byte, err error) {
  57. u, err := url.Parse(c.BaseURL + path)
  58. if err != nil {
  59. return nil, err
  60. }
  61. resp, err = c.PutXML(u, data)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return resp, nil
  66. }
  67. func (c *Client) CommonDel(data []byte, path string) (resp []byte, err error) {
  68. u, err := url.Parse(c.BaseURL + path)
  69. if err != nil {
  70. return nil, err
  71. }
  72. resp, err = c.DeleteXML(u, data)
  73. if err != nil {
  74. return nil, err
  75. }
  76. return resp, nil
  77. }
  78. func (c *Client) Get(u *url.URL) ([]byte, error) {
  79. req, err := http.NewRequest("GET", u.String(), nil)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return c.Do(req)
  84. }
  85. func (c *Client) put(u *url.URL, contentType string, data []byte) ([]byte, error) {
  86. b := bytes.NewBuffer(data)
  87. req, err := http.NewRequest("PUT", u.String(), b)
  88. if err != nil {
  89. return nil, err
  90. }
  91. req.Header.Set("Content-Type", contentType)
  92. return c.Do(req)
  93. }
  94. func (c *Client) PutXML(u *url.URL, data []byte) ([]byte, error) {
  95. return c.put(u, contentTypeXML, data)
  96. }
  97. func (c *Client) PutJSON(u *url.URL, data []byte) ([]byte, error) {
  98. return c.put(u, contentTypeJSON, data)
  99. }
  100. func (c *Client) post(u *url.URL, contentType string, data []byte) ([]byte, error) {
  101. b := bytes.NewBuffer(data)
  102. req, err := http.NewRequest("POST", u.String(), b)
  103. if err != nil {
  104. return nil, err
  105. }
  106. req.Header.Set("Content-Type", contentType)
  107. return c.Do(req)
  108. }
  109. func (c *Client) PostXML(u *url.URL, data []byte) ([]byte, error) {
  110. return c.post(u, contentTypeXML, data)
  111. }
  112. func (c *Client) PostJSON(u *url.URL, data []byte) ([]byte, error) {
  113. return c.post(u, contentTypeJSON, data)
  114. }
  115. func (c *Client) delete(u *url.URL, contentType string, data []byte) ([]byte, error) {
  116. b := bytes.NewBuffer(data)
  117. req, err := http.NewRequest("DELETE", u.String(), b)
  118. if err != nil {
  119. return nil, err
  120. }
  121. req.Header.Set("Content-Type", contentType)
  122. return c.Do(req)
  123. }
  124. func (c *Client) DeleteXML(u *url.URL, data []byte) ([]byte, error) {
  125. return c.delete(u, contentTypeXML, data)
  126. }
  127. func (c *Client) DeleteJSON(u *url.URL, data []byte) ([]byte, error) {
  128. return c.delete(u, contentTypeJSON, data)
  129. }