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
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 |
|
}
|
|
|