利用Salesforce.com创建个人电话薄可移植平台

然后,使用该服务开发一个适用于桌面的联系人应用程序,并将它作为个人电话薄移植到您的移动平台。

Codename: BlueMix 是一款 beta 级产品,随着我们不断让其功能更加完善和更易于使用,它也将不断改进。我们会竭尽全力保持本文最新,但并不总是完全跟得上现状。感谢大家的理解!

持续跟踪频繁变化的客户和供应商联系人对企业来说是一件非常耗时的事情。诸如 Salesforce.com 之类的在线 CRM 工具可以减轻这方面的一些工作。我想出了一种无需登录到 Salesforce 即可访问 Salesforce 客户帐户数据的便捷方式:一个已验证的 Node.js 应用程序,该应用程序可通过查询 Salesforce API 来获取客户及其详细信息的列表。我用 BlueMix 构建了一个基于云的 Web 版应用程序。然后,我将此 Web 应用程序快速迁移到用作个人电话薄的移动版本中。

构建类似应用程序的前提条件

对 Node.js 和 Express 有基本的了解 一个 BlueMix 帐户和一个 JazzHub 帐户 AngularJS,一个开源的 JavaScript 框架,用于创建单页应用程序 (SPA) Ionic,一个开源的前端框架,用于使用 HTML5 开发混合移动应用程序 适用于您的移动平台的开发工具

第 1 步. 创建一个已验证的 Salesforce 应用程序

如果您还没有 Salesforce 开发人员帐户,创建一个帐户 并登录。 单击 Setup,然后展开 Build 标题下的 Create 菜单。单击 Apps 查看与您的帐户有关的应用程序的列表。

图 1.

在 Connected Apps 面板中,单击 New。在已展开的屏幕中,在 Basic Information 下面输入 Connected App Name、API Name 和 Contact Email 的值(没有空格)。在 API (Enable OAuth Settings) 部分,选择 Enable OAuth Settings。该应用程序不会使用回调,但您仍需要为 Callback URL 提供一个值。在 Available OAuth Scopes 下面,选择 Access and manage your data (api) 并将它传递给 Selected OAuth Scopes。单击 Save 来创建应用程序。

图 2.

记录打开的屏幕上的 Consumer Key 和 Consumer Secret 的值,并安全保存它们。

图 3.

只有使用有效的 Salesforce 用户名和密码才能访问处于当前状态的应用程序。要避开这个必要条件,则需要在每个请求中包含一个授权令牌,该令牌是一个组合了您的帐户密码和安全令牌的字符串。例如,如果密码是 myPassword,安全令牌是 mySecurityToken,那么授权令牌就是 myPasswordmySecurityToken。

要获得安全令牌,请在 Salesforce 主屏幕上打开 My Settings。展开 Personal 部分,并选择 Reset My Security Token。单击 Reset Security Token 按钮将安全令牌发送到与您的帐户有关联的电子邮件地址。

图 4.

现在,您已经注册了应用程序,因此不再需要访问 Salesforce 网站。

运行应用程序 获取 JazzHub 中的代码 开始使用 Node.js(视频演示) OAuth 2.0 身份验证

第 2 步. 为 JazzHub 上的现有项目建立分支

单击上面的 Get the code at JazzHub 按钮。在 JazzHub 项目页面中,单击 Edit Code,并在已打开的页面中单击 Fork。为已建立分支的项目命名,将 make it private 复选框保留为空(如果您愿意的话),并单击 Save。

第 3 步. 修改代码

我将向您展示现有项目中的每一个文件,这样您就可以了解应用程序的构造方式,并查看您自己的项目中的代码进行了哪些更改。

package.json

这个 JSON 文档包含有关应用程序的一些信息:

{ "name": "salesForceAPIProxy", "version": "0.0.1", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "express": "*" }}

package.json 至少必须包含以下属性:

应用程序的 name,可以是任意字符串 该版本的 version private,可表示 npm 是否会发布该应用程序

package.json 文件还包括:

