Browse Source

add request package to simplify parameter parsing

Wendell Sun 6 years ago
parent
commit
0dcaab7fb7
1 changed files with 60 additions and 0 deletions
  1. 60
    0
      request/request.go

+ 60
- 0
request/request.go View File

@@ -0,0 +1,60 @@
1
+package request
2
+
3
+import (
4
+	"net/http"
5
+	"runtime"
6
+
7
+	"github.com/gin-gonic/gin"
8
+	"github.com/sirupsen/logrus"
9
+)
10
+
11
+type Checker interface {
12
+	Check() error
13
+}
14
+
15
+func ParseSuccess(ctx *gin.Context, r interface{}, fs ...func() error) bool {
16
+	if r != nil {
17
+		if Error(ctx, http.StatusBadRequest, ctx.ShouldBind(r)) {
18
+			return false
19
+		}
20
+
21
+		if checker, ok := r.(Checker); ok {
22
+			return !Error(ctx, http.StatusBadRequest, checker.Check())
23
+		}
24
+	}
25
+	for _, f := range fs {
26
+		if Error(ctx, http.StatusBadRequest, f()) {
27
+			return false
28
+		}
29
+	}
30
+	return true
31
+}
32
+
33
+func Error(ctx *gin.Context, status int, err error) bool {
34
+	if err == nil {
35
+		return false
36
+	}
37
+	ctx.JSON(status, gin.H{"msg": err.Error()})
38
+
39
+	if status == http.StatusInternalServerError {
40
+		_, file, line, _ := runtime.Caller(1)
41
+		logrus.WithField("err", err).Errorf("file:%s line:%d", file, line)
42
+	}
43
+	return true
44
+}
45
+
46
+func Success(ctx *gin.Context, data interface{}) {
47
+	if data == nil {
48
+		ctx.Status(http.StatusNoContent)
49
+		return
50
+	}
51
+
52
+	switch ctx.Request.Method {
53
+	case "GET", "PUT", "DELETE", "HEAD", "PATCH", "OPTIONS":
54
+		ctx.JSON(http.StatusOK, data)
55
+	case "POST":
56
+		ctx.JSON(http.StatusCreated, data)
57
+	default:
58
+		ctx.JSON(http.StatusBadRequest, gin.H{"msg": "unsupported request method" + ctx.Request.Method})
59
+	}
60
+}