`

用Spring MVC自己动手写TOP(Taobao Open Platform)

阅读更多
   最近在开发自己公司网站的开放API服务,较深入地研究了TOP(Top 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
   欢迎大家讨论!
   ROP的快速开发完成,其实是借力于Spring MVC灵活的扩展性和其提供了各种好用且强大的工具类,ROP基于Spring MVC,在处理流程上进行了重新的组织,但是在实现上基本上直接利用Spring提供的工具类和组件,所以实现并不太难。
   以下是基于ROP开发Web Service的简单例子:
   例子说明:
   根据userName/password/salary这三个属性创建一个新用户。
   第1步:创建请求对象
package com.sample.rop.request;
import com.stamen.rop.RopRequest;
import org.springframework.format.annotation.NumberFormat;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Pattern;

public class CreateUserRequest extends RopRequest {

@Pattern(regexp = "\\w{4,30}")//① 通过JSR303注解指定验证规则
private String userName;

@Pattern(regexp = "\\w{6,30}")//②
private String password;

@DecimalMin("1000.00")
@DecimalMax("100000.00")
@NumberFormat(pattern = "#,###.##")//③
private long salary;

//getter and setter...
}

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

第2步:创建响应对象
package com.sample.rop;
import com.rop.RopResponse;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD) //①
@XmlRootElement(name = "sampleRopResponse1")
public class CreateUserResponse implements RopResponse{
    @XmlAttribute//②
    private String userId;
    @XmlAttribute//③
    private String createTime;
   //getter and setter...
}

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

第3步:创建服务方法
package com.sample.rop;

import com.rop.ApiMethod;
import com.sample.rop.request.CreateUserRequest;
import com.sample.rop.response.CreateUserResponse;
import org.springframework.stereotype.Service;

@Service//① 服务方法所在的类必须标注成Bean
public class UserRestService {

    @ApiMethod("sample.user.add")//②指定对应的API方法
    public RopResponse addUser(CreateUserRequest request) {
        CreateUserResponse response = new CreateUserResponse();
        //add creaet new user here...
        response.setCreateTime("20120101010101");
        response.setUserId("1");
        return response;
    }
}

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

 
   这样,所有服务端的开发工作就完成了!下面来写客户端调用的代码,由于现在ROP还没有提供客户端调用包,所以我们直接使用Spring的RestTemplate来写:
package com.sample.rop;

import com.rop.validation.DefaultRopValidator;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;

public class UserRestServiceClient {

    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
        form.add("method", "sample.user.add");//<--指定服务名
        form.add("appKey", "00001");//<--指定客户端应用的key,我们在rop.appSecret.properties
                                    //中预定义了两个appKey,服务端可通过实现AppSecretManager
                                    //定义自己的appKey管理策略。
        form.add("v", "1.0");

        form.add("sessionId", "test");//真实系统时,必须是真正的sessionId.
        form.add("format", "xml");
        form.add("locale", "en");

        form.add("userName", "tomson");
        form.add("password", "123456");
        form.add("salary", "2,500.00");

        //对请求参数进行签名,对于"00001" appKey的密钥是"abcdeabcdeabcdeabcdeabcde"
        String sign = DefaultRopValidator.sign(new ArrayList<String>(
                            form.keySet()), form.toSingleValueMap(),
                            "abcdeabcdeabcdeabcdeabcde");

        form.add("sign", sign);

        //发送请求,调用服务
        String response = restTemplate.postForObject(
                "http://localhost:9080/router", form, String.class);
        System.out.println("response:\n" + response);
    }
}

   这里的系统级参数,我们直接模仿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 version="1.0" encoding="utf-8" standalone="yes"?>
  <sampleRopResponse1 createTime="20120101010101" userId="1"/>

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

  如果将salary参数改为"aaa",则将返回错误报文(假设format为xml):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error solution="Invalid Arguments" message="Invalid Arguments " code="34">
    <subErrors>
        <subError>
            <code>isv.parameters-mismatch:salary-and-aaa</code>
            <message>incoming parameter salary and aaa does not match, both 

have a certain correspondence between</message>
        </subError>
    </subErrors>
</error>

   ROP使用到了Spring很多底层的功能,有兴趣的iteyeer可以看我的《Spring3.x企业应用开发实战》,书中有较详细的介绍。也欢迎各位高手参加ROP开源项目中,可以在iteye中给我短消息报名参加。谢谢!


   
分享到:
评论
4 楼 liangmk 2016-03-22  
rop.appSecret.properties这个文件在哪里啊?
没看到啊
3 楼 xosadan 2012-04-10  
这个top感觉是为了生成rest、webservice的api,这个和Jersey、cxf之类已经相对成熟的rest开源组件对比起来有哪些优势呢?能做到哪些特殊的应用呢
2 楼 wwwlike 2012-03-13  
response:
{"error":{"code":"27","message":"Invalid Method","solution":"Invalid Method"}}
1 楼 wwwlike 2012-03-10  
运行  结果是index.html页面的代码哦

相关推荐

    Rapid Open Platform

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

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

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

    RabbitMQ与SpringMVC集成

    OTP(Open Telecom Platform)是Erlang的一套标准库和开发框架,提供了进程管理、分布式计算、错误恢复等机制。安装Erlang OTP对RabbitMQ来说至关重要,因为它为RabbitMQ提供了运行的基础环境。例如,提供的`otp_win...

    开源springboot开发平台源码(open-capacity-platform).zip

    Open-Capacity-Platform很可能使用了Spring MVC或WebFlux来实现RESTful服务。 9. **持续集成/持续部署(CI/CD)**:为了保证代码质量和快速迭代,平台可能采用了Jenkins、GitLab CI/CD或其他工具进行自动化构建和部署...

    spring学习资料

    5. **Introduction2open-sourceSpringframework4J2EE.ppt**:这份资料可能更专注于Spring在J2EE(Java 2 Platform, Enterprise Edition)环境下的应用。它会介绍Spring如何与EJB(Enterprise JavaBeans)、JDBC等...

    基于OSGi和Spring开发Web应用教程

    在基于OSGi和Spring开发Web应用中,OSGi(Open Services Gateway Initiative)是一个开放标准,用于创建模块化Java应用程序。它允许开发者将应用程序分解为独立的模块,称为bundle,每个bundle都包含自己的类路径、...

    spring-boot-reference.pdf

    Auto-configured Spring REST Docs Tests with Mock MVC Auto-configured Spring REST Docs Tests with REST Assured 43.3.20. User Configuration and Slicing 43.3.21. Using Spock to Test Spring Boot ...

    java源码平台-java-platform:此工程不更新了,请移步到最新的工程https://github.com/xiangxik/cas

    platform Based on servlet3.1 module standardization, use spring MVC, JPA, spring data, querydsl, shiro, fastjson, Beetl, infinispan, redis etc. open source technology, build the modular extension of ...

    开发文档外文翻译

    #### 一、标题:Spring Web MVC Framework for Rapid Open-Source J2EE Application Development: A Case Study 本标题主要讲述了利用Spring Web MVC框架进行快速开源J2EE应用程序开发的一个案例研究。这里涉及到的...

    MISDEV:它是管理信息系统开发平台,J2EE BS框架。 使用它非常容易开发MIS项目。它结合了JQuery,Spring MVC,Apache Shiro,MyBatis等。 内置核心模块如

    and efficient, high performance, strong security of the open source J2EE development platform. MISDEV include the basic functions of the enterprise information system and efficient code generation ...

    开发用jar包合集

    spring-webmvc-5.0.6.RELEASE-javadoc.jar spring-webmvc-5.0.6.RELEASE-sources.jar spring-webmvc-5.0.6.RELEASE.jar spring-websocket-5.0.6.RELEASE-javadoc.jar spring-websocket-5.0.6.RELEASE-sources....

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

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

    J2EE Open Source Toolkit

    《J2EE™ Open Source Toolkit: Building an Enterprise Platform with Open Source Tools!》这本书主要介绍了如何利用开源工具构建一个高效稳定的企业级平台。以下是几个关键的知识点: 1. **开源工具的优势**:...

    开发一个简单的 OSGi Web 应用实例

    - 使用Spring配置文件(`computeAdd-context.xml` 和 `computeMultiply-context.xml`)将这两个实现注册为OSGi服务。 **步骤2:实现Web层** 1. **Web层(bundle com.zxn.example.web):** - 使用Spring MVC框架来...

    sz-platform:ServiceZone 平台,基于开源

    ServiceZone Platform, based open source 基于开源产品构建 portal+bpm web UI: jquery ligerUI web controler: spring mvc siteMech(will remove) business: spring activiti backend: JPA(hibernate) + MyBatis ...

    平台java前端ajax,json请求

    平台接收与处理**:在Java后端,使用如Spring MVC或Jersey等框架,可以方便地处理这些JSON请求。例如,在Spring MVC中,你可以创建一个控制器方法,使用`@RequestBody`注解来接收JSON数据: ```java @PostMapping...

    Heroku-Spring-Gradle_Example:这是一个Heroku Spring Gradle示例

    7. **查看和验证部署**:部署完成后,使用`heroku open`命令打开应用,或者直接在Heroku控制台检查应用状态。 在下载的`Heroku-Spring-Gradle_Example-master`压缩包中,你应该找到项目结构,包括`src/main/java`下...

    J2EE框架_笔记.rar

    J2EE(Java 2 Platform, Enterprise Edition)框架是一个用于构建企业级分布式应用程序的平台,它为开发和部署多层架构的应用程序提供了全面的解决方案。本笔记主要涵盖了J2EE框架的核心概念、组件以及实际应用。 ...

    基于ssm的“典古”玩具销售的设计与开发论文.doc

    The integration of SpringMVC, a model-view-controller (MVC) framework, helps decouple the presentation layer from the business logic, promoting modularity and ease of maintenance. Spring provides ...

    基于ssm+mysql的在线订花系统源码数据库论文.docx

    SpringMVC, a part of Spring, handles the MVC (Model-View-Controller) pattern, facilitating the separation of concerns between business logic, presentation, and data access layers. MyBatis, another ...

Global site tag (gtag.js) - Google Analytics