scripts:一个 JSON 子文档,它包含应用程序生命周期内的一些重要时期将会调用的脚本。我指定了将用 node app.js 命令启动的应用程序。 dependencies:一个 JSON 子文档,它包含应用程序的模块依赖关系和版本。我指定了 Express 模块的最新版本(用 * 表示)。

manifest.yml

这个清单文件包含如何在 BlueMix 上部署应用程序的相关信息。

---applications: #Reference http://docs.cloudfoundry.com/docs/using/deploying-apps/manifest.html- name: mySalesForceProxy #Application Name. memory: 128M #The maximum memory to allocate to each application instance instances: 1 #The number of instances of the application to start host: mySalesForceProxy #Hostname for app routing. domain: ${target-base} #Bluemix Parent Domain Name path: . #Path to the application to be pushed command: node app.js #Node command, and application to start

清单中的应用程序定义的第一行是 applications:,左对齐。请注意,每个定义以一个连字符和一个空格开头,而且该字符串字面值不需要放在引号内。定义内包含的是用来部署该应用程序的一些属性:

name:应用程序名称 memory:将分配给应用程序的内存(以 MB 为单位)。 instances:将要启动的应用程序的实例数量。 host:将要部署在 BlueMix 上的应用程序的域名。 domain:父域名。为了简便起见,您可以使用 ${target-base},其中 BlueMix 运行时将会解析为 ng.bluemix.net。 path:项目中启动应用程序的文件路径,在此处是 app.js。如果文件在根目录中,则使用单个点 (.) 表示。 command:启动应用程序的命令。

app.js

app.js 文件包含服务器应用程序的主代码。

在 app.js 中,首先创建所有应用程序变量。apiVersion 变量指定了将要调用的 salesforce.com API 版本。

var apiVersion = '/services/data/v29.0/';

接下来是环境变量的定义。

var consumerKey = process.env.salesForceConsumerKey;var consumerSecret = process.env.salesForceConsumerSecret;var securityToken = process.env.salesForceSecurityToken;

这三个变量表示首次部署应用程序后,必须在 BlueMix 上的应用程序运行时中创建的环境变量(参见 第 4 步)。

access_token 和 instance_url 变量包含实例的身份验证令牌和 URL,以便在身份验证之后发送所有请求。

var access_token = '';var instance_url = '';

Express 应用程序使用以下配置代码接收外部应用程序(即您将在本文的最后一步中开发的 HTML5 应用程序)的请求。

app.use(function (req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); res.setHeader('Access-Control-Allow-Credentials', true); next();});

默认情况下,Express 会使用路由目录中的定义作为对根域请求的响应 — / — 因此,以下代码会重新配置它,以便从公共目录发送 index.html 文件(该文件可立即获得):

app.get('/', function(req, res) { res.sendfile('./public/index.html');});

两个 app.get() 块中声明了两个端点。这两个端点的设置方式是类似的。JSON 文档包含适用于 HTTP 请求的配置:

host:通过身份验证期间 salesforce.com 中返回的 instance_url 来确定 path:路径确定请求所到达的端点: accounts 端点使用 SOQL 向 Salesforce API 发送一个查询,SOQL 是一种类似 SQL 的查询语言,用来查询 Salesforce.com 数据存储库。该查询存储在 JSON 文档中,并使用 querystring.stringify 方法进行序列化。 account 端点使用一个帐户 ID 从 /sobjects/Account/ 端点请求获得帐户详细信息。 method:该方法被用来发送请求。针对应用程序的这两个端点的请求都将使用 GET。您可以考虑重写这些端点来接受 POST 请求。 headers:身份验证令牌包含在 Authorization 属性中。

该请求是使用 https.request 方法来创建的。在返回每一个数据块之后,这些数据块被存储在一个缓冲区中。在完成数据传输后,数据被解析成 JSON 并作为响应发送回来。

在创建服务器之后,就会使用 Salesforce.com API 执行应用程序身份验证。首先将一个 HTTPS 请求发送至包含以下参数和值的 OAuth 服务:

