调用百度云推HTTP REST API发送消息 -- Java 实现
package com.baidu.push.example;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
/**
* 调用百度云推server REST API. 实现消息发送
* @see http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api
* @see http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list#push_msg
*
* 依赖Apaceh HttpClient
* @link http://mirrors.cnnic.cn/apache//httpcomponents/httpclient/binary/httpcomponents-client-4.3.3-bin.zip
* @author gaoshang
*
*/
public class PostMessage {
public static String BAIDU_PUSE_SERVER = "http://channel.api.duapp.com/rest/2.0/channel/channel";
public static String API_KEY = "your api_key here";
public static String SECRET_KEY = "your secret_key here";
public static void main(String args[]) throws Exception {
int msgID = new java.util.Random().nextInt();
System.out.println(msgID);
pushMessage(String.valueOf(msgID), "Test message "+ msgID +"!");
}
/**
* 调用HTTP API 发送消息。
* @param msgID
* @param message
* @throws Exception
*/
public static void pushMessage(String msgID, String message) throws Exception {
MyBasicNameValuePair nv1 = new MyBasicNameValuePair("msg_keys", msgID);
MyBasicNameValuePair nv2 = new MyBasicNameValuePair("messages", message);
MyBasicNameValuePair nv3 = new MyBasicNameValuePair("apikey", API_KEY);
MyBasicNameValuePair nv4 = new MyBasicNameValuePair("method", "push_msg");
MyBasicNameValuePair nv5 = new MyBasicNameValuePair("push_type", "3");
MyBasicNameValuePair nv6 = new MyBasicNameValuePair("timestamp",
new java.util.Date().getTime() + "");
MyBasicNameValuePair nv7 = new MyBasicNameValuePair("v", "1");
List<MyBasicNameValuePair> nvps = new ArrayList<MyBasicNameValuePair>();
nvps.add(nv1);
nvps.add(nv2);
nvps.add(nv3);
nvps.add(nv4);
nvps.add(nv5);
nvps.add(nv6);
nvps.add(nv7);
String signValue = getSignValue(nvps, SECRET_KEY);
MyBasicNameValuePair nv8 = new MyBasicNameValuePair("sign", signValue);
HttpPost httpost = new HttpPost(BAIDU_PUSE_SERVER);
nvps.add(nv8);
httpost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
HttpClient httpclient = HttpClients.createDefault();
HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
System.out.println();
System.out.println("we got from push server.. " );
System.out.println(response.getStatusLine());
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(entity.getContent()));
String readLine;
while (((readLine = br.readLine()) != null)) {
System.out.println(readLine);
}
} catch (Exception e) {
System.err.println(e);
} finally {
if (br != null)
try {
br.close();
} catch (Exception fe) {
}
}
}
/**
签名算法
云推送服务API使用的签名算法如下:
获取请求的http method;
获取请求的url,包括host和sheme,但不包括query_string的部分;
将所有参数(包括GET或POST的参数,但不包含签名字段)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”;
将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1:v1,k2:v2,k3:v3”,并将http method和url按顺序拼接在这个字符串前面;
在拼接好的字符串末尾追加上应用的secret_key,并进行urlencode,形成base_string;
上述字符串的MD5值即为签名的值:
sign=MD5(urlencode($http_method$url$k1=$v1$k2=$v2$k3=$v3$secret_key));
说明:
$secret_key:通过“开发者中心 -> 管理中心 -> 点击某应用 -> 应用信息详情页” 获得。
举例:
url [POST]:
http://{domain}/rest/2.0/channel/channel?method=token×tamp=1313293563&expires=1313293565&v=1
说明:
secret_key:8777F555E8C16715EBA5C85341684C58 参于签名的字符串:
POSThttp://{domain}/rest/2.0/channel/channelapikey=Ljc710pzAa99GULCo8y48NvBexpires=1313293565method=tokentimestamp=1313293563v=18777F555E8C16715EBA5C85341684C58
*/
public static String getSignValue(List<MyBasicNameValuePair> nvps, String secret_key) throws Exception {
Collections.sort(nvps);
StringBuffer sb = new StringBuffer();
sb.append("POST");
sb.append(BAIDU_PUSE_SERVER);
for(MyBasicNameValuePair nvp: nvps){
sb.append(nvp.toString());
}
sb.append(secret_key);
String str = sb.toString();
System.out.println(str);
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] sign = md5.digest(URLEncoder.encode(str, "UTF-8" ).getBytes());
System.out.println(byte2Hex(sign));
return byte2Hex(sign);
}
public static String byte2Hex(byte[] b) {
StringBuffer sb = new StringBuffer();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
sb.append("0" + stmp);
} else {
sb.append(stmp);
}
}
return sb.toString();
}
public static class MyBasicNameValuePair extends BasicNameValuePair implements Comparable<MyBasicNameValuePair>{
public MyBasicNameValuePair(String name, String value) {
super(name, value);
// TODO Auto-generated constructor stub
}
@Override
public int compareTo(MyBasicNameValuePair o) {
// TODO Auto-generated method stub
return this.getName().compareTo(o.getName());
}
@Override
public String toString() {
return getName() + "=" + getValue() ;
}
}
}