调用百度云推HTTP REST API发送消息 -- Java 实现

调用百度云推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() ;
		}		
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值