忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 徽章 文库 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 11433 | 回复: 10

【好书推荐】JAVA技术探讨:基于Jersey如何实现REST式的Web服务? [复制链接]

论坛徽章:
135
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-08-18 11:02 |显示全部楼层
话题背景:REST对当前软件开发非常重要,除了我们一直了解的Service API、Open API、移动端对后端的Gatway API调用(这些基本都是REST模式设计的),现在很多的DevOps操作也是通过REST API完成的,如我们了解的Docker和SpringBoot Actuator API都是REST风格的,另外HTTP/2的逐步采用,也为REST带来更多的功能和性能的提升。


讨论话题:

1. 我们都知道REST服务是通过资源定位实现对接口的解析,你知道如何设计一个接口,使其支持变长的地址查询吗?比如输入 /path/big-data 输出全部大数据相关的产品描述JSON,而输入/path/big-data/search-engine 输出大数据产品中全部的搜索引擎产品JSON。
2. 你知道Jersey和SpringBoot默认的JSON解析工具是什么吗?
3. 我们都知道,在Servlet容器中,filter的实现采用的是责任链模式。那么,在REST服务的开发过程中,如何在基于annotation方式下,实现指定两个给定filter的顺序呢?
4. 能列举Spring Cloud为开发REST服务带来的好处吗?


活动时间:2016年8月18日—9月18日


活动奖励:

活动结束后,我们将选取5位亮点回复,送技术图书《Java Restful Web Service实战(第2版)》一本。




作者: 韩陆   
丛书名: Java核心技术系列
出版社:机械工业出版社
ISBN:9787111542131
上架时间:2016-7-27
出版日期:2016 年8月
开本:16开
版次:2-1
所属分类:计算机 > 软件与程序设计 > JAVA(J#) > Java

购书链接:http://item.jd.com/12000164.html

内容简介:

本书系统、深度讲解了如何基于Java标准规范实现REST风格的Web服务,由拥有10余年开发经验的阿里云大数据架构师撰写,第1版上市后广获赞誉,成为该领域的畅销书。第2版对全书进行了优化和重构,不仅根据最新的技术版本对原有过时内容进行了更新,而且还根据整个技术领域的发展增添了新的内容。除此之外,还对第1版中存在的不足进行了优化,使得内容更加与时具进、更加有价值。不仅深刻解读了最新的JAX-RS标准和其API设计,以及Jersey的使用要点和实现原理,还系统讲解了REST的基本理论,更重要的是从实践角度深度讲解了如何基于Jersey实现完整的、安全的、高性能的REST式的Web服务,书中包含大量示例代码,实战性强。全书共10章,包括JAX-RS2入门、REST API设计、REST请求处理、REST服务与异步、REST客户端、REST测试、微服务、容器化、JAX-RS调优、REST安全等内容。书中从基础概念开始,结合大量示例和实现代码,将REST理论与Java实现相结合,循序渐进地阐述Java REST式服务,为读者提供更精炼、更准确、更全面的参考。

试读样章:
Java RESTful Web Service实战(第2版).pdf (2.65 MB, 下载次数: 214)

论坛徽章:
30
CU大牛徽章
日期:2013-05-20 10:45:13数据库技术版块每日发帖之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:29
发表于 2016-08-18 11:22 |显示全部楼层
本帖最后由 jieforest 于 2016-08-18 16:06 编辑

这本书挺想看的,占位。

---------------
1. 我们都知道REST服务是通过资源定位实现对接口的解析,你知道如何设计一个接口,使其支持变长的地址查询吗?比如输入“/path/big-data” 输出全部大数据相关的产品描述JSON,而输入“/path/big-data/search-engine” 输出大数据产品中全部的搜索引擎产品JSON。

假设我们采用Jersey库开发这个接口,接口及路由的实现大致是这样的:
  1. @Path("/path")
  2. public class BigdataResource {
  3.     @GET
  4.     @Path("/big-data")
  5.     @Produces("application/json")
  6.     public WebResourceList getAllBigdataProducts() {
  7.         ...
  8.     }

  9.     @GET
  10.     @Path("/bigdata/search-engine")
  11.     @Produces("application/json")
  12.     public WebResourceList getAllSearchEngineProducts() {
  13.         ...
  14.     }

  15. }
复制代码
2. 你知道Jersey和SpringBoot默认的JSON解析工具是什么吗?
显然是Jackson库。

3. 我们都知道,在Servlet容器中,filter的实现采用的是责任链模式。那么,在REST服务的开发过程中,如何在基于annotation方式下,实现指定两个给定filter的顺序呢?
过滤器Filter的顺序是受@Priortiy注解(即javax.annotation.Priority)的控制的,@Priortiy注解接收整数形式的参数,此整数表示过滤器的优先级。
这里还分两种情况:
1)对于容器请求过滤器ContainerRequestFilter和客户端请求过滤器ClientRequestFilter来说,拦截器是以升序的方式来处理过滤器的优先级的。因此@Priority(200)注解的过滤器会在@Priority(500)注解的过滤器之前先执行。
2)而对于容器响应过滤器ContainerResponseFilter和客户端响应过滤器ClientResponseFilter来说,拦截器是以降序的方式来处理过滤器的优先级的。因此@Priority(500)注解的过滤器会在@Priority(200)注解的过滤器之前先执行。

