Kaynağa Gözat

Improve developer experience (#681)

* feat: 添加query 以及query单元测试
feat: 添加模板字符串解析以及模板字符串单元测试

* improve: 序列化请求参数,使得参数更易读

* delete: delete useless module

* format: format code

* docs: add function comment

* docs: comment method

* fix: fixed type convert error

* feat: support any type

* feat: support other type

* format: format code

* test: check logger

* format: format code

* test: udpate testing case

* del: remove useless code

* del: remove useless module

* test: update testing case

* ✨ feat: support for unsigned integers

* ✨ feat: template string support any type
jingyuexing 3 yıl önce
ebeveyn
işleme
8bae546b77
5 değiştirilmiş dosya ile 129 ekleme ve 11 silme
  1. 24 0
      util/query.go
  2. 19 0
      util/query_test.go
  3. 24 0
      util/template.go
  4. 20 0
      util/template_test.go
  5. 42 11
      work/addresslist/user.go

+ 24 - 0
util/query.go

@@ -0,0 +1,24 @@
+package util
+
+import (
+	"fmt"
+	"strings"
+)
+
+// Query 将Map序列化为Query参数
+func Query(params map[string]interface{}) string {
+	finalString := make([]string, 0)
+	for key, value := range params {
+		valueString := ""
+		switch v := value.(type) {
+		case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
+			valueString = fmt.Sprintf("%d", v)
+		case bool:
+			valueString = fmt.Sprintf("%v", v)
+		default:
+			valueString = fmt.Sprintf("%s", v)
+		}
+		finalString = append(finalString, strings.Join([]string{key, valueString}, "="))
+	}
+	return strings.Join(finalString, "&")
+}

+ 19 - 0
util/query_test.go

@@ -0,0 +1,19 @@
+package util
+
+import (
+	"testing"
+)
+
+// TestQuery query method test case
+func TestQuery(t *testing.T) {
+	result := Query(map[string]interface{}{
+		"age":  12,
+		"name": "Alan",
+		"cat":  "Peter",
+	})
+	if result == "" {
+		// 由于hash是乱序 所以没法很好的预测输出的字符串
+		// 将会输出符合Query规则的字符串 "age=12&name=Alan&cat=Peter"
+		t.Error("NOT PASS")
+	}
+}

+ 24 - 0
util/template.go

@@ -0,0 +1,24 @@
+package util
+
+import (
+	"fmt"
+	"strings"
+)
+
+// Template 对字符串中的和map的key相同的字符串进行模板替换 仅支持 形如: {name}
+func Template(source string, data map[string]interface{}) string {
+	sourceCopy := &source
+	for k, val := range data {
+		valStr := ""
+		switch v := val.(type) {
+		case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
+			valStr = fmt.Sprintf("%d", v)
+		case bool:
+			valStr = fmt.Sprintf("%v", v)
+		default:
+			valStr = fmt.Sprintf("%s", v)
+		}
+		*sourceCopy = strings.Replace(*sourceCopy, strings.Join([]string{"{", k, "}"}, ""), valStr, 1)
+	}
+	return *sourceCopy
+}

+ 20 - 0
util/template_test.go

@@ -0,0 +1,20 @@
+package util
+
+import (
+	"testing"
+)
+
+// TestTemplate testing case about Template method
+func TestTemplate(t *testing.T) {
+	result := Template("{name}={age};{with}={another};any={any};boolean={boolean}", map[string]interface{}{
+		"name":    "Helan",
+		"age":     "33",
+		"with":    "Pep",
+		"another": "C",
+		"any":     33,
+		"boolean": false,
+	})
+	if result != "Helan=33;Pep=C;any=33;boolean=false" {
+		t.Error("NOT PSS testing")
+	}
+}

+ 42 - 11
work/addresslist/user.go

@@ -1,22 +1,22 @@
 package addresslist
 
 import (
-	"fmt"
+	"strings"
 
 	"github.com/silenceper/wechat/v2/util"
 )
 
 const (
 	// userSimpleListURL 获取部门成员
-	userSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=%d"
+	userSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist"
 	// userGetURL 读取成员
-	userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s"
+	userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"
 	// userListIDURL 获取成员ID列表
-	userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=%s"
+	userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id"
 	// convertToOpenIDURL userID转openID
-	convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=%s"
+	convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
 	// convertToUserIDURL openID转userID
-	convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid?access_token=%s"
+	convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid"
 )
 
 type (
@@ -45,7 +45,13 @@ func (r *Client) UserSimpleList(departmentID int) ([]*UserList, error) {
 		return nil, err
 	}
 	var response []byte
-	if response, err = util.HTTPGet(fmt.Sprintf(userSimpleListURL, accessToken, departmentID)); err != nil {
+	if response, err = util.HTTPGet(strings.Join([]string{
+		userSimpleListURL,
+		util.Query(map[string]interface{}{
+			"access_token":  accessToken,
+			"department_id": departmentID,
+		}),
+	}, "?")); err != nil {
 		return nil, err
 	}
 	result := &UserSimpleListResponse{}
@@ -129,7 +135,15 @@ func (r *Client) UserGet(UserID string) (*UserGetResponse, error) {
 		return nil, err
 	}
 	var response []byte
-	if response, err = util.HTTPGet(fmt.Sprintf(userGetURL, accessToken, UserID)); err != nil {
+
+	if response, err = util.HTTPGet(
+		strings.Join([]string{
+			userGetURL,
+			util.Query(map[string]interface{}{
+				"access_token":  accessToken,
+				"department_id": UserID,
+			}),
+		}, "?")); err != nil {
 		return nil, err
 	}
 	result := &UserGetResponse{}
@@ -170,7 +184,12 @@ func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error)
 		return nil, err
 	}
 	var response []byte
-	if response, err = util.PostJSON(fmt.Sprintf(userListIDURL, accessToken), req); err != nil {
+	if response, err = util.PostJSON(strings.Join([]string{
+		userListIDURL,
+		util.Query(map[string]interface{}{
+			"access_token": accessToken,
+		}),
+	}, "?"), req); err != nil {
 		return nil, err
 	}
 	result := &UserListIDResponse{}
@@ -204,7 +223,13 @@ func (r *Client) ConvertToOpenID(userID string) (string, error) {
 		return "", err
 	}
 	var response []byte
-	if response, err = util.PostJSON(fmt.Sprintf(convertToOpenIDURL, accessToken), &convertToOpenIDRequest{
+
+	if response, err = util.PostJSON(strings.Join([]string{
+		convertToOpenIDURL,
+		util.Query(map[string]interface{}{
+			"access_token": accessToken,
+		}),
+	}, "?"), &convertToOpenIDRequest{
 		UserID: userID,
 	}); err != nil {
 		return "", err
@@ -240,7 +265,13 @@ func (r *Client) ConvertToUserID(openID string) (string, error) {
 		return "", err
 	}
 	var response []byte
-	if response, err = util.PostJSON(fmt.Sprintf(convertToUserIDURL, accessToken), &convertToUserIDRequest{
+
+	if response, err = util.PostJSON(strings.Join([]string{
+		convertToUserIDURL,
+		util.Query(map[string]interface{}{
+			"access_token": accessToken,
+		}),
+	}, "?"), &convertToUserIDRequest{
 		OpenID: openID,
 	}); err != nil {
 		return "", err