grant_type:"password" client_id:应用程序仪表板的客户密钥 client_secret:应用程序仪表板的客户秘密密钥 username:Salesforce 登录名 password:身份验证令牌(Salesforce 密码和安全令牌的组合)

这些属性存储在 JSON 文档中,并使用 querystring.stringify 进行序列化。options 变量包含针对请求的一些属性。

调用完成后,服务器通过包含 5 个参数的 UTF-8 编码的 JSON 文档进行响应。我们只需使用其中的两个参数:access_token(包含在对 API 的所有进一步请求中的令牌)和 instance_url(接收所有 API 请求的主机)。返回的数据可使用 JavaScript 的内置 JSON 解析器进行解析。两个本地变量 access_token 和 instance_url 存储了这些值。

public/index.html

这是用户在打开所部署的应用程序时看到的页面。该文件导入两个缩小的 Angular 库和 salesForceProxy 模块定义。模块中的路由定义被用来确定 <div> 标记中显示的内容。

public/templates/accounts.html

该文件通过使用 Angular ng-repeat 指令,在 accounts 端点返回的 JSON 对象的帐户列表中进行迭代。而且还会使用 Angular ng-href 指令显示 HTML 定位标记中的每一项内容,HTML 定位标记包含在 index.html 中具有 ng-href 指令的 div 中。

public/templates/account.html

该文件显示了 index.html 中具有 ng-href 指令的 div 中的单个帐户的详细信息 。

public/js/salesForceAPIProxy.js

该文件包含 salesForceProxy Angular 模块的定义。

所有 Angular 模块定义都使用了两个参数:一个包含模块名称的字符串和一个包含所有依赖关系名称的数组,在本例中,ngRoute 指令被用于实现路由。

接下来是两个控制器定义,其中一个用来调用每一个端点。这两个控制器的工作原理相似:在 $scope 对象中创建了一个变量,用来保存对端点调用的响应。您可以调用 $http 服务来调用端点,并将结果存储在变量中。当您单击在 accounts.html 页面上的 ng-repeat 循环中创建的链接时,AccountsCtrl 控制器会使用 $routeParams 服务来检索调用中使用的帐户 ID。

两个路由决定了在 index.html 页面上显示哪个模板。每个路由定义处理一个不同的 URL,在默认情况下,该 URL 是任意一个 / 或者单击默认页面上的链接时调用的 /:id。

第 4 步. 将应用程序部署到 Codename: BlueMix 中,设置运行时环境并重新部署它

使用 JazzHub 项目中的 Deploy 按钮将代码部署到 BlueMix。 从浏览器登录您的 BlueMix 帐户。 在已部署应用程序的设置中,单击 Runtime。在 Environment variables 下面,选择 User Defined,并使用 第 1 步 中的值创建 consumerKey、consumerSecret、securityToken、salesForceUsername 和 salesForcePassword 变量。不要在变量中包含 process.env. 字符串。

图 5.

单击 Save 并从 BlueMix 仪表板重新启动应用程序。

在启动应用程序后,应该能够在根 URL 中查看账户列表。单击任意一个列表来查看账户详细信息。

第 5 步. 使用 Ionic 将应用程序迁移到移动设备中

现在,您可以将 AngularJS 应用程序作为在本地开发的移动应用程序来实现。

如果您的系统上没有安装 Node.js,那么请单击 Node.js 主页 上的 Install,为您的 OS 下载并安装一个安装程序。 在开发环境中利用 npm install -g ionic 命令安装 Ionic。然后运行 ionic start nodeJSProxyIonic,这会在名为 nodeJSProxyIonic 的目录中创建一个种子项目(seed project),您将会在这个目录中构建移动应用程序。 通过使用 JazzHub 项目中的 index.html 文件作为指南,您以重建 nodeJSProxyIonic/www/index.html 文件。首先将视口 metatag 添加到种子项目中的文件内。 <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"/> Ionic 附带一个依据客户具体要求而定制的 AngularJS 版本,以及它自己的库和 CSS 文件。用以下内容替换标头中的 Angular 库的导入内容: <link rel="stylesheet" href="lib/css/ionic.css"/> <script src="lib/js/ionic.js"></script> <script src="lib/js/angular/angular.js"></script> <script src="lib/js/angular/angular-animate.js"></script> <script src="lib/js/angular/angular-sanitize.js"></script> <script src="lib/js/angular-ui/angular-ui-router.js"></script> <script src="lib/js/ionic-angular.js"></script> <script src="lib/js/angular/angular-route.js"></script> <script src="lib/js/angular/angular-touch.js"></script> <script type="text/javascript" src="cordova.js"></script>

