json_response.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package core
  5. import (
  6. "encoding/json"
  7. "errors"
  8. "log"
  9. "net/http"
  10. )
  11. type JsonResponse struct {
  12. writer http.ResponseWriter
  13. request *http.Request
  14. }
  15. func (j *JsonResponse) Standard(v interface{}) {
  16. j.writer.WriteHeader(http.StatusOK)
  17. j.commonHeaders()
  18. j.writer.Write(j.toJSON(v))
  19. }
  20. func (j *JsonResponse) Created(v interface{}) {
  21. j.writer.WriteHeader(http.StatusCreated)
  22. j.commonHeaders()
  23. j.writer.Write(j.toJSON(v))
  24. }
  25. func (j *JsonResponse) NoContent() {
  26. j.writer.WriteHeader(http.StatusNoContent)
  27. j.commonHeaders()
  28. }
  29. func (j *JsonResponse) BadRequest(err error) {
  30. log.Println("[API:BadRequest]", err)
  31. j.writer.WriteHeader(http.StatusBadRequest)
  32. j.commonHeaders()
  33. if err != nil {
  34. j.writer.Write(j.encodeError(err))
  35. }
  36. }
  37. func (j *JsonResponse) NotFound(err error) {
  38. log.Println("[API:NotFound]", err)
  39. j.writer.WriteHeader(http.StatusNotFound)
  40. j.commonHeaders()
  41. j.writer.Write(j.encodeError(err))
  42. }
  43. func (j *JsonResponse) ServerError(err error) {
  44. log.Println("[API:ServerError]", err)
  45. j.writer.WriteHeader(http.StatusInternalServerError)
  46. j.commonHeaders()
  47. j.writer.Write(j.encodeError(err))
  48. }
  49. func (j *JsonResponse) Forbidden() {
  50. log.Println("[API:Forbidden]")
  51. j.writer.WriteHeader(http.StatusForbidden)
  52. j.commonHeaders()
  53. j.writer.Write(j.encodeError(errors.New("Access Forbidden")))
  54. }
  55. func (j *JsonResponse) commonHeaders() {
  56. j.writer.Header().Set("Accept", "application/json")
  57. j.writer.Header().Set("Content-Type", "application/json")
  58. }
  59. func (j *JsonResponse) encodeError(err error) []byte {
  60. type errorMsg struct {
  61. ErrorMessage string `json:"error_message"`
  62. }
  63. tmp := errorMsg{ErrorMessage: err.Error()}
  64. data, err := json.Marshal(tmp)
  65. if err != nil {
  66. log.Println("encodeError:", err)
  67. }
  68. return data
  69. }
  70. func (j *JsonResponse) toJSON(v interface{}) []byte {
  71. b, err := json.Marshal(v)
  72. if err != nil {
  73. log.Println("Unable to convert interface to JSON:", err)
  74. return []byte("")
  75. }
  76. return b
  77. }