You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

67 lines
1.7 KiB

package jpush
import (
"bytes"
"encoding/base64"
"io/ioutil"
"net/http"
"time"
"go-common/library/stat"
"go-common/library/stat/prom"
)
const (
pushURL = "https://api.jpush.cn/v3/push"
// 如果创建的极光应用分配的北京机房,并且 API 调用方的服务器也位于北京,则比较适合调用极光北京机房的 API,可以提升一定的响应速度。
// PUSH_URL = "https://bjapi.push.jiguang.cn/v3/push"
// VALIDATE_URL = "https://api.jpush.cn/v3/push/validate"
// GROUP_PUSH_URL = "https://api.jpush.cn/v3/grouppush"
)
// Client for JPush
type Client struct {
Auth string
Stats stat.Stat
Timeout time.Duration
}
// New .
func New(appKey string, secretKey string, timeout time.Duration) *Client {
auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(appKey+":"+secretKey))
return &Client{
Auth: auth,
Stats: prom.HTTPClient,
Timeout: timeout,
}
}
// Push .
func (clt *Client) Push(b []byte) (resp []byte, err error) {
if clt.Stats != nil {
now := time.Now()
defer func() {
clt.Stats.Timing(pushURL, int64(time.Since(now)/time.Millisecond))
// log.Info("jpush stats timing: %v", int64(time.Since(now)/time.Millisecond))
if err != nil {
clt.Stats.Incr(pushURL, "failed")
}
}()
}
req, err := http.NewRequest("POST", pushURL, bytes.NewBuffer(b))
req.Header.Add("Charset", "UTF-8")
req.Header.Add("Authorization", clt.Auth)
req.Header.Add("Content-Type", "application/json")
client := &http.Client{Timeout: clt.Timeout}
httpResp, err := client.Do(req)
if err != nil {
return
}
defer httpResp.Body.Close()
return ioutil.ReadAll(httpResp.Body)
}
// GetTimeout .
func (clt *Client) GetTimeout() time.Duration {
return clt.Timeout
}