json_response.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. if err != nil {
  48. j.writer.Write(j.encodeError(err))
  49. }
  50. }
  51. func (j *JsonResponse) Forbidden() {
  52. log.Println("[API:Forbidden]")
  53. j.writer.WriteHeader(http.StatusForbidden)
  54. j.commonHeaders()
  55. j.writer.Write(j.encodeError(errors.New("Access Forbidden")))
  56. }
  57. func (j *JsonResponse) commonHeaders() {
  58. j.writer.Header().Set("Accept", "application/json")
  59. j.writer.Header().Set("Content-Type", "application/json")
  60. }
  61. func (j *JsonResponse) encodeError(err error) []byte {
  62. type errorMsg struct {
  63. ErrorMessage string `json:"error_message"`
  64. }
  65. tmp := errorMsg{ErrorMessage: err.Error()}
  66. data, err := json.Marshal(tmp)
  67. if err != nil {
  68. log.Println("encodeError:", err)
  69. }
  70. return data
  71. }
  72. func (j *JsonResponse) toJSON(v interface{}) []byte {
  73. b, err := json.Marshal(v)
  74. if err != nil {
  75. log.Println("Unable to convert interface to JSON:", err)
  76. return []byte("")
  77. }
  78. return b
  79. }