当构建了该项目之后,最后一个条目(cordova.js)由 Cordova 动态添加到平台中。 将 salesForceProxy.js 复制到 js 目录中,并更新 index.html 标头中的链接,使其指向该目录。在 salesForcyProxy.js 中,将 ionic 指令添加到 salesForceProxy 模块的声明的数组中。移动应用程序必须将该请求发送到 BlueMix 上运行的应用程序的主机名称:http://yourappname.ng.bluemix.net,这样就可以更新两个控制器,将它们的请求发送至 BlueMix 主机。 在模板目录中创建 account.html 和 accounts.html 文件,并将它们复制到 JazzHub 工作区中的具有相同文件名的代码中。 要想支持用户从账户详细信息屏幕中调用电话号码,可以编辑模板目录中的 account.html 文件,将 Phone 条目更改为: <div> <a ng-href="tel:{{account.Phone}}">{{account.Phone}}</a></div>

构建项目:从 nodeJSProxyIonic 目录的命令窗口中运行 cordova platform add android,将 Android 平台添加到项目中。命令完该命令后,运行 cordova build android。

在完成构建之后,运行 cordova serve android 在置服务器中运行已完成的应用程序。打开 http://localhost:8000/ 并从列表中选择 Android,以便查看帐户列表。选择任意一个列表来查看其详细信息。 在 Android 设备的 Developer Options 屏幕上启用 USB 调试,然后通过 USB 数据线将其连接到 PC。运行 cordova run android 将应用程序部署到设备中。几分钟后,应用程序就会在您的设备上启动。

迁移到移动设备的操作完成了。您现在可以使用移动设备来呼叫已在 Salesforce.com 上注册的客户。

结束语

我已经向您展示了如何在 Salesforce.com 中注册一个已验证的应用程序,使用它在 Node.js 服务器上提供 REST 端点,并使用来自 AngularJS 桌面应用程序中的端点,将应用程序轻松地迁移到移动设备中。

如需执行进一步的开发,可以使用 nav-view 标记来呈现文本,并使用动画在移动设备上的屏幕之间进行切换。AngularJS 最近引入了 states 指令来替换现有的 routing 指令。states 指令易于进行更改,但对于替换本文中实现的基本路由而言,它已足够稳定。由 Salesforce.com 发出的身份验证令牌的使用期限是有限的。您可以通过手动重启应用程序来解决这个问题,或者您可以研究一下如何处理来自 API 指示该令牌已到期的响应。

时间: 2024-07-28 21:34:15

利用Salesforce.com创建个人电话薄可移植平台的相关文章

利用J2ME怎样调用手机中的电话薄?

问题描述 我写了一个手机软件,在操作中要输入电话号码,我想尝试调用手机中的电话薄来简化这个操作.哪位高手指点一下.谢谢. 解决方案 解决方案二:看看这篇http://woshizn.javaeye.com/blog/564820解决方案三:如果手机支持调取通讯录的话TextFieldtf=newTextField("","",10,TextField.PHONE_NUMBER);TextBoxtf=newTextBox("","&quo

如何在Salesforce中创建Web Service供外部系统调用

