Restful 和 Jersey介绍(Web Service )

标签: restful jersey web | 发表时间:2014-10-24 05:24 | 作者:u010700335
出处:http://blog.csdn.net

一:REST简介

REST 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一。

REST 中最重要的概念是资源(resources) ,使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE )操作资源或资源集。

RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务。通常,RESTful Web 服务应该定义以下方面:

Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。

支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。

服务支持的操作集合(例如 POST、GET、PUT 或  DELETE)
如下表所示:
方法/资源 资源集合, URI 如:
http://host/<appctx>/resources   成员资源,URI 如:
http://host/<appctx>/resources/1234 
GET 列出资源集合的所有成员检索标识为 1234 的资源的表示形式。
PUT 使用一个集合更新(替换)另一个集合。更新标记为 1234 的数字资源。
POST 在集合中创建数字资源在下面创建一个子资源。
DELETE 删除整个资源集合。删除标记为 1234 的数字资源。


二:REST 与 JSR(jersey)

JSR-311  Java API for RESTful Web Services (JAX-RS) 1.0 and 1.1

      JAX-RS是将在JavaEE 6引起的一种新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口 ,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端 的开发和部署。包括:
 
@Path,标注资源类或者方法的相对路径   
@GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。   
@Produces,标注返回的MIME媒体类型   
@Consumes,标注可接受请求的MIME媒体类型
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie,@FormParam来自于HTTP请求的post的form格式。
 
三:Jersey jar包简介
 
Jersey 是 JAX-RS 的参考实现,它包含三个主要部分。
核心服务器(Core Server):通过提供 JSR 311 中标准化的注释和 API 标准化,您可以用直观的方式开发 RESTful Web 服务。

核心客户端(Core Client):Jersey 客户端 API 帮助您与 REST 服务轻松通信。

集成(Integration):Jersey 还提供可以轻松集成 Spring、Guice、Apache Abdera 的库。

 注意:jar包下载  jersey jar包下载(需要积分的哦,辛苦整理的)

四:自己创建一个rest资源

用微账户的查询接口作一个例子
 
Java代码  
@Path("/accinfo" )// prgramname/rest/下的路径 
public class AccountInfoResource {  
    @Context  
    UriInfo uriInfo;  
    @Context  
    Request request;  
      
    /* 
     * Get all accounts info 
     */  
    @GET  
    @Path("all") // accinfo的子路径,也是外界调用的路径  
    @Produces(MediaType.APPLICATION_XML)  
    public List<AccountInfo> getAllaccounts() throws UnsupportedEncodingException{  
        List<AccountInfo> retList = new ArrayList<AccountInfo>();  
        EntityManager em = EntityManagerHelper.getEntityManager();  
        MaaccdtapManager mm = new MaaccdtapManager(em);  
        List<Maaccdtap> mList = mm.getAllAccounts();  
        AccountInfo ai = null;  
        AccountAdapter ad = new AccountAdapter();  
          
        for(Maaccdtap m : mList){             
            ai = ad.getAccountInfo(m);  
            retList.add(ai);  
        }  
          
        EntityManagerHelper.closeEntityManager();  
          
        return retList;  
    }     
      
    /* 
     * Get account info by mbrseq id   @GET方式
     */  
    @GET  
    @Path("{accountid}")// accinfo的子路径,也是外界调用的路径,既作为accountid又作为参数
    @Produces(MediaType.APPLICATION_JSON)  
    public AccountInfo getAccountBySid(@PathParam("accountid") String accountid)   
            throws UnsupportedEncodingException{  
          
        EntityManager em = EntityManagerHelper.getEntityManager();  
        MaaccdtapManager mm = new MaaccdtapManager(em);  
        Maaccdtap mp = mm.getAccountBySid(accountid);  
        AccountInfo ai = null;  
          
        if(null != mp){  
            AccountAdapter ad = new AccountAdapter();  
            ai = ad.getAccountInfo(mp);  
        }  
          
        EntityManagerHelper.closeEntityManager();  
          
        return ai;  
    }  
/* 
     * Get account info by mbrseq id and name   @POST方式
     */
    @POST  
    @Path("change")  
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)  
    public void responseAccountChange(  
            @FormParam(value = "id") String id,  
            @FormParam(value = "name") String name,  
            @Context HttpServletResponse servletResponse) throws IOException{  
          
      
    System.out.println("Reveiced change parameters from UI:");  
    System.out.println("ID is " + id);  
    System.out.println("Name is " + name);  
      
    URI newUrl = uriInfo.getAbsolutePathBuilder().path(id).build();  
    System.out.println(newUrl.toString());  
      
    Response.created(newUrl).build();  
    //ServletOutputStream os = servletResponse.getOutputStream();  
    PrintWriter pw = servletResponse.getWriter();  
    pw.write("The change request has been sent to backend and id is " + id);  
    pw.flush();  
    }  

 }  

测试:

用下面的URL即可访问相应的账户信息(即Resource)

   http://ip:port/MicroAcc/rest/accinfo/{mbrseq}      

   http://ip:port/MicroAcc/rest/accinfo/al l

@Produces(MediaType.APPLICATION_JSON)则可以产生Json的输出。

