`
cloudtech
  • 浏览: 4814499 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

自己动手写淘宝开放平台:Rop(将WebService REST进行到底!!)

 
阅读更多

http://www.iteye.com/topic/1121252

简介


最近在开发自己公司网站的开放API服务,较深入地研究了TOP(Taobao Open Platform:淘宝开放平台http://api.taobao.com)。在接触过这么多的网站API中,发现TOP真的是做得非常不错,结构清晰明了,使用简单轻便。但是TOP没有开源,搞不到TOP的源码。所以只能“自己动手,丰衣足食”了。
我基于Spring MVC 3.0进行开发,居然3天就完工了,现在已经在公司中使用,大家的反映相当不错,现已整理了一份PPT文档,奉献给大家。同时,我将其命名为ROP(Rest Open Platform),已经在github中发布,地址是:

https://github.com/itstamen/rop

iteye的Rop群组已经改变很大,最新消息请加入群中了解:http://rop.group.iteye.com/


欢迎大家讨论!
ROP的快速开发完成,其实是借力于Spring MVC灵活的扩展性和其提供了各种好用且强大的工具类,ROP基于Spring MVC,在处理流程上进行了重新的组织,但是在实现上基本上直接利用Spring提供的工具类和组件,所以实现并不太难。

5分钟快速入门

以下是基于ROP开发Web Service的简单例子:
例子说明:
根据userName/password/salary这三个属性创建一个新用户。
第1步:创建请求对象
Java代码收藏代码
  1. packagecom.sample.rop.request;
  2. importcom.stamen.rop.RopRequest;
  3. importorg.springframework.format.annotation.NumberFormat;
  4. importjavax.validation.constraints.DecimalMax;
  5. importjavax.validation.constraints.DecimalMin;
  6. importjavax.validation.constraints.Pattern;
  7. publicclassCreateUserRequestextendsRopRequest{
  8. @Pattern(regexp="\\w{4,30}")//①通过JSR303注解指定验证规则
  9. privateStringuserName;
  10. @Pattern(regexp="\\w{6,30}")//②
  11. privateStringpassword;
  12. @DecimalMin("1000.00")
  13. @DecimalMax("100000.00")
  14. @NumberFormat(pattern="#,###.##")//③
  15. privatelongsalary;
  16. //getterandsetter...
  17. }

①、②及③处通过JSR303注解指定请求参数的合法性规则,如果请求参数值违反了规则,ROP会产生相应的错误报文。

第2步:创建响应对象
Java代码收藏代码
  1. packagecom.sample.rop;
  2. importcom.rop.RopResponse;
  3. importjavax.xml.bind.annotation.XmlAccessType;
  4. importjavax.xml.bind.annotation.XmlAccessorType;
  5. importjavax.xml.bind.annotation.XmlAttribute;
  6. importjavax.xml.bind.annotation.XmlRootElement;
  7. @XmlAccessorType(XmlAccessType.FIELD)//①
  8. @XmlRootElement(name="sampleRopResponse1")
  9. publicclassCreateUserResponseimplementsRopResponse{
  10. @XmlAttribute//②
  11. privateStringuserId;
  12. @XmlAttribute//③
  13. privateStringcreateTime;
  14. //getterandsetter...
  15. }

①、②及③处通过JAXB(即JSR222 已经包含在JDK6中)的注解对响应对象的流化规则进行设置,ROP会自动将响应的对象流化成相应的响应报文,支持XML和JSON格式,仅需通过format的参数进行指定返回格式即可。

第3步:创建服务方法
Java代码收藏代码
  1. packagecom.sample.rop;
  2. importcom.rop.ApiMethod;
  3. importcom.sample.rop.request.CreateUserRequest;
  4. importcom.sample.rop.response.CreateUserResponse;
  5. importorg.springframework.stereotype.Service;
  6. @Service//①服务方法所在的类必须标注成Bean
  7. publicclassUserRestService{
  8. @ApiMethod("sample.user.add")//②指定对应的API方法
  9. publicRopResponseaddUser(CreateUserRequestrequest){
  10. CreateUserResponseresponse=newCreateUserResponse();
  11. //addcreaetnewuserhere...
  12. response.setCreateTime("20120101010101");
  13. response.setUserId("1");
  14. returnresponse;
  15. }
  16. }

首先,服务方法所在的类必须标注成Bean,如①所示,然后在服务方法中标注ROP的@ApiMethod注解,如②所示,这里的
@ApiMethod("sample.user.add")表示,addUser(...)将处理?method=sample.user.add&...的服务请求。
处理方法的签名规约如下:
  • 入参必须继承于RopRequest父类,也可以为空(无入参);
  • 返回值必须实现RopResponse接口,由于一般的服务方法都拥有错误的可能,因此一般直接使用RopResponse作为返回类型,这样不管是正确的响应对象,还是错误的响应对象,都可以满足签名的要求。

这样,所有服务端的开发工作就完成了!下面来写客户端调用的代码。

编写调用的客户端

由于现在ROP还没有提供客户端调用包,所以我们直接使用Spring的RestTemplate来写:
Java代码收藏代码
  1. packagecom.sample.rop;
  2. importcom.rop.validation.DefaultRopValidator;
  3. importorg.springframework.util.LinkedMultiValueMap;
  4. importorg.springframework.util.MultiValueMap;
  5. importorg.springframework.web.client.RestTemplate;
  6. importjava.util.ArrayList;
  7. publicclassUserRestServiceClient{
  8. publicstaticvoidmain(String[]args){
  9. RestTemplaterestTemplate=newRestTemplate();
  10. MultiValueMap<String,String>form=newLinkedMultiValueMap<String,String>();
  11. form.add("method","sample.user.add");//<--指定服务名
  12. form.add("appKey","00001");//<--指定客户端应用的key,我们在rop.appSecret.properties
  13. //中预定义了两个appKey,服务端可通过实现AppSecretManager
  14. //定义自己的appKey管理策略。
  15. form.add("v","1.0");
  16. form.add("sessionId","test");//真实系统时,必须是真正的sessionId.
  17. form.add("format","xml");
  18. form.add("locale","en");
  19. form.add("userName","tomson");
  20. form.add("password","123456");
  21. form.add("salary","2,500.00");
  22. //对请求参数进行签名,对于"00001"appKey的密钥是"abcdeabcdeabcdeabcdeabcde"
  23. Stringsign=DefaultRopValidator.sign(newArrayList<String>(
  24. form.keySet()),form.toSingleValueMap(),
  25. "abcdeabcdeabcdeabcdeabcde");
  26. form.add("sign",sign);
  27. //发送请求,调用服务
  28. Stringresponse=restTemplate.postForObject(
  29. "http://localhost:9080/router",form,String.class);
  30. System.out.println("response:\n"+response);
  31. }
  32. }

这里的系统级参数,我们直接模仿TOP设计,说明如下:
No parmName paramType required desc
1. method String Y API method name(sample.user.add)
2. appKey String Y design to application's appKey,you can define in rop.appSecret.properties which is in classpath.
3. v String Y API version,now only support:1.0。
4. sign String Y API parameters's sing,Use SHA1 encryption algorithm
5. sessionId String N use's sessionId.you can provide a rest api so client can get it and maintain locally.
6. format String N Optional, designated response format. The default XML,currently support for an XML format, json
7. locale String N locale,such lick cn_ZH,en...

参见:http://open.taobao.com/doc/detail.htm?id=111
启用服务端的服务后,执行该测试,将返回:
Xml代码收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"standalone="yes"?>
  2. <sampleRopResponse1createTime="20120101010101"userId="1"/>

如果将format参数设置为json,则其返回的报文为:
Javascript代码收藏代码
  1. {"sampleRopResponse1":{"userId":"1","createTime":"20120101010101"}}

如果将salary参数改为"aaa",则将返回错误报文(假设format为xml):
Xml代码收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"standalone="yes"?>
  2. <errorsolution="InvalidArguments"message="InvalidArguments"code="34">
  3. <subErrors>
  4. <subError>
  5. <code>isv.parameters-mismatch:salary-and-aaa</code>
  6. <message>incomingparametersalaryandaaadoesnotmatch,both
  7. haveacertaincorrespondencebetween</message>
  8. </subError>
  9. </subErrors>
  10. </error>


分享到:
评论

相关推荐

    基于淘宝开放平台开源的rop

    **ROP**(Rapid Open Platform)是一个受到淘宝开放平台(TOP:Taobao Open Platform)启发而设计的全功能REST Web Service开源框架。相较于传统的纯技术型Web Service框架(例如CXF或Axis),ROP具有更为丰富的特性...

    ROP(Rest Open Platform)开发指南

    1. **通讯报文协议**:REST服务通常需要支持多种数据交换格式,如XML和JSON。这两种格式的选择与应用场景密切相关,JSON因其轻量级和易读性而被广泛采用。 2. **异常描述体系**:REST服务的交互完全依赖于报文,...

    ROP(Rest Open Platform)用户开发手册

    Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。...

    rop开放平台

    标题中的“rop开放平台”可能是指一个用于研究、学习或测试ROP技术的在线平台,为用户提供了一个环境来实践ROP攻击和防御策略。这样的平台可能包括各种工具、教程、示例代码和讨论论坛,帮助安全研究人员和开发人员...

    ROP(Rest-Open-Platform)开发指南

    淘宝开放平台(Taobao Open Platform,简称TOP)是基于ROP理念构建的典型示例之一。作为一个成熟且高度开放的API平台,TOP提供了丰富的业务接口,支持各种场景下的应用开发。 - **统一URL**:所有的API请求都通过...

    Rop framework

    与传统的 WebService 框架(例如 CXF 和 Jersey)不同,Rop 不仅提供了 WebService 的核心功能,还针对服务开放平台中的应用层问题提供了多种解决方案。 **特点**: 1. **易于上手**:Rop 的设计使得开发者能够...

    rop轻松谈.pdf

    ret2text攻擊方法是通過覆蓋函數返回地址,控制程式的執行流程,執行惡意代碼,並將惡意代碼寫入到文本區域中。 Return Oriented Programming Return Oriented Programming(ROP)是一種高級的攻擊技術,通過在程...

    Nguyen:OptiROP——ROP gadgets搜寻神器

    9月25日,SyScan360 2013国际前瞻信息安全会议在北京国家会议中心举行。安全专家Nguyen Anh Quynh同与会者共同探讨《OptiROP:ROP gadgets搜寻神器》这一议题,并现场传授使用OptiROP的方法。

    Rop开发手册

    Rop的设计灵感来源于大型网站服务开放平台的成功实践,为开发者提供了一套成熟的解决方案,使得他们能够快速构建类似淘宝服务开放平台的高效服务平台。 #### 二、Rop功能架构剖析 Rop的功能架构不仅包含核心的...

    Rompmporium漏洞:ROP Emporium漏洞

    ROP Emporium是一个在线平台,提供了一系列的挑战,旨在帮助安全研究人员和逆向工程师学习和实践ROP技术。 **什么是ROP(Return-Oriented Programming)?** ROP允许攻击者通过拼接一系列预先存在的、短小的指令...

    ROP : Read origin protocol:ROP 是一种计算协议,用于发现所有读取的来源-开源

    ROP 是一种计算协议,旨在发现所有读数的来源,这些读数源自复杂的 RNA 分子、重组抗体和微生物群落。 ROP 占 poly(A) 和核糖耗竭协议所有读数的 98.8%,而传统的基于参考的协议为 83.8%。 ROP 分析重复、circRNA、...

    rop-plus:rop框架修改加强版

    `rop-plus`是一个针对Java平台的ROP框架的增强版本,它为开发者提供了更强大的工具和功能,以进行ROP攻击的研究和防御。框架的主要特点可能包括: 1. **gadget库**:`rop-plus`可能包含了一个庞大的Java gadget库,...

    rop demo完整用例

    本文档旨在提供一个学习和研究ROP的平台,通过实际操作理解ROP的工作原理和实施方法。如果你在学习过程中发现任何错误或有疑问,可以通过留言的方式提出,共同探讨和改进。 **相关知识点:** 1. **返回导向编程...

    exrop:自动ROPChain生成

    Exrop是自动ROP链生成器工具,可以根据给定的二进制文件和约束条件自动构建小工具链 要求: , 目前仅支持x86-64! 特征: 处理单向小工具(jmp reg,call reg) 设置寄存器( rdi=0xxxxxx, rsi=0xxxxxx ) 将...

    Rop-Fast:快速跳动

    6. **模型绑定与验证**:框架内置了模型绑定和验证机制,自动将请求参数映射到对象,同时进行数据验证,确保数据的正确性。 7. **错误处理与日志**:提供了统一的错误处理机制和详细的日志记录,便于调试和问题追踪...

    rop-sample.rar_.comrop_rop_rop源码下载_taobao netty

    3. **利用Netty进行数据传输**:通过Netty的编码和解码功能,将ROP链作为数据包发送到服务器或接收来自服务器。 4. **触发漏洞**:在适当的时间点,触发漏洞,使得控制流转向预设的ROP链。 5. **执行自定义逻辑**:...

    rop编程入门

    ROP编程,全称Return-Oriented Programming,是一种高级的计算机安全攻击技术。...作者还提醒,使用ROP技术进行任何形式的实际攻击行为都是非法和不道德的,这篇文章只应该用于学术研究和提高安全意识。

    植物小G蛋白ROP的研究进展

    植物小G蛋白ROP的研究进展涉及了植物细胞信号传导系统中的关键调节因子ROP(Rho of Plants)蛋白,它们属于Rho家族的小鸟嘌呤核苷酸结合蛋白,对植物生长、形态建成、细胞极性建立以及激素反应等众多生理过程有着...

    rop-master.rar

    RopRop 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 服务开放平台 服务开放平台 服务开放平台 这样的服务平台 这样的服务平台 这样的服务平台 这样的服务平台 。RopRopRop充分借鉴了当前大型网站...

Global site tag (gtag.js) - Google Analytics