package request import ( "context" "encoding/json" "fmt" "net/http" "net/url" "testing" "time" ) func Test_Get(t *testing.T) { uri := "https://gateway.dev.cdlsxd.cn/adminyx/admin/v1/key_batch/list" uv := url.Values{} uv.Set("page", "1") uv.Set("limit", "2") h := http.Header{ "Content-Type": []string{"application/x-www-form-urlencoded"}, } respHeader, respBody, err := Get(context.Background(), uri+"?"+uv.Encode(), WithHeaders(h)) if err != nil { t.Error(err) return } t.Logf("响应体:%s", string(respBody)) t.Logf("响应头:%+v", respHeader) } func Test_RequestHeaders(t *testing.T) { uri := "http://example.com/api" body := []byte("request body") h := http.Header{ "Content-Type": []string{"application/json"}, "Authorization": []string{"Bearer token"}, } respHeader, respBody, err := Post(context.Background(), uri, body, WithTimeout(10*time.Second), WithHeaders(h)) if err != nil { t.Error(err) return } t.Logf("响应体:%s", string(respBody)) t.Logf("响应头:%+v", respHeader) } func Test_RequestStatusCode(t *testing.T) { uri := "http://example.com/api/update" body := []byte("update data") isSuccess := func(code int) bool { return code == http.StatusOK || code == http.StatusCreated } respHeader, respBody, err := Put(context.Background(), uri, body, WithStatusCodeFunc(isSuccess)) if err != nil { t.Error(err) return } t.Logf("响应体:%s", string(respBody)) t.Logf("响应头:%+v", respHeader) } func Test_WxNotifyRequest(t *testing.T) { uri := "https://gateway.dev.cdlsxd.cn/voucher/v1/notify/1100040695" //uri := "https://voucher.86698.cn/voucher/v1/notify/1100040695" headerBytes := []byte(`{"Accept":["*/*"],"Cache-Control":["no-cache"],"Connection":["close"],"Content-Length":["1137"],"Content-Type":["application/json"],"Pragma":["no-cache"],"User-Agent":["Mozilla/4.0"],"Wechatpay-Nonce":["kHzkvdHwssdU0CRpFfgCpzdxtdzQGsIS"],"Wechatpay-Serial":["PUB_KEY_ID_0111000406952026032500382251001000"],"Wechatpay-Signature":["jt/2zYvqTlvOHAb9Lb1bfbLUDnqy59dc1JF87AiHVtagZAxzWNP5Jgsrr/jv9C3UVv+MHvbTxuaDQjJAfXx4CT7ihYUNEF6rQL/ilToSMuZpw23/pPjyAzXvBWBsj3AY3rxfa4OkaviRnG6vRA5HKnaHHG5wmDdrcwOoKBiLJ6cax8OYu9GV8Opr0uSzWj7ZxPoSxXy65MxEaampVXJcLnCm1iVp2mHZH6jafBxyjhDGIZ6uOJD0LdCUCJMfbDKvlthO7CrfLRsdosVrVmnL3lJU2ti5rjngmzAxHFi+J4JUsbTvkWnBEXZXaXZ4vNi4gkGnOGPJHs4ch+s0MV/ZFg=="],"Wechatpay-Signature-Type":["WECHATPAY2-SHA256-RSA2048"],"Wechatpay-Timestamp":["1774605950"],"X-Forwarded-For":["121.51.58.172, 172.17.0.1"]}`) bodyBytes := []byte(`{"id":"4a5e22d9-9018-5bfc-94ba-3c9957a62355","create_time":"2026-03-27T18:05:50+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","resource":{"original_type":"coupon","algorithm":"AEAD_AES_256_GCM","ciphertext":"aTS2kVk7l/lzfIEUMUVfk5+6ouRSakspFTP/nR4sDPp0nvrj2VtEQBXkYqTgDDxs35V9CrJI90X31Mho2+adZm1ScPPH0HL6iUaUcypzgvHAhSaJBhugz8slqoQ3zaynBKa/HpyU6Jnfd3OTbhcrS2i27cBdWawd2UQ5HBgAemV8/k/gf+LPC04fJNFfrrttTxqtBDpXr3H/ob5pV825C57SJJhpXxgZtnX/e9avpWZlPIXhOSA3FSwYZtoW1BYoXrsLID6fGcP5IJuc8EE40Z7si95tQbQcM1eqH19OZbRAmXitV+sY1pOlo0Zehnc5vyH5RunVYa2lwdsirSGU1EI0PlDYwHoNxUEtSpKZ4MP8IReNdkjKlwpBQXtgZMGqMNdDU+/Db/ZUr/R8xaF7RoHfiiTHEHQaEK9xbCZji+F8YDiU0K8I8getKsyHiZwHZrU67p/6ql6zVzcWBjaDyL71tcl1k1ppkyOFdg9g0WqcJD56xa9qMhXaOyQoIU4hJsMMTvBWxyRelE4+o1Z79nUVUMswvg/hPZ4QEeIF8C+ezzk+/PhggYhZE4g4WnzqKRh/WASXRja0UsucBVIs9hViV+aDuQVEjxmy29S3UTrwL0Kr0+5hUz7q87gJUaAvehF6pIPtvliJvR0tnpdCrLHuIsc/LiSxoX2WSkGGZet58swdJ7wHYzdfNFKbhRS2IBj4JzI6wc+zRkGmLCijTRFSadZGnNZf5SPez1iEqr0fecCDjN6NUMv/YETfjeEqUxRvNVjMK9vCzEm+bdVJNNL+3i5RiJA9Bng1JtmTMsHatgn8dg==","associated_data":"coupon","nonce":"L3TIxaSQ12pD"}}`) var headerMap http.Header if err := json.Unmarshal(headerBytes, &headerMap); err != nil { t.Error(fmt.Sprintf("解析 headers 失败: %v", err)) return } hc := &http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ MaxIdleConns: 1, // 最大空闲连接数 MaxIdleConnsPerHost: 1, // 每个主机的最大空闲连接数 IdleConnTimeout: 10 * time.Second, // 空闲连接超时时间 }, } isSuccess := func(code int) bool { return code == http.StatusOK || code == http.StatusCreated } respHeader, respBody, err := Post(context.Background(), uri, bodyBytes, WithHttpClient(hc), WithStatusCodeFunc(isSuccess), WithHeaders(headerMap)) if err != nil { t.Error(err) return } t.Logf("响应体:%s", string(respBody)) t.Logf("响应头:%v", respHeader) }