4. 能列举Spring Cloud为开发REST服务带来的好处吗?
Spring Cloud为开发者提供了在构建分布式系统所需的常用模式,包括:配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌Token、全局锁、选举策略、分布式会话、集群状态等。
分布式系统的协调是一个非常关键的因素,实现的不好会导致系统出现瓶颈。因此Spring Cloud就提供了构建分布式系统所需的常用模式,一方面促进了开发者的开发效率,使得开发者无需花费精力来构建和实现这些模式,并让开发分布式应用变得像开发本地应用一样简单;另一方面通过统一、一致的Spring Cloud库,使得整个分布式系统更具备健壮性,整个系统更加可靠、安全。

评分

参与人数 1可用积分 +18 收起 理由
王楠w_n + 18

查看全部评分

论坛徽章:
8
数据库技术版块每日发帖之星
日期:2015-12-22 06:20:00平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2016-01-21 06:20:00IT运维版块每日发帖之星
日期:2016-02-03 06:20:00技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34shanzhi
日期:2016-06-17 17:59:31JAVA
日期:2016-10-25 16:16:28
发表于 2016-08-18 13:17 |显示全部楼层
本帖最后由 sjf0115 于 2016-09-06 10:39 编辑

不错的书呀

1. 我们都知道REST服务是通过资源定位实现对接口的解析,你知道如何设计一个接口,使其支持变长的地址查询吗?比如输入 /path/big-data 输出全部大数据相关的产品描述JSON,而输入/path/big-data/search-engine 输出大数据产品中全部的搜索引擎产品JSON。

  1. <web-app>
  2.   <display-name>RESTfulWS</display-name>
  3.   <servlet>
  4.     <servlet-name>Jersey REST Service</servlet-name>
  5.     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  6.     <init-param>
  7.       <param-name>jersey.config.server.provider.packages</param-name>
  8.       <param-value>com.sjf.open</param-value>
  9.     </init-param>
  10.     <load-on-startup>1</load-on-startup>
  11.   </servlet>
  12.   <servlet-mapping>
  13.     <servlet-name>Jersey REST Service</servlet-name>
  14.     <url-pattern>/jersey/*</url-pattern>
  15.   </servlet-mapping>
  16. </web-app>
复制代码

  1. package com.sjf.open;


  2. import javax.ws.rs.GET;
  3. import javax.ws.rs.Path;
  4. import javax.ws.rs.PathParam;
  5. import javax.ws.rs.Produces;
  6. import javax.ws.rs.core.MediaType;

  7. import com.google.common.collect.Lists;
  8. import com.sjf.open.model.BigDataResource;

  9. import java.util.List;

  10. /**
  11. * Created by xiaosi on 16-9-5.
  12. */
  13. @Path("path")
  14. public class BigDataResourceService {


  15.     private static List<BigDataResource> bigDataResourceList = Lists.newArrayList();

  16.     static {
  17.         BigDataResource bigDataResource1 = new BigDataResource("Datameer", "machine-learning", "Datameer发布了面向企业用户的Datameer 3.0数据集成和分析软件。该版本增加了“智能分析”功能,可以从Hadoop中保存的大量复杂数据中自动找出模型和关联性");
  18.         BigDataResource bigDataResource2 = new BigDataResource("Hortonwork", "search-engine", "Hortonworks将在社区中预览下一代支持Yarn(下一代Hadoop数据处理框架)的Hortonworks Data Platform。");
  19.         BigDataResource bigDataResource3 = new BigDataResource("Kognitio", "data-analysis", "Kognitio推出了新一代的Kognitio Analytic Platform,加强了多种编程语言之间的连接性,并提高了性能");
  20.         BigDataResource bigDataResource4 = new BigDataResource("Pentaho", "data-integration", "添加大数据平台集成能力");

  21.         bigDataResourceList.add(bigDataResource1);
  22.         bigDataResourceList.add(bigDataResource2);
  23.         bigDataResourceList.add(bigDataResource3);
  24.         bigDataResourceList.add(bigDataResource4);
  25.     }

  26.     /**
  27.      * 查询全部
  28.      * @return
  29.      */
  30.     @GET
  31.     @Path("/big-data")
  32.     @Produces({MediaType.APPLICATION_JSON})
  33.     public List<BigDataResource> getAllProducts() {
  34.         return bigDataResourceList;
  35.     }

  36.     /**
  37.      * 根据type查询
  38.      * @return
  39.      */
  40.     @GET
  41.     @Path("/big-data/{type}")
  42.     @Produces("application/json")
  43.     public BigDataResource getAllProductsByType(@PathParam("type") final String type) {
  44.         for(BigDataResource bigDataResource : bigDataResourceList){
  45.             if(bigDataResource.getType().equals(type)){
  46.                 return bigDataResource;
  47.             }
  48.         }
  49.         return null;
  50.     }
  51. }
