68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
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
|
||
}
|