极光推送工具类 java
使用 httpClient 调用
import java.io.IOException;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sy.common.Constants;
import com.alibaba.fastjson.JSONArray;
/**
* java后台极光推送
*
* <pre>
* 使用 httpClient请求发送客户端
* </pre>
*/
public class JiguangPushTool {
private static final Logger log = LoggerFactory.getLogger(JiguangPushTool.class);
private static String pushUrl = Constants.JIGUANGPUSH_pushUrl;
private static String receivedURL = Constants.JIGUANGPUSH_receivedURL;
/** APNs是否生产环境 ,默认为true */
private static boolean apns_production = !Constants.JIGUANGPUSH_DevMode;
/**
* 离线消息保留时长(秒),默认 86400 (1 天)
*
* <pre>
* 推送当前用户不在线时,为该用户保留多长时间的离线消息,以便其上线时再次推送。
* 默认 86400 (1 天),最长 10 天。
* 设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到。
* </pre>
*/
private static int time_to_live = 86400;
/**
* 极光推送
*/
@Test
public void testJiguangPush() {
String ALERT = "1分钟完成创建、支持语音图文直播、直播过程清晰无卡顿";
String alias = "";// 声明别名
try {
String result = push(alias, ALERT, "1", "jw123456");
System.out.println("result = " + result);
if (StringUtil.isEmpty(result)) {
return;
}
JSONObject resData = JSONObject.fromObject(result);
if (resData.containsKey("error")) {
log.info("别名为 [ " + alias + " ] 的信息推送失败!");
JSONObject error = JSONObject.fromObject(resData.get("error"));
log.info("信息为 " + error.get("message").toString());
} else {
log.info("别名为 [ " + alias + " ] 的信息推送成功!");
}
} catch (Exception e) {
e.printStackTrace();
log.error("别名为 [ " + alias + " ] 的信息推送失败!", e);
}
}
/**
* 推送方法
*
* @param alias
* 别名
* @param alert
* 消息内容 不超过2000个字节。使用 utf-8 编码,所以一个汉字占用 3 个字节长度。
* @param ypage
* 跳转页面
* @param yparam
* 跳转参数
*/
public static String push(String alias, String alert, String ypage, String yparam) {
// byte[] aa=alias.getBytes("UTF-8");
// if(aa.length>1800){
//
// }
return push(alias, alert, ypage, yparam, apns_production, time_to_live);
}
/**
* 推送方法
*
* @param alias
* 别名
* @param alert
* 消息内容 不超过2000个字节。使用 utf-8 编码,所以一个汉字占用 3 个字节长度。
* @param ypage
* 消息类型
* @param yparam
* 消息id
* @param apns_production
* APNs是否生产环境 ,默认为true
* @param time_to_live
* 离线消息保留时长(秒),默认 86400 (1 天)
*/
public static String push(String alias, String alert, String ypage, String yparam, boolean apns_production, int time_to_live) {
String authorization = pickAuth();
String data = generateJson(alias, alert, ypage, yparam, apns_production, time_to_live).toString();
System.out.println("data=" + data);
return sendPostRequest(pushUrl, data, authorization);
}
/**
* 获取android、ios的消息的统计数据
*
* @param receivedURL
* @return
*/
public static String received(String receivedURL) {
String authorization = pickAuth();
String result = sendGetRequest(receivedURL, authorization);
return result;
}
/**
* 组装极光推送专用json串
*
* @param alias
* @param alert
* @param ypage
* 消息类型
* @param yparam
* 消息id
* @param apns_production
* @param time_to_live
* @return
*/
public static JSONObject generateJson(String alias, String alert, String ypage, String yparam, boolean apns_production, int time_to_live) {
JSONObject json = new JSONObject();
// JSONArray platform = new JSONArray();// 平台
// platform.add("android");
// platform.add("ios");
JSONObject audience = new JSONObject();// 推送目标
JSONArray alias1 = new JSONArray();
alias1.add(alias);
audience.put("alias", alias1);
JSONObject notification = new JSONObject();// 通知内容
JSONObject android = new JSONObject();// android通知内容
android.put("alert", alert);
android.put("builder_id", 1);
JSONObject android_extras = new JSONObject();// android额外参数
android_extras.put("ypage", ypage);
android_extras.put("yparam", yparam);
android.put("extras", android_extras);
JSONObject ios = new JSONObject();// ios通知内容
ios.put("alert", alert);
ios.put("sound", "default");
ios.put("badge", "+1");
JSONObject ios_extras = new JSONObject();// ios额外参数
ios_extras.put("ypage", ypage);
ios_extras.put("yparam", yparam);
ios.put("extras", ios_extras);
notification.put("android", android);
notification.put("ios", ios);
JSONObject options = new JSONObject();// 设置参数
options.put("time_to_live", Integer.valueOf(time_to_live));
options.put("apns_production", apns_production);
json.put("platform", "all");
json.put("audience", audience);
json.put("notification", notification);
json.put("options", options);
return json;
}
/**
* 发送Post请求(json格式)
*
* @param reqURL
* @param data
* @param authorization
* @return result
*/
public static String sendPostRequest(String reqURL, String data, String authorization) {
HttpPost httpPost = new HttpPost(reqURL);
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
CloseableHttpResponse response = null;
try {
httpPost.setHeader("Authorization", authorization);
httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
StringEntity stringEntity = new StringEntity(data, "UTF-8");
stringEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING, "UTF-8"));
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
result = EntityUtils.toString(httpEntity, "UTF-8");
EntityUtils.consume(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
log.error("请求通信[" + reqURL + "]时偶遇异常,堆栈轨迹如下", e);
} finally {
closeHttp(response, httpClient);
}
return result;
}
public static String sendGetRequest(String reqURL, String auth) {
String result = null; // 响应内容
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建默认的httpClient实例
try {
HttpGet httpGet = new HttpGet(reqURL); // 创建org.apache.http.client.methods.HttpGet
httpGet.setHeader("Authorization", auth);
httpGet.setHeader(HTTP.CONTENT_TYPE, "application/json");
response = httpClient.execute(httpGet); // 执行GET请求
HttpEntity httpEntity = response.getEntity(); // 获取响应实体
if (null != httpEntity) {
result = EntityUtils.toString(httpEntity, "UTF-8");
EntityUtils.consume(httpEntity);
}
response.close();
} catch (Exception e) {
e.printStackTrace();
log.error("异常信息:", e);
} finally {
closeHttp(response, httpClient);
}
return result;
}
private static void closeHttp(CloseableHttpResponse response, CloseableHttpClient httpClient) {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static String pickAuth() {
String auth64 = Base64.getEncodeMsg(Constants.JIGUANGPUSH_APPKEY + ":" + Constants.JIGUANGPUSH_MASTERSECRET);
String authorization = "Basic " + auth64;
System.out.println("auth64=" + authorization);
return authorization;
}
}