requestparser.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package internal
  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. // NewRequestParser creates a new request parser from the given http.Request and resolver.
  12. func NewRequestParser(r *http.Request, resolver jsonpb.AnyResolver) (grpcurl.RequestParser, error) {
  13. vars := pathvar.Vars(r)
  14. params, err := httpx.GetFormValues(r)
  15. if err != nil {
  16. return nil, err
  17. }
  18. for k, v := range vars {
  19. params[k] = v
  20. }
  21. if len(params) == 0 {
  22. return grpcurl.NewJSONRequestParser(r.Body, resolver), nil
  23. }
  24. if r.ContentLength == 0 {
  25. return buildJsonRequestParser(params, resolver)
  26. }
  27. m := make(map[string]interface{})
  28. if err := json.NewDecoder(r.Body).Decode(&m); err != nil {
  29. return nil, err
  30. }
  31. for k, v := range params {
  32. m[k] = v
  33. }
  34. return buildJsonRequestParser(m, resolver)
  35. }
  36. func buildJsonRequestParser(m map[string]interface{}, resolver jsonpb.AnyResolver) (
  37. grpcurl.RequestParser, error) {
  38. var buf bytes.Buffer
  39. if err := json.NewEncoder(&buf).Encode(m); err != nil {
  40. return nil, err
  41. }
  42. return grpcurl.NewJSONRequestParser(&buf, resolver), nil
  43. }