在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用Asp.net的程序进行简单的调用. 1):在Salesforce中创建如下Class [注:要想使其成为web service,那么class一定要定义成global的,具体的方法要用 webService static 修饰] [代码中省略了GenerateAccountFromXmlInfo方法的

统计及利用查询结果创建新表

一.在SELECT语句中,可以使用集合函数.行集合函数.GROUP BY子句和COMPUTE子句对查询结果进行统计.GROUP BY子句可与行集合函数或集合函数一起使用,而COMPUTE子句只能与行集合函数一起使用. 在SELECT语句中,也可以单纯使用集合函数进行统计,这时它将所有符合条件的数据统计放到一起,形成一行统计数据,这种统计方法叫做标量统计. 例:统计"business"类图书的平均价格 SELECT 'average price'=AVG(price) FROM titl

Windows XP利用TC快速创建文件列表

TC(Total Commander)是很多朋友都非常喜欢的一款超强资源管理工具,其实我们还可以利用TC快速创建文件列表并进行管理.例如,笔者希望获取"C:\Windows\SYSTEM32"文件夹下的所有可执行文件名,可以按照如下步骤进行: 第1步:设置显示类型 首先,请在主界面中打开C:\Windows\SYSTEM32文件夹,由于我们的目的是希望获取所有可执行文件名,因此需要在"显示→文件显示"菜单中选中"仅执行文件",这样将只列出EXE.

Oracle dataGuard专题:利用冷备创建standby

dataGuard是oracle提供的一种数据库级别的HA方案,最主要功能是冗灾.数据保护.故障恢复等.当然根据配置的不同,DATA GUARD还可以具备以下特点:高可用.性能提升.数据保护以及故障恢复等. DATA GUARD可以分为物理STANDBY和逻辑STANDBY两种.二者的最大差别在于,物理STANDBY应用的是主库的归档日志,而逻辑STANDBY应用的是主库的归档日志中提取的SQL语句.由于二者这一点的区别,决定了物理STANDBY无论从逻辑结构和物理结构都是和主库保持一致,而逻辑

利用有名管道创建简易的服务器客户端模型

问题描述 利用有名管道创建简易的服务器客户端模型 主要思路:建立一个公共的管道所有与服务器建立连接的先要通过这个管道相服务器发送消息然后服务器以客户端的前 4 个字符与特定的字符拼接形成新的有名管道与之交互.最后全部关闭 出现的debug:Sever.c fork之后父进程将子进程的id号码传递过去然后已这个pid当做服务器的 id号<这样服务器才可以与客户端进行交互> 在里面我使用了 raise函数表明 signal 函数讲SIGUSR1信号安装好了但是为什么不调用 handler函数呢?代

DELPHI7 创建excel工作薄时,提示: &amp;amp;quot;拒绝访问&amp;amp;quot;

问题描述 DELPHI7 创建excel工作薄时,提示: "拒绝访问" DELPHI7 创建excel工作薄时,提示:raise exception class EoleSyserror with message "拒绝访问" 程序 var eclapp,workbook:variant; ... begin ... try eclapp:=createoleobject('Excel.Application'); WorkBook:=createoleobject

利用SCOM捕获创建可疑进程的事件

本文讲的是利用SCOM捕获创建可疑进程的事件,最近,我有幸和在Azure Security Center分析小组工作的Greg Cottingham讨论,了解到进程创建事件和利用它来检查出异常事件.Azure Security Center服务是专门用于检测安全漏洞并给出相关的建议,已经于今年年初正式投入使用.下面,我将结合一些实际的攻击样本,来解释一下如何使用 SCOM(System Center Operations Manager)捕获创建可疑进程的事件. 进程创建是Windows系统中相

利用css对shiny页面优化及利用htmlwidgets包创建HTML控件

内容来源:2017年5月20日,乐逗游戏高级数据分析师在"第十届中国R会议软件工具专场"进行<HTTPS最佳安全实践>演讲分享.IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布. 阅读字数: 753 用时: 3分钟 摘要 本演讲将介绍如何利用CSS对shiny页面进行个性化设计及在网页中嵌入视频:并通过一个详细案例介绍了利用htmlwidgets包开发HTML控件,基于D3.JS库创建简单的交互桑基图,包括控件创建.函数修改.数据调用及与shiny结合的演示. 嘉宾