@POST注释会接收http post request, 将Web表单里的action指向POST的地址,例如:

   http://ip:port/MicroAcc/rest/accinfo/change 被注释的方法即可收到表单的内容。

五:配置信息 Jersey配置:

Jersey 1.2 以后的版本和一些Update的维护版本只支持Java SE 6, 在选择版本和相应服务器时需要注意。、

从 Jersey 开发包中以下的库为必须:
核心服务器:jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar
核心客户端:(用于测试)jersey-client.jar
JAXB 支持:(在高级样例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
JSON 支持:(在高级样例中使用)jersey-json.jar
(JSON是类似于xml的一种通用,在不同工程/语言/平台间传递数据的格式,其比xml更精炼更优良,几乎所有的语言和框架已经支持了,传递过来的数据再用JSON解码即可,就像c++struct结构体一样,直接json.xxx即可访问,多层的话就json.xxx.xxx)

您需要将所有的 REST 请求发送到 Jersey 容器 —— 在应用程序的 web.xml 文件中定义 servlet 调度程序(参见清单 1)。除了声明 Jersey servlet 外,它还定义一个初始化参数,指示包含资源的 Java 包。

Web.xml: Xml代码  

<servlet>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <servlet-class>  
      com.sun.jersey.spi.container.servlet.ServletContainer  
    </servlet-class>  
    <init-param>  
      <param-name>com.sun.jersey.config.property.packages</param-name>  
      <param-value>sh.cmbchina.pension.resources</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <url-pattern>/rest/*</url-pattern>  

</servlet-mapping>  

 这样,所有在包sh.cmbchina.pension.resources下面的resource类都会被注册为Restful url的响应处理类。


作者:u010700335 发表于2014-10-23 21:24:04 原文链接
阅读:130 评论:0 查看评论

相关 [restful jersey web] 推荐:

Restful 和 Jersey介绍(Web Service )

- - CSDN博客架构设计推荐文章
REST 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources) ,使用全球 ID(通常使用 URI)标识. 客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE )操作资源或资源集.

使用 Spring 3 来创建 RESTful Web Services

- - Web前端 - ITeye博客
       转载注明: 说个啥CTO-图书馆.        通过 REST 风格体系架构,请求和响应都是基于资源表示的传输来构建的. 资源是通过全局 ID 来标识的,这些 ID 一般使用的是一个统一资源标识符(URI). 客户端应用使用 HTTP 方法(如,GET、POST、PUT 或 DELETE)来操作一个或多个资源.

Spring MVC中发布Restful Web服务

- - 企业架构 - ITeye博客
对于企业应用来说,数据是许多业务的命脉,软件通常是可替换的,但是多年积累的数据是永远不能替换的. 近些年来,以信息为中心的表述性状态转移(Representational State Transfer, REST)已成为替换传统SOAP Web服务的流行方案,为了帮助Spring开发人员,Spring3.0以上的版本中封装了对REST的良好支持.

Jersey JdbcTemplate的使用

- - CSDN博客编程语言推荐文章
Jersey JdbcTemplate的使用. 经过前面的介绍,我们可以实现简单RESTful服务了,并使用map集合模拟了,学生信息的增删改查. 但是实际开发中我们更多的是与数据库打交道,使用数据库来处理数据,因此在下面的章节中我们将会介绍Jersey框架与数据库进行交互的操作. 本章节我们介绍Jersey与JdbcTemplate的结合使用.

理解RESTful架构

- InterMa - 阮一峰的网络日志
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点. 网站开发,完全可以采用软件开发的模式. 但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信.

SOAP Webservice和RESTful Webservice

- - 人月神话的BLOG
REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. REST提出设计概念和准则为:. 1.网络上的所有事物都可以被抽象为资源(resource). 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识.

Jersey Rest 异常统一处理机制

- - CSDN博客综合推荐文章
        异常分为运行时异常和非运行时异常,所谓的运行时异常是指那些不需要异常捕获的异常,总是交由虚拟机接管,如:ArrayIndexOutOfBoundsException,我们在写程序时,并没有使用try..catch来捕获它.     以前,我们进行项目开发时,习惯性的喜欢使用大量的try...catch...finally方法来进行异常处理,并且,只是将异常信息保存到log日志中即可,并没有将一些异常信息以可读性的方式返回给前端用户.

Hoop:Hadoop HDFS的RESTFul封装

- Vent - NoSQLFan
Hoop是对Hadoop HDFS Proxy 的改良重写,为Hadoop HDFS提供了HTTP(S)的访问接口. 通过标准的HTTP协议访问你的HDFS系统. 在运行不同版本的HDFS之间进行数据交换(这克服了一些RPC方式因版本不同而产生的兼容性问题). 将对HDFS的操作置于防火墙的保护下.

rrestjs高性能restful框架

- - CNode社区
rrestjs(ROA-Restful js)是在expressjs代码的基础上开发的(这样可以减少很多bug,同时要感谢expressjs作者visionmedia无私的奉献),不过整个框架结构已经完全改变了,属性以及方法定义也是全新的,可以说是一个全新的node.js框架. 先献上一个简单的hello world 的例子吧:.