func BuildCanonicalString()

in tea/utils/utils.go [32:91]


func BuildCanonicalString(method *string, resource *string, params map[string]*string, headers map[string]*string) (result *string) {
	var builder strings.Builder
	builder.WriteString(*method + "\n")

	headersToSign := make(map[string]string)

	// 筛选 headers
	for key, value := range headers {
		if key != "" {
			lowerKey := strings.ToLower(key)
			if lowerKey == strings.ToLower(ContentMD5) || lowerKey == strings.ToLower(ContentType) || lowerKey == strings.ToLower(Date) || strings.HasPrefix(lowerKey, PREFIX) {
				if value != nil {
					headersToSign[lowerKey] = *value
				} else {
					headersToSign[lowerKey] = ""
				}
			}
		}
	}

	// 确保 Content-Type 和 Content-MD5 存在
	if _, exists := headersToSign[strings.ToLower(ContentType)]; !exists {
		headersToSign[strings.ToLower(ContentType)] = ""
	}
	if _, exists := headersToSign[strings.ToLower(ContentMD5)]; !exists {
		headersToSign[strings.ToLower(ContentMD5)] = ""
	}

	// 添加 params
	for key, value := range params {
		if strings.HasPrefix(key, PREFIX) {
			if value != nil {
				headersToSign[key] = *value
			} else {
				headersToSign[key] = ""
			}
		}
	}

	// 按键排序并加入 builder
	keys := make([]string, 0, len(headersToSign))
	for key := range headersToSign {
		keys = append(keys, key)
	}
	sort.Strings(keys)

	for _, key := range keys {
		if strings.HasPrefix(key, PREFIX) {
			builder.WriteString(key + ":" + headersToSign[key])
		} else {
			builder.WriteString(headersToSign[key])
		}
		builder.WriteString("\n")
	}

	// 添加资源部分
	builder.WriteString(buildCanonicalResource(resource, params))
	res := builder.String()
	return &res
}