一:REST简单介绍

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

REST 中最重要的概念是资源(resources) ,使用全球 ID(通常使用 URI)标识。client应用程序使用 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服务的client和服务端 的开发和部署。包含:

 

@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 的參考实现,它包括三个主要部分。

核心server(Core Server):通过提供 JSR 311 中标准化的凝视和 API 标准化,您能够用直观的方式开发 RESTful Web 服务。

核心client(Core Client):Jersey client 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, 在选择版本号和对应server时须要注意。、

从 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的一种通用。在不同project/语言/平台间传递数据的格式,其比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的响应处理类。



Restful 和 Jersey介绍(Web Service )的更多相关文章

  1. Restful 架构方式的 web service

    现在公司项目用的apache wink 搭建的web service ,感觉挺好用的.顺便学习一个这种架构方式 . 个人理解apache 实现Restful 架构方式技术有两种,如果有其他新的知识或不 ...

  2. day01(RESTful Web Service、SVN)

    今日大纲 搭建SSM环境 基于SSM环境实现用户管理系统 学习RESTful Web Service 学习SVN 统一开发环境 JDK1.7 32? 64? -- 64 Eclipse 使用4.4.1 ...

  3. Web Service概念梳理

    计算机技术难理解的很多,Web Service 对我来说就是一个很难理解的概念:为了弄清它到底是什么,我花费了两周的时间,总算有了一些收获,参考了不少网上的资料,但有些概念说法不一.我以w3c和 一些 ...

  4. WCF分布式开发必备知识(3):Web Service 使用

    参考地址:http://www.cnblogs.com/zhili/p/WebService.html 一.WebService概述 SOAP.WSDL.UDDISOAP(Simple Object ...

  5. 微软BI 之SSIS 系列 - 在 SSIS 中使用 Web Service 以及 XML 解析

    开篇介绍 Web Service 的用途非常广几乎无处不在,像各大门户网站上的天气预报使用到的第三方 Web Service API,像手机客户端和服务器端的交互等都可以通过事先设计好的 Web Se ...

  6. 用Jersey为Android客户端开发Restful Web Service

    平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...

  7. 【转】 Build a RESTful Web service using Jersey and Apache Tomcat 2009

    Build a RESTful Web service using Jersey and Apache Tomcat Yi Ming Huang with Dong Fei Wu, Qing GuoP ...

  8. Jersey(1.19.1) - Deploying a RESTful Web Service

    JAX-RS provides a deployment agnostic abstract class Application for declaring root resource and pro ...

  9. 使用Java创建RESTful Web Service

    REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Sty ...

随机推荐

  1. 使用ORACLE SQL Tuning advisor快速优化低效的SQL语句

    ORACLE10G以后版本的SQL Tuning advisor可以从以下四个方面给出优化方案 (1)为统计信息丢失或失效的对象收集统计信息   (2)考虑优化器的任何数据偏差.复杂谓词或失效的统计信 ...

  2. 【SVN】is out of date

    右击项目(team->update 或者 team->freash/cleanup),再操作,提交就可以了.

  3. 字符设备驱动: register_chrdev和register_chrdev_region

    概述: register_chrdev与unregister_chrdev配对使用: /*register_chrdev = __register_chrdev_region (一次性256个子设备, ...

  4. gcc支持c99验证

    gcc3.0以上的版本都是支持C99标准的, 但是编译程序的时候需要加上    -std=c9  才可以: 一下程序是验证gcc是否支持c99标准的: #include <stdio.h> ...

  5. video.js的使用

    跨浏览器地播放视频,在网上找了一下,找到了video.js,记录一下video.js的简单用法. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...

  6. VC++共享数据段实现进程之间共享数据

    当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.; #pragma data_seg()//恢复到正常段继续编程 ...

  7. 几个BCB例子

    http://blog.163.com/tab_98/blog/static/11924097201511274543737/

  8. Cognos 图表用图片取代”没有数据显示”

    在Cognos中做出来报表展示的时候因为没有数据感觉显示“没有可用数据”感觉很不美观.所以想用一张图片代替. 在图表的属性里面有一个“无数据内容”,点击打开之后有三个选项: 默认就是显示“没有可用数据 ...

  9. csu1306: Manor

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1306 解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点.用到优先队列,也可以 ...

  10. nginx启动过程分析

    nginx的启动过程紧紧环绕着ngx_cycle_t的结构体展开,首先通过ngx_get_options()获取命令行參数.然后通过ngx_time_init()进行时间的初始化.如全局变量ngx_c ...