requestparser.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package gateway
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "net/http"
  6. "github.com/fullstorydev/grpcurl"
  7. "github.com/golang/protobuf/jsonpb"
  8. "github.com/zeromicro/go-zero/rest/httpx"
  9. "github.com/zeromicro/go-zero/rest/pathvar"
  10. )
  11. func buildJsonRequestParser(m map[string]interface{}, resolver jsonpb.AnyResolver) (
  12. grpcurl.RequestParser, error) {
  13. var buf bytes.Buffer
  14. if err := json.NewEncoder(&buf).Encode(m); err != nil {
  15. return nil, err
  16. }
  17. return grpcurl.NewJSONRequestParser(&buf, resolver), nil
  18. }
  19. func newRequestParser(r *http.Request, resolver jsonpb.AnyResolver) (grpcurl.RequestParser, error) {
  20. vars := pathvar.Vars(r)
  21. params, err := httpx.GetFormValues(r)
  22. if err != nil {
  23. return nil, err
  24. }
  25. for k, v := range vars {
  26. params[k] = v
  27. }
  28. if len(params) == 0 {
  29. return grpcurl.NewJSONRequestParser(r.Body, resolver), nil
  30. }
  31. if r.ContentLength == 0 {
  32. return buildJsonRequestParser(params, resolver)
  33. }
  34. m := make(map[string]interface{})
  35. if err := json.NewDecoder(r.Body).Decode(&m); err != nil {
  36. return nil, err
  37. }
  38. for k, v := range params {
  39. m[k] = v
  40. }
  41. return buildJsonRequestParser(m, resolver)
  42. }