轻量级集成与社交媒体API

在本文中,将从哲学的角度来探讨软件开发过程中的一些方法论,特别是关于如何与社交媒体API进行集成。将会区分社区驱动的库和不断演进的API,后者往往会导致项目失败。认为,需要改变与社交媒体API合作的方式,停止尝试使用选择的技术来创建SDK。技术发展得太快,相反,需要拥抱核心技术,同时保持集成层的轻量级。

Hammock - 简单易用的REST客户端

Hammock是一个开源的.NET项目,它以一种通用的方式促进了RESTful服务的消费。它提供了对异步操作、查询缓存、模拟和速率限制等功能的支持。当然,还有其他库也可以使用。

以下是一个在ASP.NET中检索用户墙上帖子的示例。可以通过JavaScript单独实现相同的功能,但假设希望在服务器上处理数据。这需要用户授予Facebook应用程序read_stream权限,并假设用户已经通过身份验证。在提供的源代码中,展示了如何使用社交插件和JavaScript以最小的努力实现这两个任务。

首先,需要创建Hammock的RestClient类的实例。这个类包含了服务EndPoint的基础URI,也可以包含其他默认属性,比如UserAgent字符串。

C# RestClient client = new RestClient { Authority = "https://graph.facebook.com/", UserAgent = "MyFacebookApp" };

接下来,创建Hammock的RestRequest类的实例。这允许对基础EndPoint URI定义的特定路径进行RESTful调用。使用Hammock的API,可以简单地向调用添加请求参数。在这种情况下,用户的access_token被附加到查询字符串中,以提供所需的授权。

C# var request = new RestRequest { Path = string.Concat(UserId, "/feed"), Method = WebMethod.Get }; request.AddParameter("access_token", AccessToken);

请注意,上面示例中显示的UserId和AccessToken值是从当前经过身份验证的Facebook用户那里获取的。在提供的源代码中,是通过一个由社交插件登录事件触发的Ajax调用传递这些值的。

到目前为止,一切都很简单,对吧?Facebook API的任何更改都意味着可以快速添加或删除发送到API的参数。

下一步是发出请求并解析响应。这是使用之前创建的RestClient完成的。

C# var response = client.Request(request); if (response.StatusCode != HttpStatusCode.OK) { throw new CommunicationException(string.Format("The EndPoint {0}{1} returned an unexpected StatusCode {2}", client.Authority, client.Path, response.StatusCode)); } var content = response.Content;

现在,有趣的部分,这也是回到关于保持轻量级和松耦合的观点的地方。可以使用Hammock的反序列化器直接将响应类型化为自己的对象,但这对来说太僵化了。相反,想使用动态类型。这将允许以松散的方式访问JSON属性,如果API更新,可以更容易地进行更改。

现在无法弄清楚如何让Hammock的现成反序列化器与动态对象一起工作。如果可能的话,如果有人知道,请告诉。相反,创建了自己的JavaScriptConverter扩展,这样就可以.NET内置的JavaScriptSerializer类。也可以通过Hammock的接口注册自己的自定义反序列化类,但保持了简单。

C# JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new JsonConverter() }); dynamic result = serializer.Deserialize(response.Content); foreach (dynamic obj in result.data) { Response.Write(obj.from.name + " wrote " + obj.message); }

ExpandoObject的好处不仅在于它提供了对响应对象的动态访问以保持松耦合,而且还实现了IDictionary<string, object>。这意味着它可以很容易地使用JavaScriptSerializer转换为类型化对象。如果决定将代码移动到服务层,并希望为业务层提供强类型的模型,这将非常有用。在转换过程中,只有在源和目标上都定义的属性才会被映射,其他属性则被忽略。

C# public class Post { public string Id { get; set; } public string Message { get; set; } } foreach (var obj in result.data) { var post = serializer.ConvertToType(obj); var message = post.Message; }

要运行包含的演示代码,应该用自己的Facebook应用程序密钥替换FBHelper类中的AppId值。有关如何获得此密钥的更多详细信息,请参见Facebook文档。

会注意到在提供的源代码中,创建了一个名为JsonExpandoObject的自定义expando类。这是因为ExpandoObject在尝试访问不存在的属性时会抛出异常。版本返回null,因此更适合与JSON一起使用。

通过实现动态类型的晚期绑定,可以进一步解耦对API的硬依赖。这对于数据层中内容的轻量级操作特别有用。对于将对象传递给业务层,已经展示了如何使用JavaScriptSerializer将动态类型快速转换为静态类型。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485