复制代码


2016-09-06 10-10-57屏幕截图.png


2016-09-06 10-11-10屏幕截图.png



2. 你知道Jersey和SpringBoot默认的JSON解析工具是什么吗?

jackson


论坛徽章:
7
IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34fulanqi
日期:2016-06-17 17:54:25C
日期:2016-10-25 16:08:32
发表于 2016-08-18 16:00 |显示全部楼层
1. 我们都知道REST服务是通过资源定位实现对接口的解析,你知道如何设计一个接口,使其支持变长的地址查询吗?比如输入 /path/big-data 输出全部大数据相关的产品描述JSON,而输入/path/big-data/search-engine 输出大数据产品中全部的搜索引擎产品JSON。
@Path注解的时候,使用区间路径和正则表达式配合,实现对动态资源地址的查询

2. 你知道Jersey和SpringBoot默认的JSON解析工具是什么吗?
Jersey2.0默认应该是MOXy,SprintBoot是Jackson

3. 我们都知道,在Servlet容器中,filter的实现采用的是责任链模式。那么,在REST服务的开发过程中,如何在基于annotation方式下,实现指定两个给定filter的顺序呢?
使用@Priority, 跟上优先级,你就可以定义filter的顺序了 ...

4. 能列举Spring Cloud为开发REST服务带来的好处吗?
- Spring为REST提供了一个restTemplate,提高开发的效率 ... 别的不知道了

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2016-08-18 16:05 |显示全部楼层
翻了一半,基本不懂。。。

论坛徽章:
13
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:002017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29极客徽章
日期:2016-12-07 14:08:02JAVA
日期:2016-10-25 16:01:09luobin
日期:2016-06-17 17:46:362016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之天津
日期:2015-12-16 22:35:03黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-10-09 06:20:002015亚冠之广州恒大
日期:2015-09-21 21:40:222015七夕节徽章
日期:2015-08-21 11:06:17
发表于 2016-08-22 22:20 |显示全部楼层
1. 我们都知道REST服务是通过资源定位实现对接口的解析,你知道如何设计一个接口,使其支持变长的地址查询吗?比如输入 /path/big-data 输出全部大数据相关的产品描述JSON,而输入/path/big-data/search-engine 输出大数据产品中全部的搜索引擎产品JSON。

这个REST服务的开源实现有很多种,基本都是类似的。
类头部定义本类的总path,方法上定义具体的paht,分类清晰
  1. @Path("/ry")
  2. public class RonYun {
  3.        
  4.         /** 日志 */
  5.         private static Logger logger = LoggerFactory.getLogger(RonYun.class);

  6.         /**
  7.          * <I>获取AppKey</I>
  8.          * <P><B>API:/ry/getToken</B></P>
  9.          * <P>example:/ry/getToken?id=id3&amp;name=小李&amp;pic=</P>
  10.          *
  11.          * @param id        用户ID
  12.          * @param name        用户姓名
  13.          * @param pic        用户图片
  14.          * @return        {"data" : {"token":"TOKEN"},"info":"成功","status":"0"}
  15.          */
  16.         @GET
  17.         @Path("/getToken")
  18.         @Produces(MediaType.APPLICATION_JSON)
  19.         public AppResult getToken(@QueryParam("uid") String uid, @QueryParam("name") String name,
  20.                                                                 @DefaultValue("") @QueryParam("pic") String pic) {
  21.     //
  22. }
  23. }
复制代码


2. 你知道Jersey和SpringBoot默认的JSON解析工具是什么吗?
    只用过Jersey2,默认是jackson;spring-boot也是默认jackson。很多开源都使用jackson包。
    当时用grizzly2+Jersery2+mongoDB3做的项目,JSON解析我给改成fastjson了
    通过实现javax.ws.rs.ext.MessageBody* 相关的接口,主要是那个jackson带了一大堆包,看着碍眼

3. 我们都知道,在Servlet容器中,filter的实现采用的是责任链模式。那么,在REST服务的开发过程中,如何在基于annotation方式下,实现指定两个给定filter的顺序呢?
    这个通过@Priority实现


4. 能列举Spring Cloud为开发REST服务带来的好处吗?
    Spring Cloud带来的好处啊,这个这么说吧
