- 浏览: 227268 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (212)
- 架构师-01-文档目录 (3)
- 架构师-02-组织 (7)
- 架构师-03-实施 (35)
- 架构师-04-监督 (14)
- 架构师-05-工具 (29)
- 架构师-09-引用文集 (63)
- 专题-01-微博应用 (5)
- 专题-02-GoogleEarth (1)
- 专题-03-运行维护 (9)
- 专题-04-经纪人营平 (3)
- 专题-05-RCP&RAP (5)
- 专题-06-框架PK (3)
- 专题-07-Android (13)
- 专题-08-UI (3)
- 专题-liferay6 (6)
- 专题-extjs4 (3)
- 专题-CXF (3)
- 专题-封闭网络的社会化 (0)
- 扯谈 (4)
- 外包 (9)
- 专题-C++ (4)
- 专题-09-BI (2)
- jquery&easyui (2)
- 专题-搜索引擎 (1)
最新评论
-
brighter:
oMapper.configure(Deserializati ...
jackson 抛出 bean 中没有定义字段的错误,只好用 gson -
PassFeed_free:
public Bitmap decode(ImageDecod ...
android universalimageloader 几点改进 -
PassFeed_free:
楼主你好, 请问这个库, 在大屏显示高清图片 ,listvie ...
android universalimageloader 几点改进 -
yonghong:
楼主只是揣测
JIRA4.1 升级到 JIRA5.1 -
abdxj:
"Could NOT parse license t ...
JIRA4.1 升级到 JIRA5.1
引用说明:原文来自于http://www.infoq.com/cn/articles/social-content-apache-shindig;jsessionid=2DEB7B2D3177D28C5D104F05423FA20B,为了方便本人阅读,文本格式略有调整。
社区网络是目前网络上最热门的事情之一,所以毫不奇怪,许多Web应用程序试图加上社区网络内容来吸引更多的访问者。尽管API正在标准化[1],但大多数现有的社区网站依然提供专有API,或者对OpenSocial的不同版本提供支持,而这正是许多开发人员所面临的挑战。结果是目前OpenSocial有多版本的的API和大量的开源代码支持他们[2]。在这篇文章中我将讨论Apache Shindig[3]如何实现OpenSocial,如何减少其中的一些问题。 Adobe Flash Builder 4简体中文正式版高速下载 高速下载:Adobe Flash Builder 4 简体中文正式版 for Windows 高速下载:Adobe Flash Builder 4 简体中文正式版 for Mac 汇集最新RIA技术相关资源,提供Flash开发平台相关工具高速下载。 我首先讨论OpenSocial的标准和Shingig架构,然后说明它们如何为一个应用程序添加社区网络内容。最后,将以OpenSocial Gypsii社区网络[4]为例,讲解启用Shindig的方法。 OpenSocial 所定义的规范[5]: “OpenSocial 是一组用于构建在网络上运行的社交应用程序的API。OpenSocial 的目标是通过提供一个可在很多不同的环境中使用的通用API ,让更多的应用程序被更多的用户访问。开发人员可以使用标准的javascript 和html 创建应用程序,运行在那些已经应用OpenSocial的社交网站中。这些网站作为OpenSocial的容器,允许开发者访问他们的社区信息;反过来,又为他们的用户收到了大量的应用程序。 OpenSocail API暴露了在一个[社区网络]容器中获取用户以及他们的好友信息的方式。” 社区应用程序围绕人、活动和关系展开。人是社区网络软件和OpenSocial API的基本组成部分。Person对象提供对用户信息的访问接口,它包含了用户的基本信息或其他扩展的信息,如“最喜爱的电视节目”、“我所期望的工作”以及“最喜欢的地方”。OpenSocial API提供了用于查看和更改个人资料的支持。另一个重要的用户信息是他们在社交图中的连接。为了能够共享信息和体验朋友动态变化,OpenSocial支持用户的朋友概念,并提供检索用户朋友信息的API。当应用程序想进行交互或显示“朋友的朋友”的数据,OpenSocial允许增加一个你所做操作的可选过滤器来支持扩展查询,如用户可以通过朋友的距离来排序。容器可以有选择地支持“朋友的朋友”查询,“朋友的朋友的朋友”的查询,等等。 OpenSocial还允许朋友分享他们最近一直在做的信息-这些被称为活动。OpenSocial的公开活动流是一个用户所采取的行动的集合。活动模板允许应用程序开发人员在消息中为应用程序或用户数据块定义占位符。这种数据层和显示层的分离允许多个活动合并成活动包:活动综合包,让用户知道他们朋友消息,而不必辛苦地搜集大量消息。社区互动的另一个重要方面是能够读取,张贴和删除用户之间在网络中的消息。 OpenSocial定义的消息类型,包括公共消息(如文件的评论)和私人消息(仅限于某些个人和团体)。消息归纳,其中包括一个唯一的ID,名称和信息数量大小。 目前的规范定义了两种版本的API──JavaScript[6]和REST[7]。 OpenSocial的JavaScript规范是提供一个小工具Gadget[8]设计来支持OpenSocial的功能。架构如图1: 图1 使用JavaScript OpenSocial API典型架构 在这种情况下,一个用户应用程序被作为一个Gadgets的集合,Gadget自己用OpenSoical API可以获取社交信息。因此, JavaScript API与Gadget API的紧密结合,并非总是适合不是基于Gadget的实现。 相反的,OpenSocail REST API不直接与Gadgets关联,允许任何客戶端应用程序来查看和发布用户的OpenSocial数据。我们将用这些API来实现OpenSocial应用。 Apache Shindig是Gadget API和OpenSocial API的开源实现。下面将简单回顾一下什么是Apache Shindig;Apache Shindig是一个OpenSocial的容器,帮助您通过提供代码托管、代理请求和处理REST和RPC请求来快速启用OpenSocial。 图2 Apache Shindig[9] 对于OpenSocial,Shindig同时实现JavaScript和REST的API。 Shindig OpenSocial实现[10]总体结构如图3: 图3 Shindig实现Open Social的整体结构图 从图3中我们可以看到Shindig实现包括两个主要部分:客户端的JavaScript容器和Shindig服务器。 服务器是一个WAR文件,它可以运行在任何Servlet容器中-我们使用Tomcat。正如上面所定义的,因为我们正在直接用REST OpenSocial API,所以在这里我们不会讨论客户端JavaScript容器。 服务器执行包含两个监听器:JSON RPC Servlet和数据服务(REST)Servlet。 每个Servlet被它自己的处理程序支持。 因此有两个处理器:RPC和REST的处理器。这两种处理器共享同一基础类库,包括日期转换器(这里没有显示)和一系列OpenSocial的处理器: Shindig服务实现基于依赖注入框架Guice[11]。它使用的是绑定类(在web.xml文件中配置),所定义的服务被每一个处理器调用:即每个处理程序使用相应的服务。这种架构极其易于使用自定义实现覆盖Shindig发布服务一部分的实现,如实现与现有社区网络应用程序的集成。 Gypsii[12]是一个位置感知的社区网络。为实现共同的社区网络,除了传统的用户归属,它还允许其参与者存储和共享地点与位置信息,包括地址,地理坐标,可选的图片和说明。 GyPSii中一个特殊的地点是当前用户的位置。它也支持POI(兴趣点)和广告。 GyPSii提供了一套API:GyPSii OenExperience API(OEx)[13]、XML-RPC API,还提供了访问GyPSii所有功能的方法。 GyPSii XML-RPC的变种是由XML - RPC规范[14]创造的,但已适应GyPSii的需要。该协议定义使用XML双方沟通时一个客户端服务器的通信模式。 Gypsii为开发人员提供了XML-RPC协议和应用了该协议的JAVA客户端实现的文档。 实现的整体架构如图4。实现一个Gypsii的适配器,通过自定义OpenSocial容器替换Shindig提供的默认OpenSocial容器的方式,使得现有的Shindig 支持OpenSocial REST。 请注意,这个自定义提供者可以连接到任何其他社区网络供应商,如Facebook,MySpace或Ning。 图4 整体解决方案框架 这种方法的好处是有效地将我们的应用程序与特定的社区网络的实现/集成方法屏蔽开来。客户端API由Shindig提供和内部控制。因此,我们的应用程序不依赖于具体的技术和社区网络供应商公开的API。这些细节被封装在一个特定的网络适配器中。 与多个社区网络供应商集成的复杂问题之一是安全/证书支持,范围涉及从一个登录用户名称/密码到OpenID[15],再到OAuth[16]。我们的实现是基于一个简单的身份转换,如图5所示。 图5 身份转换 例如,用户ID 123468@gypsii意味着NAVTEQ用户以ID123468访问Gypsii。 用户请求具有NAVTEQ’s用户ID的Shindig:令牌。网络要求一种特定的社会网络适配器将令牌转换成证书。基于用户存储的转换包含转换所需的信息:用户名/密码,OpenID,特定的键或其他任何一个特定的转换要求。这允许我们使用Navteq公司的用户ID作为OpenSocial REST API的标准化参数。它还允许多个供应商之间的社区网络的请求,基于以下命名约定简单实现: OpenSocialUID = NAVTEQUID@Network 例如用户ID 123468 @ GyPSii意思是ID 123468的NAVTEQ用户访问Gypsii。这允许构建一个非常简单的网络适配器(图4),社区网络适配器根据所提供的用户名选择线路。 在依赖注入支持下,替换默认的社区网络服务就相当简单,主要包括以下主要步骤: 清单1 客户自定义的OpenSocial 服务 清单2 绑定自定义OpenSocial服务 清单3 Web.config变化 我们需要从浏览器中访问OpenSocial REST APIs。这里的问题是现在浏览器都具有同源策略限制[17]: “同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求URL域必须和当前网站的域相同。这基本上意味着,Web浏览器将不同域的内容隔离以阻止它们彼此对终端用户的操作。” 这里有几种克服限制的常用方法: 由Shindig提供的OpenSocial API是利用GET从社区网络中获取信息和POST更新信息。为了支持GET方式,我们充分利用JSONP,而为了支持POST方式,我们使用框架技术。 为了实现服务器上JSONP支持,我们使用了开源JSONP过滤器[18],不要求对Shindig的方案变动支持。在Shindig的Web.xml中定义过滤器用法(清单4): 清单4 配置JSONP过滤器 我们还必须稍微修改Shindig代码使之能够支持Post方式。Shindig发布版不允许内容类型为 清单5 修改ContentTypes类 清单6 修改DataServiceServlet类 另一个问题是,浏览器POST方式提交名称/值。虽然,Shindig支持POST名称/值,它也支持由POST body直接处理的数据。作为一个执行增加了一个额外的名称/值参数的主体内容。问题是,在浏览器提交的情况下,Body是空的而其参数的内容被覆盖。 清单7 禁止覆盖空消息体 最后,当POST方式不会返回任何数据,Shindig实现将空数据转换成一个空的JSON对象,返回的类型为“application/json”。这将导致浏览器尝试主动与用户会话。 清单8 禁用空响应 在这篇文章中,我们描述OpenSococial的实现,用于构造GeoSpatial OpenSocial mashup,允许用户和他的朋友把他们最喜欢的地方放在地图上(图6) 图6 地图上用户和他的朋友 它还允许将用户信息和他最爱的地方以及社区网络信息(图7)发送给另一个朋友。 图7 社区网络信息 这种简单的实现只是社区网络和地理空间数据之间许多潜在协同效应之一。基于以上所描述的结合两者的方法,能实现许多其他有趣的混搭网站。 开源社区API的扩展使它很难开发出应用程序支持多种现有的社区网络。在本文中提出的一个解决方案,通过第三方提供的标准API“隐藏”前端实现差异来克服这些问题。 Apache Shindig,提供API和“插件”架构,大大简化了整个实现。 查看英文原文:Bringing in Social Content to Custom Applications with Apache Shindig。 [1] http://www.opensocial.org/ [2] http://www.thegoodnamesweregone.com/post/83-open-source-web-api-frameworks.aspx [3] http://incubator.apache.org/shindig/ [5] http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/OpenSocial-Specification.html [6] http://wiki.opensocial.org/index.php?title=JavaScript_API_Reference [7] http://wiki.opensocial.org/index.php?title=OpenSocial_REST_Developer%27s_Guide [8] http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/Gadgets-API-Specification.html [9] Source : http://incubator.apache.org/shindig/ [10] Rajdeep Dua. Architectural Overview of Shindig , an OpenSocial Reference Implementation. http://chrisschalk.com/shindig_docs/rajdeep/shindig-overview/onjava-shindig-overview-tidy.html and Rajdeep Dua. Overview of REST Implementation in Shindig - Java Version. http://sites.google.com/site/opensocialarticles/Home/shindig-rest-java [11] http://code.google.com/p/google-guice/ [12] http://www.gypsii.com/home.cgi [13] http://developer.gypsii.com/docs.cgi?op=view&id=api.html [17] Seda Özses, Salih Ergül Cross-domain communications with JSONP, Part 1: Combine JSONP and jQuery to quickly build powerful mashups.http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ [18] http://code.google.com/p/jsonp-java/ 感谢曹云飞对本文的审校。 给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。相关厂商内容
相关赞助商
OpenSocial APIs
Apache Shindig
Gypsii
实现
整体实现架构
安全
替换默认的社区服务
public class CustomOpenSocialService implements ActivityService,
AppDataService, PersonService, MessageService {
…………………………………..
}
public class NAVTEQBind extends SocialApiGuiceModule {
………………
bind(ActivityService.class).to(CustomOpenSocialService.class);
bind(AppDataService.class).to(CustomOpenSocialService.class);
bind(PersonService.class).to(CustomOpenSocialService.class);
bind(MessageService.class).to(CustomOpenSocialService.class);
………………
}
org.apache.shindig.common.servlet.GuiceServletContextListener
类调用Shindig应用程序和设置正确的绑定。
<context-param>
<param-name>guice-modules</param-name>
<param-value>
org.apache.shindig.common.PropertiesModule:com.navteq.opensocial.bind.NAVTEQBind
</param-value>
</context-param>
从浏览器中访问OpenSocial REST API
<filter>
<display-name>jsonp</display-name>
<filter-name>jsonp</filter-name>
<filter-class>org.jsonp.JsonpFilter</filter-class>
<init-param>
<param-name>jsonp</param-name>
<param-value>jsonpCallback</param-value>
</init-param>
<init-param>
<param-name>json-mime-types</param-name>
<param-value>application/json</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jsonp</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
application/x-www-form-urlencoded
,因为它与OAuth body signing冲突。因为我们没有使用OAuth和application/x-www-form-urlencoded
的内容类型的POST浏览器,我们必须修改类org.apache.shindig.protocol.ContentTypes
(清单5)和org.apache.shindig.protocol.DataServiceServlet
(清单6)允许application/x-www-form-urlencoded
:………………….
public static void checkContentTypes(Set<String> allowedContentTypes,
String contentType, boolean disallowUnknownContentTypes) throws InvalidContentTypeException {
if (StringUtils.isEmpty(contentType)) {
if (disallowUnknownContentTypes) {
throw new InvalidContentTypeException(
"No Content-Type specified. One of "
+ StringUtils.join(allowedContentTypes, ", ") + " is required");
} else {
// No content type specified, we can fail in other ways later.
return;
}
}
contentType = ContentTypes.extractMimePart(contentType);
//BL. comented out to support
// if (ContentTypes.FORBIDDEN_CONTENT_TYPES.contains(contentType)) {
// throw new InvalidContentTypeException(
// "Cannot use disallowed Content-Type " + contentType);
// }
..........................................
……………
public static final Set<String> ALLOWED_CONTENT_TYPES =
new ImmutableSet.Builder<String>().addAll(ContentTypes.ALLOWED_JSON_CONTENT_TYPES)
.addAll(ContentTypes.ALLOWED_XML_CONTENT_TYPES)
.addAll(ContentTypes.FORBIDDEN_CONTENT_TYPES)
.addAll(ContentTypes.ALLOWED_ATOM_CONTENT_TYPES).build();
……………………
org.apache.shindig.protocol.DefaultHandlerRegistry
类(清单7)更改修复了这个问题。 ……………..
public Future<?> execute(Map<String, String[]> parameters, Reader body,
SecurityToken token, BeanConverter converter) {
try {
// bind the body contents if available
if (body != null) {
String bString = IOUtils.toString(body);
if(bString.length() > 0)
parameters.put(operation.bodyParam(), new String[]{bString});
}
RequestItem item = methodCaller.getRestRequestItem(parameters, token, converter,
beanJsonConverter);
listener.executing(item);
return methodCaller.call(handlerProvider.get(), item);
………………………………………..
org.apache.shindig.protocol.DataServiceServlet
(清单7)解决了这一问题:org.apache.shindig.protocol.DataServiceServlet (Listing 7) solves this problem:
servletResponse.setContentType(converter.getContentType());
if (responseItem.getErrorCode() >= 200 && responseItem.getErrorCode() < 400) {
Object response = responseItem.getResponse();
// TODO: ugliness resulting from not using RestfulItem
if (!(response instanceof DataCollection) && !(response instanceof RestfulCollection)) {
//BL - modified to not return fake responce
if(response instanceof Map){
if(((Map)response).isEmpty()){
servletResponse.setContentType("text/plain");
return;
}
}
response = ImmutableMap.of("entry", response);
}
示例应用程序
结论
发表评论
-
深入理解Java:SimpleDateFormat安全的时间格式化
2014-06-26 01:45 461原文引用自:http://www.cnblogs.com/p ... -
注册MS CRM 2011 online
2014-04-24 00:38 506http://www.cnblogs.com/StoneGa ... -
微信架构推测
2013-08-06 09:45 1337原文:http://wenku.baidu.com/vie ... -
arc-04-10-手机应用的性能测试
2013-01-05 15:01 679手机性能测试的工具一大堆,但专门针对开发手机应用的性能测试工 ... -
GraphicsMagick 介绍及安装
2012-12-26 16:56 1239引用说明:原文来自 http://paris8.org/a/b ... -
在windows系统中生成数字证书-V3
2012-12-10 16:43 1056引用说明:原文来自 http://zhouyongqiang. ... -
如何从最大用户并发数推算出系统最大用户数
2012-11-19 14:52 1415引用说明:原来来自 ht ... -
使用JIRA搭建企业问题跟踪系统
2012-07-20 09:33 0原文来自:http://www.blogjava.net/zh ... -
Eclipse rcp/rap 开发经验总结
2012-01-11 23:48 1261有牛人将 Eclipse RCP & RAP 开发经验 ... -
VMware Server 在 CentOS 下的安装与配置
2012-01-08 09:46 1097引用说明:原文来 ... -
rdesktop:Linux 下的远程桌面客户端
2012-01-07 11:37 943引用说明:原文来自于 http://blog. ... -
解决 Oracle 11g存在密码过期问题
2012-01-04 09:52 795引用说明:原文来自 ... -
角色权限,RBAC
2011-12-27 23:00 869引用说明:原文来 ... -
Spring Security 2 配置精讲
2011-12-12 20:10 775引用说明:原文来 ... -
Linux下Mongodb的分布式分片群集(sharding cluster)配置
2011-12-12 09:45 823引用说明:原文来自于http://www.linux ... -
使用 JReble 实现 tomcat 热布署
2011-11-24 09:42 2093甚至有人为了实现热部署,放弃各种框架(struts, spri ... -
基于MongoDB的好友消息动态的实现思路
2011-10-18 13:45 1550引用说明:原文来自 ... -
Linkedin网站技术架构简介
2011-10-11 14:41 1211引用说明:原文来 ... -
微薄后台架构浅析
2011-10-11 14:00 779引用说明:原文来自于http://blog.sina.c ... -
通过 Flick 看数据库集群
2011-09-19 14:14 829原文参见 http://www.cchere.com/arti ...
相关推荐
**OpenSocial Java版Shindig使用Jar包** OpenSocial 是一个开放的标准,旨在定义一套API,使得社交网络应用可以跨平台运行。Java版的Shindig是实现OpenSocial规范的一个开源实现,它提供了服务器端的基础设施,使得...
Java 版 Shindig 是 OpenSocial 的实现之一,它提供了一个服务器端的框架,使得开发者可以使用 Java 语言开发这些社交应用程序。Shindig 也被称为 Apache SocialSite,它实现了 OpenSocial 规范中的各种 API,包括 ...
Shindig是一个开源项目,主要用于实现OpenSocial标准,它提供了一个服务器端...记住,Shindig的设计目的是促进社交应用的互操作性和可移植性,因此理解并正确使用其API和扩展机制对开发高效且兼容的社交应用至关重要。
Apache Shindig是一个开源项目,主要致力于开发开放社交网关(Open Social API)的实现,它为构建社交网络应用提供了一个标准的平台。这个项目在Java社区中被广泛使用,其核心目标是促进Web 2.0应用的互操作性和可...
适用于Chrome的Shindig屏幕共享扩展程序 Shindig是一个视频聊天平台,可同时容纳多达1,000名参与者。 Shindig可让您与活动参与者聊天,向主要演讲者提问,亲自向观众展示,加入视频组并进行聊天以进行协作,在私人...
8. **开发工具**:为了简化开发流程,存在许多开发工具和库,如Apache Shindig(OpenSocial服务器端实现)、OpenSocial SDK(软件开发工具包)等,这些工具帮助开发者快速创建和测试OpenSocial应用。 9. **社区和...
- **Shindig**:这是一个开源的参考实现,用作容器来运行基于OpenSocial的应用程序。 - **开发者社区**:围绕OpenSocial形成了一个活跃的开发者社群,成员们共同推动技术的发展和应用。 #### 二、OpenSocial API...
以及对Apache Shindig、Apache Hadoop(作为IBM BigInsights的一部分)、Eclipse Orion、Lyo、Paho、OpenJDK、Apache Cordova(原PhoneGap)和Dojo Maqetta的贡献,展现了其在云计算、大数据、物联网(IoT)和富...
一个社交应用程序,用于创建,协调和民主化您的社交活动。 GroupWyze允许用户在单个页面上创建事件,shindig,视频群聊,聚会,音乐会,欢乐时光,团队建设和一般的恶作剧。 朋友,家人,同事和熟人可以对特定事件...
它由Google发起,旨在创建一种通用的、跨平台的方法,使得开发者可以在各种社交网站上开发和部署应用程序,而无需为每个平台单独编写代码。 OpenSocial API主要包含以下几个核心部分: 1. **数据API**:用于获取和...
#Shindig警长管理事件的应用程序。 ##最小可行产品供组织者和财务批准者使用。 组织者可以添加,删除和编辑组织和事件。 组织者可以增加和减少活动费用。 财务批准者可以确认已收到收入,并且可以批准或拒绝组织者...
缓存是一种存储技术,它能够暂时保存频繁使用的数据到快速访问的存储介质中,从而减少数据的重复计算和低效检索,提升系统性能和用户体验。在PHP开发中,常见的缓存方式包括文件缓存、内存缓存(如APC)和数据库缓存...