一、百度云推送介绍

云推送(Push)是百度开放云向开发者提供的消息推送服务;通过利用云端与客户端之间建立稳定、可靠的长连接来为开发者提供向客户端应用推送实时消息服务。

百度云推送服务支持推送三种类型的消息:

1、推送通知 :向移动端推送展现在系统通知栏的通知消息。

2、推送消息 :以透传的方式将开发者自定义的内容发送到客户端。开发者可以预先在客户端设定好规范,进行消息定制化。

3、推送富媒体 :推送图片、视频、音频、网址等形式的富媒体信息。

支持向所有用户或根据标签分类向特定用户群体推送消息;支持更多自定义功能(如自定义内容、后续行为、样式模板等);提供用户信息及通知消息统计信息。现在又新增了基于地理位置的推送(LBS推送),目前LBS推送还处于测试阶段。

好了,废话不多说了,要了解详细使用请查看官方文档,首先进入百度开放云平台:

http://developer.baidu.com/wiki/index.php?title=docs

可以看到REST API部分

二、REST API介绍

首先进入概述部分,就可以看到有如下内容:

第一句话“为方便开发者更灵活方便的使用云推送服务进行开发,云推送服务按照百度HTTP Open API 规范为开发者提供REST风格的 HTTP 和 HTTPS 服务端接口。”

很多读者可能不明白什么是REST风格,REST是一个主要的Web服务设计模式,定义了一组体系架构原则。

详细请看:http://baike.baidu.com/link?url=g6lVSlIDxUUzVuQy1MYhMx98d_JTE8Tj2woEpjrIY9vwghxGM3eCztXcU_gFkIwLenP5_9F0l3qhV027C9I61K

接下来就是请求格式

http[s]://channel.api.duapp.com/rest/2.0/channel/{resource}?{query_string}

做过Web开发的朋友会发现这里的请求格式其实和我们使用的Get方式没有什么区别,所以现在我们只需要去关注定义的参数

直接找示例(这里给初学的朋友一个建议,一般在看文档的时候盲目的无从下手的时候最好且最有效的办法就是找示例代码,参照示例代码看文档)

推送给所有人请求示例

Android:

http[s]://channel.api.duapp.com/rest/2.0/channel/channel?method=push_msg&apikey=Ljc710pzAa99GULCo8y48NvB&sign=8777F555E8C16715EBA5C85341684C58&timestamp=12344543232&expires=1238747373&v=1&device_type=3&push_type=3&message_type=1&messages="{\"title\":\"\",\"description\":\"test\"}"&msg_keys="testkey"

iOS:

http[s]://channel.api.duapp.com/rest/2.0/channel/channel?method=push_msg&apikey=Ljc710pzAa99GULCo8y48NvB&sign=8777F555E8C16715EBA5C85341684C58&timestamp=12344543232&expires=1238747373&v=1&device_type=4&push_type=3&message_type=1&messages="{\"aps\":{\"alert\":\"test\"}}"

IOS暂时不看,我们先来看看Android中的各个参数是什么,接下来要做的事情很简单,就是找到这些参数。

参数名称 类型 是否必需 描述
method string 方法名,必须存在:push_msg。
apikey string 访问令牌,明文AK,可从此值获得App的信息,配合sign中的sk做合法性身份认证。
user_id string 用户标识,在Android里,channel_id + userid指定某一个特定client。不超过256字节,如果存在此字段,则只推送给此用户。
push_type uint 推送类型,取值范围为:1~3

1:单个人,必须指定user_id 和 channel_id (指定用户的指定设备)或者user_id(指定用户的所有设备)

2:一群人,必须指定 tag

3:所有人,无需指定tag、user_id、channel_id

channel_id uint 通道标识
tag string 标签名称,不超过128字节
device_type uint 设备类型,取值范围为:1~5

云推送支持多种设备,各种设备的类型编号如下:

1:浏览器设备;

2:PC设备;

3:Andriod设备;

4:iOS设备;

5:Windows Phone设备;

如果存在此字段,则向指定的设备类型推送消息。 默认为android设备类型。

message_type uint 消息类型

0:消息(透传给应用的消息体)

1:通知(对应设备上的消息通知)

默认值为0。

messages string 指定消息内容,单个消息为单独字符串。如果有二进制的消息内容,请先做 BASE64 的编码。

当message_type为1 (通知类型),请按以下格式指定消息内容。
通知消息格式及默认值:

{
//android必选,ios可选
"title" : "hello" ,
“description: "hello world" //android特有字段,可选
"notification_builder_id": 0,
"notification_basic_style": 7,
"open_type":0,
"net_support" : 1,
"user_confirm": 0,
"url": "http://developer.baidu.com",
"pkg_content":"",
"pkg_name" : "com.baidu.bccsclient",
"pkg_version":"0.1", //android自定义字段
"custom_content": {
"key1":"value1",
"key2":"value2"
}, //ios特有字段,可选
"aps": {
"alert":"Message From Baidu Push",
"sound":"",
"badge":0
}, //ios的自定义字段
"key1":"value1",
"key2":"value2"
}

注意:

  • 当description与alert同时存在时,ios推送以alert内容作为通知内容
  • 当custom_content与 ios的自定义字段"key":"value"同时存在时,ios推送的自定义字段内容会将以上两个内容合并,但推送内容整体长度不能大于256B,否则有被截断的风险。
  • 此格式兼容Android和ios原生通知格式的推送。
  • 如果通过Server SDK推送成功,Android端却收不到通知,解决方案请参考该:问题
msg_keys string 消息标识。

指定消息标识,必须和messages一一对应。相同消息标识的消息会自动覆盖。特别提醒:该功能只支持android、browser、pc三种设备类型。

message_expires uint 指定消息的过期时间,默认为86400秒。必须和messages一一对应。
deploy_status uint 部署状态。指定应用当前的部署状态,可取值:

1:开发状态

2:生产状态

若不指定,则默认设置为生产状态。特别提醒:该功能只支持ios设备类型。

timestamp uint 用户发起请求时的unix时间戳。本次请求签名的有效时间为该时间戳+10分钟。
sign string 调用参数签名值,与apikey成对出现。

详细用法,请参考:签名计算算法

expires uint 用户指定本次请求签名的失效时间。格式为unix时间戳形式。
v uint API版本号,默认使用最高版本。

三、推送案例

http[s]://channel.api.duapp.com/rest/2.0/channel/channel?method=push_msg    //这个是方法名,不用理会

&apikey=Ljc710pzAa99GULCo8y48NvB                     //apikey

&sign=8777F555E8C16715EBA5C85341684C58    //下面有详细介绍

&timestamp=12344543232     //就默认

&expires=1238747373   //保持默认

&v=1                             //保持默认

&device_type=3                //3 Android设备

&push_type=3     //3 所有人

&message_type=1     //1 通知

&messages="{\"title\":\"\",\"description\":\"test\"}"     //消息内容

&msg_keys="testkey"    //使用一个不重复的字符串(唯一区别消息)

可以看到参数中有一个apikey,好吧,先去创建一个移动应用。

创建应用地址:http://developer.baidu.com/console?#app/project

再进行推送设置

可以看到上面有一个快速示例,将示例代码下载并在Eclipse中(Android开发环境中)运行。

           

现在apikey已经能够获取了,下面再来看一下sign如何获取

云推送服务API使用的签名算法如下:

获取请求的http method

获取请求的url,包括host和sheme,但不包括query_string的部分

将所有参数(包括GET或POST的参数,但不包含签名字段)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”;

将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1=v1k2=v2k3=v3”,并将http method和url按顺序拼接在这个字符串前面;

在拼接好的字符串末尾追加上应用的secret_key,并进行urlencode形成base_string;

上述字符串的MD5值即为签名的值:

sign=MD5(urlencode($http_method$url$k1=$v1$k2=$v2$k3=$v3$secret_key)); 

详细请看:http://developer.baidu.com/wiki/index.php?title=%E5%8F%82%E6%95%B0%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95

	/**
* 签名生成算法
* @param HashMap<String,String> params 请求参数集,所有参数必须已转换为字符串类型
* @param String secret 签名密钥
* @return 签名
* @throws IOException
*/
public static String getSignature(HashMap<String,String> params, String secret) throws IOException
{
// 先将参数以其参数名的字典序升序进行排序
Map<String, String> sortedParams = new TreeMap<String, String>(params);
Set<Entry<String, String>> entrys = sortedParams.entrySet(); // 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
StringBuilder basestring = new StringBuilder();
for (Entry<String, String> param : entrys) {
basestring.append(param.getKey()).append("=").append(param.getValue());
}
basestring.append(secret); // 使用MD5对待签名串求签
byte[] bytes = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
bytes = md5.digest(basestring.toString().getBytes("UTF-8"));
} catch (GeneralSecurityException ex) {
throw new IOException(ex);
} // 将MD5输出的二进制结果转换为小写的十六进制
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex);
}
return sign.toString();
}

接下来拼接好符合我创建应用的各个参数如下:

http[s]://channel.api.duapp.com/rest/2.0/channel/channel?method=push_msg&apikey=省略                   //apikey

&sign=省略    //

&timestamp=12344543232     //就默认

&expires=1238747373   //保持默认

&v=1                             //保持默认

&device_type=3                //3 Android设备

&push_type=3     //3 所有人

&message_type=1     //1 通知

&messages="{\"大碗干拌\":\"\",\"欢迎访问大碗干拌的CSDN博客\":\"test\"}"     //消息内容

&msg_keys="testkey"    //使用一个不重复的字符串(唯一区别消息)

可以看到参数中有一个apikey,好吧,先去创建一个移动应用。

运行结果:

到了这个时候好奇的朋友可能会问,这个难道就没有一个封装好的API供我们使用吗?看过我前面关于激光推送文章的朋友可能已经想到了,呵呵,下一篇我们再来看封装好的API,这个就没有这么麻烦了,哈哈

百度消息推送REST API探究的更多相关文章

  1. 百度消息推送SDK探究(并附上最简推送Demo)

    上一篇<百度消息推送REST API探究>中了解了如何使用REST API推送消息,这一篇我们来看一下百度消息推送为我们提供的SDK. 帮助文档:http://developer.baid ...

  2. 消息推送之百度云推送Android集成与使用方法

    这两天由于项目需要,研究了一下百度云推送,本来这事没什么多大工作量的,但注册百度开发者账户创建应用令我蛋疼菊紧了好一阵,这些东西做了对技术没啥提升,不做又不行,必经之路.好在我耗费了N多个毫毫秒秒后稀 ...

  3. 友盟消息推送api、python sdk问题、测试demo代码

    一,友盟消息推送python服务端sdk地址和文档地址 1.sdk地址:http://dev.umeng.com/system/resources/W1siZiIsIjIwMTYvMDgvMTkvMT ...

  4. Java端百度云推送消息Demo

    因为在做Java服务器有用到推送消息机制,于是到网上找了一下,就自己试着敲了一个demo.这个demo主要是简单的一个对app消息推送. jar:百度云消息推送Java端的jar. package x ...

  5. 消息推送之百度云推送Android集成与用法

    这两天因为项目须要.研究了一下百度云推送,本来这事没什么多大工作量的,但注冊百度开发人员账户创建应用令我蛋疼菊紧了好一阵,这些东西做了对技术没啥提升,不做又不行,必经之路. 好在我耗费了N多个毫毫秒秒 ...

  6. 百度云推送-服务端 C# SDK

    思路: 1.公司有项目需要做android和ios手机端推送消息的功能: 2.没有接触过这方面的知识,一头雾水,开始在网上一顿搜,网上倒是有不少解决方案,首先搜的是android的解决方案,因为ios ...

  7. 改写百度云推送SDK,PHP PEAR 包:Services_Baidu_Push

    iPhone使用apple push很方便,而Android很多厂商删除了google push,而且google在大陆连不上,所以要用别的办法. Android常见的推送服务商有:极光推送(http ...

  8. App之百度云推送

    集成SDK 下载最新的Android SDK压缩包并解压,在新建工程或已有工程中增加百度云推送功能. 我下载的是 ,里面有一个同名的文件夹,文件夹中有 导入云推送jar包和so文件: 将解压后的lib ...

  9. Android 高仿微信实时聊天 基于百度云推送

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百 ...

随机推荐

  1. 前台Ajax发送数据给后台

    前台发ajax请求给后台 前台代码 let data= [{receiveAdd:receiveAddVal, sendAdd:sendAddVal,distance:distance,goodsNa ...

  2. Python 极简教程(十一)字典 dict

    字典是以大括号标识,以键值对(key:value)的形式,无序,不可重复,可变的集合类型. 字典具有非常高效的读写效率. >>> d = {} # 创建一个空字典 >>& ...

  3. crm2013 查看下拉框的选项

    在CRM2011中,我们非常easy查看下拉框的选择.打开页面,按F12.把光标对准目标,就会显示出详细的选项,如图:' watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...

  4. 并发,three

    引言 很久没有跟大家再聊聊并发了,今天LZ闲来无事,跟大家再聊聊并发.由于时间过去的有点久,因此LZ就不按照常理出牌了,只是把自己的理解记录在此,如果各位猿友觉得有所收获,就点个推荐或者留言激励下LZ ...

  5. Altium Designer如何创建类,如何修改线宽

    如果线宽还是没有改变,就是因为,有一个默认的class,它的规则优先级要高于PWR

  6. LM4990音频功放芯片

    我们选用的一种封装:我们用的是DGK封装. 典型电路图: 下面是示意图:四中封装的示意图是不一样的: 下面是真正的原理图: 高放大倍数的原理图: 查分式的: 单个输入的原理图: 下面是有关电源的选择:

  7. 11.3 Android显示系统框架_最简单的surface测试程序

    APP有一个surface(界面),其有多个buffer用来存放界面数据,这些buffer是向surfaceflinger申请的: 因此我们编写的surface测试程序步骤: (1)获得surface ...

  8. DB2学习总结(1)——DB2数据库基础入门

    DB2的特性 完全Web使能的:可以利用HTTP来发送询问给服务器. 高度可缩放和可靠:高负荷时可利用多处理器和大内存,可以跨服务器地分布数据库和数据负荷:能够以最小的数据丢失快速地恢复,提供多种备份 ...

  9. springboot 使用FreeMarker模板(转)

    在spring boot中使用FreeMarker模板非常简单方便,只需要简单几步就行: 1.引入依赖: <dependency> <groupId>org.springfra ...

  10. startActivityForResult()方法具体解释

    我们都知道.要开启一个Activity能够在上下文环境中调用startActivity()方法. 可是假设想从开启的Activity中获取某些数据,就能够使用startActivityForResul ...