Spring Cloud继承了Spring Source整合一切的作风,以标准化的姿态将一些微服务架构的成熟产品与框架揉为一体,并继承了Spring Boot简单配置、快速开发、轻松部署的特点,让原本复杂的架构工作变得相对容易上手一些。
    最大的好处是提供服务治理相关的继承,在微服务开发中提供很大的便利。
   像服务注册发现,服务注册中心,通过spring-boot开发,只需在入口类增加@EnableEurekaServer注解即可,无需做其他操作。然后去实现服务提供这和消费者即可,代码也只需一点就可以了。

   对于rest的服务开发,有一个文档化的痛点,随着开发的进行,文档与接口会变得不一致,会导致后续一些问题。通过spring-boot开发的话,可以很方便的整合swagger2来完善这点。
   
   

论坛徽章:
135
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-08-24 11:43 |显示全部楼层
回复

论坛徽章:
25
IT运维版块每日发帖之星
日期:2016-04-01 06:20:0015-16赛季CBA联赛之福建
日期:2016-07-18 09:10:1715-16赛季CBA联赛之广东
日期:2016-07-25 18:17:09C
日期:2016-10-25 16:10:552017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之同曦
日期:2017-02-11 13:43:1415-16赛季CBA联赛之同曦
日期:2017-05-13 19:24:3815-16赛季CBA联赛之上海
日期:2017-07-19 17:38:4415-16赛季CBA联赛之福建
日期:2017-08-02 09:45:3315-16赛季CBA联赛之山东
日期:2017-08-23 17:34:3615-16赛季CBA联赛之上海
日期:2017-11-14 09:20:50数据库技术版块每日发帖之星
日期:2016-06-30 06:20:00
发表于 2016-08-24 14:40 |显示全部楼层
刚开始解除rest。还不熟。
送我一本吧。

论坛徽章:
135
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-08-24 14:49 |显示全部楼层
回复的有点多回复 9# fenyun689


论坛徽章:
25
IT运维版块每日发帖之星
日期:2016-04-01 06:20:0015-16赛季CBA联赛之福建
日期:2016-07-18 09:10:1715-16赛季CBA联赛之广东
日期:2016-07-25 18:17:09C
日期:2016-10-25 16:10:552017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之同曦
日期:2017-02-11 13:43:1415-16赛季CBA联赛之同曦
日期:2017-05-13 19:24:3815-16赛季CBA联赛之上海
日期:2017-07-19 17:38:4415-16赛季CBA联赛之福建
日期:2017-08-02 09:45:3315-16赛季CBA联赛之山东
日期:2017-08-23 17:34:3615-16赛季CBA联赛之上海
日期:2017-11-14 09:20:50数据库技术版块每日发帖之星
日期:2016-06-30 06:20:00
发表于 2016-08-24 15:25 |显示全部楼层
回复 10# 王楠w_n

我临阵磨枪试下。

1:REST 概念

REST 就是Web(World Wide Web,简称Web 或者WWW)本身的架构风格,是设计、 开发 Web 相关规范、Web 应用、Web 服务的指导原则。不符合 REST 风格要求的架构和技术, 很难在Web 这个生态系统中得到繁荣发展。

REST(Representational State Transfer)翻译为表述性状态转移,源自Roy Thomas Fielding 博士在2000 年就读加州大学欧文分校期间发表的一篇学术论文《Architectural Styles and the Design of Network-based Software Architectures》。

REST 之父在该论文中提出 了 REST 的 6 个特点,分别是:客户端 – 服务器的、无状态的、可缓存的、统一接口、分层 系统和按需编码。 REST 具有跨平台、跨语言的优势。从其诞生开始,就得到了诸多语言的快速支持, 最著名的是ROR(Ruby on Rails)框架。新兴的语言(比如NodeJs、Golang)、工具平台 (Docker、Spark)和公有云,更是将 REST 默认为服务的开放形式。


2:Jersey的模块

Jersey 框架是由核心模块、容器模块、连接器模块、Media 模块、扩展模块、测试框架 模块、安全模块以及 Glassfish Bundle 模块等 8 个大的模块组成。详情请读者浏览官方文档: https://jersey.java.net/document ... d-dependencies.html。 Jersey 核心模块包括3 个子模块,分别是通用包、服务器端实现包和客户端实现包。 Jersey 提供了3 种 HTTP 容器,分别是Grizzly2、JDK-HTTP 和 SIMPLE-HTTP,Grizzly2 同 时提供了Servlet 容器。Jersey 客户端底层依赖于连接器来实现网络通信,如果标准的客户端 模块功能不能满足业务需求,读者可以考虑引入 Grizzly 连接器包或者 Apache 连接器包。





您需要登录后才可以回帖 登录 | 注册

本版积分规则

DTCC2018购票6.8折优惠进行时

中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
----------------------------------------
优惠时间:2018年2月13日前

报名链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP