文档章节

看百度提供的云推送服务端sdk代码有感面向对象和面向过程编码思维的区别

z_jordon
 z_jordon
发布于 2015/02/07 11:36
字数 945
阅读 45
收藏 0
点赞 0
评论 1

最近做一个小项目把消息主动推送到手机客户端,于是研究了一下百度云推送的api,因为我主要是做服务端这块,所以重点就看了REST API这块的文档:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api。

协议相对来说比较好理解,接下来就是按协议来写代码了,因为这个协议是基于http协议,所以首先想到的是用apache http client包来实现协议的请求,在我脑子里第一时间蹦出来的代码大概是这样的:

HttpClient httpClient = new DefaultHttpClient();
//根据实际情况设置httpClient 的各种参数
....
//创建HttpPost实例,设置api的链接
HttpPost httpPost = new HttpPost("http://channel.api.duapp.com/rest/2.0/channel/channel");
//根据协议规定的格式拼装参数值
String apiKey = ...
String secretKey = ...
String method = "push_msg";
String sign = .....
....
//构造post请求的参数
List <NameValuePair> nvps = new ArrayList <NameValuePair>(length); 
nvps.add(new BasicNameValuePair("method“, method);
nvps.add(new BasicNameValuePair("apiKey“, apiKey);
....
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
//发送post请求
HttpResponse response = httpClient.execute(httpPost);
//获取返回的数据解析处理等
......

嗯,伪代码大概就是这样了,然后我下载了百度提供的服务端sdk:http://bs.baidu.com/push-sdk-release/Baidu-Push-SDK-Java-1.1.2.zip,

把文件解压后,发现就是一个eclipse的工程,导入到eclipse后就可以看到完整的代码了,sdk除了提供sample例子代码外,还提供了完整的协议封装及发送请求的代码(没错,百度没有把这些封装成jar,只提供jar包,还是不错的),参看sample中发送单播消息的代码,如下:

package com.baidu.yun.channel.sample;

import com.baidu.yun.channel.auth.ChannelKeyPair;
import com.baidu.yun.channel.client.BaiduChannelClient;
import com.baidu.yun.channel.exception.ChannelClientException;
import com.baidu.yun.channel.exception.ChannelServerException;
import com.baidu.yun.channel.model.PushUnicastMessageRequest;
import com.baidu.yun.channel.model.PushUnicastMessageResponse;
import com.baidu.yun.core.log.YunLogEvent;
import com.baidu.yun.core.log.YunLogHandler;

public class AndroidPushMessageSample {

    public static void main(String[] args) {

        /*
         * @brief 推送单播消息(消息类型为透传,由开发方应用自己来解析消息内容) message_type = 0 (默认为0)
         */

        // 1. 设置developer平台的ApiKey/SecretKey
        String apiKey = "yBmx69aL5tAhiq7GlGFOsvV9";
        String secretKey = "6XtzFIMm17l61MrCAIaWZXc6db8PjfqD";
        ChannelKeyPair pair = new ChannelKeyPair(apiKey, secretKey);

        // 2. 创建BaiduChannelClient对象实例
        BaiduChannelClient channelClient = new BaiduChannelClient(pair);

        // 3. 若要了解交互细节,请注册YunLogHandler类
        channelClient.setChannelLogHandler(new YunLogHandler() {
            @Override
            public void onHandle(YunLogEvent event) {
                System.out.println(event.getMessage());
            }
        });

        try {

            // 4. 创建请求类对象
            // 手机端的ChannelId, 手机端的UserId, 先用1111111111111代替,用户需替换为自己的
            PushUnicastMessageRequest request = new PushUnicastMessageRequest();
            request.setDeviceType(3); // device_type => 1: web 2: pc 3:android
                                      // 4:ios 5:wp
            request.setChannelId(3544710896330446635L);
            request.setUserId("908429798119406941");
            
            request.setMessage("Hello Channel");

            // 5. 调用pushMessage接口
            PushUnicastMessageResponse response = channelClient
                    .pushUnicastMessage(request);

            // 6. 认证推送成功
            System.out.println("push amount : " + response.getSuccessAmount());

        } catch (ChannelClientException e) {
            // 处理客户端错误异常
            e.printStackTrace();
        } catch (ChannelServerException e) {
            // 处理服务端错误异常
            System.out.println(String.format(
                    "request_id: %d, error_code: %d, error_message: %s",
                    e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
        }

    }

}

跟我写的代码的结构有很大不同有木有?思维不一样有木没有,呵呵,没错了,这就是面向对象的思维了,主要逻揖都封装在这三个类里面了:

BaiduChannelClient

PushUnicastMessageRequest

PushUnicastMessageResponse

其中BaiduChannelClient负责发送请求,PushUnicastMessageRequest负责请求协议的数据的封装,PushUnicastMessageResponse负责返回数据的协议封装。

其它不都说了,有兴趣的同学可以仔细看一下百度sdk提供的代码,大概就是这样,总体感觉还是面向面向过程的思维比较直接,但代码不容易维护是事实,面向对象的思维比较抽象,但代码确实是整洁,容易维护,也容易做单元测试。


© 著作权归作者所有

共有 人打赏支持
z_jordon
粉丝 35
博文 251
码字总数 78212
作品 0
厦门
技术主管
加载中

评论(1)

w
wahahagong1
Goeasy也挺不错的,专业做web实时推送,服务器稳定,代码简洁易懂,还有中英文,网址是https://goeasy.io/;
高性能RPC框架--BGCC

BGCC(音:[bigsisi:])是百度具有完全知识产权的跨平台、多语言、面向对象与服务的轻量级高性能RPC框架。 它支持事务级别的服务端消息主动推送,强大的接口级事务管理功能,包含自定义的通信协...

刘旭鹏
2012/10/31
10.8K
2
百度云推送 SDK--bpush-nodejs

bpush-nodejs 是百度云推送 nodejs sdk,使用简单,部署方便,基于百度云推送 rest api 3.0开发。 使用 var bpush = require('bpush-nodejs');... 说明 SDK采用Promise方式进行回调,demo代码...

xialeistudio
2015/12/30
761
0
胡泽锐:移动开发即服务——腾讯云移动开发平台技术分享

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:胡泽锐,2010 年毕业加入腾讯,先后负责过QQ空间、网页应用、移动应用、移动游戏相关的工作,有着丰富的平台产品经验以及大...

腾讯云加社区
06/01
0
0
绝对干货-国内值得关注的官方API集合,很全很强大(必须收藏)

相关阅读: 吊炸天!74款APP完整源码! 123个微信小程序源码分享(附下载) [干货]2017已来,最全面试总结——这些Android面试题你一定需要 第一 笔记 为知笔记(http://www.wiz.cn/manual...

xhmj12
2017/01/20
0
0
大咖说:如何借助腾讯云简单、高效移动开发

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 一直以来,如何能够更快速地构建高性能,高扩展的移动应用一直是移动行业的热点。在传统模式下,开发者通过手动集成所需的各种移...

腾讯云+社区
06/01
0
0
Cordova 消息推送 百度云

消息推送-百度push 选择百度云推送理由:专业、稳定、免费(Google GCM在国内有时无法正常使用) 打开网址,注册开发者帐号,登入。 http://developer.baidu.com/bae/ 此处API key与Secret ...

youxizhe
2014/10/02
0
7
使用云端服务-构建强有力的APP后端

在前面聊过一些使用baas实现一些功能的内容,今天简单聊一下基础的东西吧 没有服务端的app就是个空壳,但对个人开发者而言,服务端的搭建和部署一直是个问题,目前的方法通常就是借助后端云服...

大王12
2017/04/20
0
0
【技术分享】如何实现平滑迁移到融云

开发者已使用了第三方云服务,考虑到融云即时通讯云平台系统稳定、产品线丰富、功能高度可控可订制,希望迁移到融云平台,可详细阅读以下迁移方案。 迁移条件 第三方云服务支持并开通服务端消...

horryCC
04/13
0
0
安卓推送基本问题

本帖最后由 vichy12b 于 2015-3-2 10:55 编辑 通知和消息有什么区别? 通知:发送后会在系统通知栏收到展现,同时响铃或振动提醒用户. 消息:发送后不会在系统通知栏展现,SDK将消息传给第三...

illy安智
2015/03/02
331
0
面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化

关于面向对象的文章,100篇里面有99篇要么离谱太远,要么不知所云,但剩下有1篇是好的。我历经多年找不到那一篇,最终还是决定自己研究(因为工作环境的原因,我的研究大多集中在性能与正确性...

刘小兵2014
2011/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
11分钟前
0
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
12分钟前
0
0
vue-router懒加载

1. vue-router懒加载定义 当路由被访问的时候才加载对应组件 2. vue-router懒加载作用 当构建的项目比较大的时候,懒加载可以分割代码块,提高页面的初始加载效率。 ###3. vue-router懒加载实...

不负好时光
19分钟前
0
0
庆祝法国队夺冠:用Python放一场烟花秀

天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余也可以随时让程序为自己放一场烟花秀。 这个有趣的小项目并不...

猫咪编程
21分钟前
0
0
SpringBoot | 第七章:过滤器、监听器、拦截器

前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的,业务方是无需...

oKong
34分钟前
5
0
存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理...

DannyCoder
45分钟前
1
0
Firefox 61已经为Ubuntu 提供支持

最新和最好的Mozilla Firefox 61 “Quantum”网络浏览器已经为Ubuntu Linux操作系统的用户提供了支持,现在可以通过官方软件库进行更新。 Mozilla于2018年6月26日发布了Firefox 61版本,该版...

六库科技
今天
0
0
Win10升级后执行系统封装(Sysprep)报错

开始封装 一年多以前开始给公司封装Win10系统,便于统一给公司电脑初始化携带各种软件的系统,致力于装完既可以开发的状态。那时候最新的版本是Win10 1703版本,自然就以他为母盘,然后结合V...

lyunweb
今天
40
0
php 性能优化

#什么情况下会遇到性能问题 PHP 语法使用的不恰当

to_be_better
今天
0
0
Jenkins 构建触发器操作详解

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * * * * * (五颗星,中间用空格隔...

覃光林
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部