SlideShare uma empresa Scribd logo
1 de 100
Baixar para ler offline
.
RESTful Services Using JAX-RS and Jersey
蘇國鈞/Monster Su
.
.
          RESTful Services
               Using
.
         JAX-RS and Jersey

                   蘇國鈞
        monster.supreme@gmail.com
    http://monstersupreme.blogspot.com


               July 29, 2011
. Profile



   國立台灣大學電機工程學研究所畢業
   現任 資訊工業策進會 數位教育研究所 資訊技術訓練中心 教學組長
   在 Java 領域有十多年的講師教學經驗

   熟悉 XML/Web Services、Design Patterns、EJB/JPA 等 Java EE 規格,
   Struts/Spring Framework/Hibernate 等 Open Source Framework,與
   JBoss AS、GlassFish 等 Application Server

   目前負責雲端運算相關技術的推廣,主要包括 Apache Hadoop、
   Google App Engine、Microsoft Azure 等 Cloud Platform,與 iOS、
   Android、Windows Phone 7 等 Smart Handheld 端的整合運用
. Outline
    .
  ..
   1    Introduction
   ..
  .2    Implementation
    .
  ..
   3    Server-Side API
   ..
  .4    Development Tool
    .
  ..
   5    Client-Side API
   ..
  .6    Application
    .
  ..
   7    Concern
   ..
  .8    Future
    .
  ..
   9    Summary
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. SOAP 的開發方式
 Amazon Lite:
    賣 Book
    BookService - save()/delete()/get()/update()

    http://amazonlite.com/bookService?wsdl

    賣 DVD
    DVDService - persist()/remove()/load()/merge()

    http://amazonlite.com/dvdService?wsdl

    開 Invoice
    InvoiceService - insert()/cancel()/locate()/replace()

    http://amazonlite.com/invoiceService?wsdl
Service Calling Made Easy - SOAP
.   http://geekandpoke.typepad.com
. 為什麼不繼續 SOAP 下去
  ...
   1
        SOAP 以前不太好寫 (現在倒是不會)
  ...
   2
        SOAP Overhead 很大 (XML 一直都很煩)
  ...
   3
        SOAP 底層需求很高 (現在還是一樣)
  ...
   4
        SOAP 每個介面都不同 (會的單字都用完了)
  ...
   5
        SOAP 不容易跨平台 (除非不用 WS-*)
  ...
   6
        還沒想到
  ...
   7
        …
  ...
   8
        …
  ...
   9
        …
  ...
   10
        懶得想了
. Take a REST
   Amazon Lite:
      賣 Book
      HTTP Method - POST/DELETE/GET/PUT

      http://amazonlite.com/books
      賣 DVD
      HTTP Method - POST/DELETE/GET/PUT

      http://amazonlite.com/dvds
      開 Invoice
      HTTP Method - POST/DELETE/GET/PUT

      http://amazonlite.com/invoices
Service Calling Made Easy - REST
.   http://geekandpoke.typepad.com
. 感覺上…
   Information 好像是 Web 上的一個一個
   Resource
   每個 Resource 好像可以用 URI 來表示
   CRUD 相關操作好像可以透過 Uniform 的方
   式來進行
   HTTP 剛好定義了相對應的 Method,很適合
   作為底層 Protocol
   搭配 HTTP 天生 Stateless 的特性,剛好很有
   Scalability
. RESTful Services
      全名是 REpresentational State Transfer
      最早是在 2000 年由 Roy Fielding 提出
      以 Resource 為核心,不是以 Action 為核心
      透過 URL 表示 Web 上的各種 Resource
      Resource 可以透過任何方式表示,比方說
      XML、JSON、HTML、PDF、Raw Data
      不利用 WSDL 定義 Interface
      直接透過 HTTP 定義的 Method 存取資料
      GET、POST、PUT、與 DELETE
      以最適當的方式,在 Client 端與 Server 端
      之間,進行 Resource 狀態的轉移
. 用 URL/URI 來表示 Resource
  REST 否:
      URL 不一定代表 Resource
     http://localhost:8080/helloWorld

     URL 不只要可以找到 Resource
     http://localhost:8080/findBookByIsbn?isbn=0596158041

  RESTful:
      URL 真的可以代表唯一的 Resource
     https://graph.facebook.com/monster.supreme

     URL 還是可以有參數
     https://graph.facebook.com/monster.supreme/picture?type=large

     URL 還可以表示想要的 Resource 格式
     http://api.twitter.com/1/friends/ids.xml?screen_name=MonsterSupreme
. 一致的 HTTP 介面
. HTTP Method vs. CRUD
     取得 Resource:GET
     新增 Resource:POST 到既有的 URI
     實作上通常會傳回 Resource 的 URI
     修改 Resource:PUT 到既有的 URI
     刪除 Resource:DELETE
     取得 Resource 相關資訊:HEAD
     實作上一般視同沒有 Body 的 GET
     確認 Resource 支援功能:OPTIONS
     實作上一般會列出所有支援的 Method
. 類似 WSDL 的介面描述方式
 Web Application Description Language:
    簡稱 WADL
    W3C Member Submission
    Sun 的 Marc Hadley (JAX-RS Lead) 代表提出
    http://www.w3.org/Submission/wadl/
    為 HTTP-Based Web Application 提供一個
    Machine Process-able Description
    SOAP:WSDL=REST:WADL
. WADL 的長相
 1   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2   <application xmlns="http://research.sun.com/wadl/2006/10">
 3       <doc xmlns:jersey="http://jersey.dev.java.net/"
 4           jersey:generatedBy="Jersey: 1.5 01/14/2011 12:36 PM"/>
 5       <resources base="http://localhost:4848/monitoring/">
 6           <resource path="reload">
 7               <method id="reload" name="POST"/>
 8           </resource>
 9           <resource path="domain{path:.*}">
10               <param xmlns:xs="http://www.w3.org/2001/XMLSchema"
11                    name="path" style="template" type="xs:string"/>
12               <method id="getChildNodes" name="GET">
13                    <response>
14                        <representation mediaType="text/html;qs=2}"/>
15                        <representation mediaType="application/json"/>
16                        <representation mediaType="application/xml"/>
17                    </response>
18               </method>
19           </resource>
20       </resources>
21   </application>
REST vs. SOAP
    RESTful Web Services vs.“Big”Web Services
.   http://www2008.org/papers/pdf/p805-pautassoA.pdf


      REST vs. SOAP 一直是個爭議,不過:
          RPC 通常強調的是呼叫遠端功能
          REST 強調的是跟遠端交換資料
          REST 比 SOAP 容易瞭解,也容易實作
          REST 不是標準,而是 Architecture Style
          在一個不太方便撰寫程式的環境下,REST
          是一種非常好的 Service 提供方式
          非常適合用在 Web 與 Mobile 環境 (雲端)
          整合 Web Resource 時考慮用 REST
          企業內部比較重視 QoS 時考慮用 SOAP
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
Java 對 RESTful Services 的支援方式
.   J2SE/J2EE 1.4 的 REST 支援


            Server 端實作使用 Java Servlet API 或 JSP
            Client 端實作使用 java.net 套件的 URL 與
            HttpURLConnection 類別

            透過 Java API for XML Processing (JAXP) 協
            助處理 XML 資料
            透過 Java I/O 的 InputStream 與 OutputStream 類別協
            助處理 HTTP Request/Response
            比較直接,但是支援也比較弱
Java 對 RESTful Services 的支援方式
.   Java SE/EE 5 的 REST 支援


            Server 與 Client 端實作都使用 JAX-WS 2.0
            的 Service 類別,以及 Dispatch 與 Provider 介面
            透過 Java API for XML Processing (JAXP) 協
            助處理 XML 資料
            透過 Java Architecture for XML Binding 2.0
            (JAXB 2.0) 協助處理 XML 資料與 Java 物件之
            間的轉換
            因為是針對 SOAP 設計,所以套用到 REST
            的時候有點彆扭
Java 對 RESTful Services 的支援方式
.   Java EE 6 的 REST 支援


            JSR 311
            網址:https://jsr311.dev.java.net/
            全名是 Java API for RESTful Web Services
            簡稱 JAX-RS
            2007 年 2 月宣佈,2008 年 10 月正式定案
            是 Java EE 6 的一部分
            套件是 javax.ws.rs.*
            以 Annotation 為基礎,至少要 Java SE 5
            Jersey 是 JAX-RS 的參考實作
Java 對 RESTful Services 的支援比較
.   Java EE 5 vs. Java EE 6


       Java EE 5 (JSR 244):
            JAX-WS 2.0 (JSR 224)
            JAXB 2.0 (JSR 222)
       Java EE 6 (JSR 316):
            JAX-WS 2.2 (JSR 224 沒變,實作更新)
            JAXB 2.2 (JSR 222 沒變,實作更新)
            JAX-RS 1.1 (JSR 311)
. JAX-RS 相關實作
  目前檯面上的實作:
    Noelios Technologies 的 Restlet
    JBoss 的 RESTEasy
    Apache 的 CXF
    Sun/Oracle 的 Jersey
    Apache 的 Wink
    eXo 的 everREST
    Trialox ag 的 Triaxrs
比 JAX-RS 規格還早出現的 Restlet
.   http://www.restlet.org/
JBoss 當靠山的 RESTEasy
.   http://www.jboss.org/resteasy
支援 SOAP 與 REST 的 CXF
.   http://cxf.apache.org/
JAX-RS 參考實作 Jersey
.   http://jersey.java.net/
還在孵蛋中的 Wink
.   http://incubator.apache.org/wink/
eXo Platform 的 everREST
.   http://trialox.org/archives/323
支援 OSGi Container 的 Triaxrs
.   http://code.google.com/p/everrest/
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. 簡化開發過程的 Annotation
   URI Path      Parameter
   @Path
                 @PathParam
   HTTP Method   @QueryParam
   @POST         @HeaderParam
   @DELETE       @FormParam
   @GET          @CookieParam
   @PUT          @MatrixParam
   @HEAD         @DefaultValue
   @OPTIONS
                 Media Handling
   Injection     @Consumes
   @Context      @Produces
. 把 Resource 表達成 Resource Class
            Lifecycle 預設是 Per-Request,之後就可以 GC
            Jersey 支援 Per-Session 與 @Singleton
 1    import javax.ws.rs.GET;
 2    import javax.ws.rs.Produces;
 3    import javax.ws.rs.Path;
 4
 5    @Path("/helloworld")
 6    public class HelloWorldResource
 7    {
 8        @GET
 9        @Produces("text/plain")
 10       public String getClichedMessage()
 11       {
 12           return "Hello World";
 13       }
 14   }
Resource Class 也有生命週期
.   http://www.devx.com/
. 用 URI Path Template 標示對應的函式
    用 @Path 表示存取路徑
    沒有常用屬性,內容就是一個相對網址
    是不是 / 開頭或結尾沒有差別
    @Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")

    URI Path Template 可以在 URI 嵌入變數
    @Path("{bookId}/")

    public Book getBook(@PathParam("bookId") int bookId) {...}

    URI Path Template 也可以提供參數預設值
    @Path("/books/")

    public List<Book> getBooks(

        @DefaultValue("5") @QueryParam("max") int max) {...}
. 用 Designator 標示 HTTP Method
      Request Method Designator:
         包括 @GET、@POST、@PUT、@DELETE、@HEAD、與 @OPTIONS
         沒有常用屬性,用來修飾底下的 Method
         JAX-RS 實作預設會處理 @HEAD 與 @OPTIONS
 1    @Stateless
 2    @Path("series")
 3    public class SeriesFacadeREST extends AbstractFacade<Series>
 4    {
 5        @DELETE
 6        @Path("{id}")
 7        public void remove(@PathParam("id")
 8        Integer id)
 9        {
 10           super.remove(super.find(id));
 11       }
 12   }
. 可以支援的 Resource 格式
           @Produces 表示可以產生的輸出格式
           @Consumes 表示可以接受的輸入格式

           沒有常用屬性,內容就是 MIME 字串或陣列
           Request Header 宣告 Client 端想要的型式
           Accept: text/plain;q=0.9, text/html


 1   @Stateless
 2   @Path("series")
 3   public class SeriesFacadeREST extends AbstractFacade<Series>
 4   {
 5       @POST
 6       @Consumes({"application/xml", "application/json"})
 7       public void create(Series entity)
 8       {
 9           super.create(entity);
10       }
11   }
. JAXB/Bean Validation 也支援 JSON
 1    @Entity
 2    @Table(name="Series")
 3    @XmlRootElement
 4    @NamedQueries({
 5        @NamedQuery(name="Series.findAll", query="SELECT s FROM Series s"),
 6        @NamedQuery(name="Series.findBySeriesId",
 7            query="SELECT s FROM Series s WHERE s.seriesId = :seriesId")})
 8    public class Series implements Serializable
 9    {
 10       @Id
 11       @GeneratedValue(strategy=GenerationType.IDENTITY)
 12       @Basic(optional=false)
 13       @NotNull
 14       @Column(name="seriesId")
 15       private Integer seriesId;
 16
 17       @Basic(optional=false)
 18       @NotNull
 19       @Size(min=1, max=50)
 20       @Column(name="seriesName")
 21       private String seriesName;
 22   }
. JPA 的 Entity 是 Resource 的最佳來源
 1    @Entity
 2    @Table(name="Series")
 3    @XmlRootElement
 4    public class Series implements Serializable
 5    {
 6        @OneToMany(cascade=CascadeType.ALL, mappedBy="series")
 7        private Collection<Movie> movieCollection;
 8
 9        @XmlTransient
 10       public Collection<Movie> getMovieCollection()
 11       {
 12           return movieCollection;
 13       }
 14
 15       public void setMovieCollection(Collection<Movie> movieCollection)
 16       {
 17           this.movieCollection = movieCollection;
 18       }
 19   }
. Jersey 還提供現成的 Front Controller
 1    <?xml version="1.0" encoding="UTF-8"?>
 2    <web-app version="3.0" ...>
 3        <servlet>
 4            <servlet-name>ServletAdaptor</servlet-name>
 5            <servlet-class>
 6                com.sun.jersey.spi.container.servlet.ServletContainer
 7            </servlet-class>
 8            <load-on-startup>1</load-on-startup>
 9        </servlet>
 10
 11       <servlet-mapping>
 12           <servlet-name>ServletAdaptor</servlet-name>
 13           <url-pattern>/resources/*</url-pattern>
 14       </servlet-mapping>
 15   </web-app>
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. 各種不同的工具支援
   CLI Tool:cURL、Wget
   GUI Tool:RESTClient、soapUI
   Browser Extension
      Firefox:Poster、RESTClient
      Chrome:Simple REST Client、REST Console
   Web Client:RESTGate
   IDE Plugin
      NetBeans:soapUI
      Eclipse:HTTP4e、JBossTools、soapUI
Command-Line Tool
.   cURL:http://curl.haxx.se/
Java Application
.   RESTClient:http://code.google.com/p/rest-client/
Java Application
.   soapUI:http://www.soapui.org/
Firefox Addon
.   RESTClient:https://addons.mozilla.org/en-US/firefox/addon/restclient/
Chrome Extension
.   Simple REST Client:https://chrome.google.com/webstore/
Chrome Extension
.   REST Console:http://www.codeinchaos.com/
Web Client
.   RESTGate:http://www.thomas-bayer.com/restgate/
Eclipse Plugin
.   HTTP4e:http://www.ywebb.com/
Eclipse Plugin
.   JBossTools:http://www.jboss.org/tools
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. 沒有定義 Client-Side API
     JAX-RS 1.1 是一個 Server-Side Only API,對
     Client 端並沒有著墨
     只要 Programming Language 支援 HTTP,
     就可以拿來寫 RESTful Client
     有一些 JAX-RS 實作有支援 Client API
     JAX-RS 2.0 也有在討論要不要制定 Client API
URL + HttpURLConnection
.   Java SE 本身的支援


    1    URL url =
    2        new URL("http://localhost/demo/resources/movies/" + movieId);
    3    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    4    conn.setRequestMethod("GET");
    5    conn.setRequestProperty("Accept", "application/xml");
    6
    7    JAXBContext ctx = JAXBContext.newInstance(Movie.class);
    8    Unmarshaller unmarshaller = ctx.createUnmarshaller();
    9    StreamSource source = new StreamSource(conn.getInputStream());
    10   JAXBElement<Movie> element =
    11       unmarshaller.unmarshal(source, Movie.class);
    12   Movie movie = element.getValue();
    13
    14   conn.disconnect();
Apache HttpClient 功能比較強大
.   http://hc.apache.org/


    1    DefaultHttpClient client = new DefaultHttpClient();
    2    HttpGet get =
    3        new HttpGet("http://localhost/demo/resources/movies/" + movieId);
    4    get.addHeader("Accept", "application/xml");
    5    HttpResponse response = client.execute(get);
    6
    7    if (response.getStatusLine().getStatusCode() == 200)
    8    {
    9        JAXBContext ctx = JAXBContext.newInstance(Movie.class);
    10       Unmarshaller unmarshaller = ctx.createUnmarshaller();
    11       StreamSource source =
    12           new StreamSource(response.getEntity().getContent());
    13       JAXBElement<Movie> element =
    14           unmarshaller.unmarshal(source, Movie.class);
    15       Movie movie = element.getValue();
    16   }
    17
    18   client.getConnectionManager().shutdown();
目前可能的解決方案之一
.   Jersey Client API

             Pluggable Architecture,目前支援
                    Java SE java.net 套件的 Http(s)URLConnection
                    Apache 的 HttpClient
                    (支援 Preemptive Authentication 與 Multipart)
             目的是取得現成的 HTTP 實作的優點,但是
             又做到方便使用
             WebResource 表示一個封裝了 URI 的 Resource

             支援 Java 型別
             byte[]、String、InputStream、File、DataSource、JAXB Bean

             支援 JSON,也支援 Multipart
. Jersey 的 Client 叫 NewJerseyClient
 1    public class NewJerseyClient {
 2        private WebResource wr;
 3        private Client client;
 4        private String BASE_URI = "http://localhost/demo/resources";
 5
 6        public NewJerseyClient(String movieId)
 7        {
 8            ClientConfig config = new DefaultClientConfig();
 9            client = Client.create(config);
 10           String resourcePath =
 11               MessageFormat.format("movies/{0}", new Object[]{movieId});
 12           wr = client.resource(BASE_URI).path(resourcePath);
 13       }
 14
 15       public <T> T get_XML(Class<T> responseType) throws Exception {
 16           return wr.accept(MediaType.APPLICATION_XML).get(responseType);
 17       }
 18
 19       public void delete() throws Exception {
 20           wr.delete();
 21       }
 22   }
. NewJerseyClient 的 Client
 1    NewJerseyClient client = new NewJerseyClient(String.valueOf(movieId));
 2    String movieString = client.get_XML(String.class);
 3    client.close();
 4
 5    JAXBContext ctx = JAXBContext.newInstance(Movie.class);
 6    Unmarshaller unmarshaller = ctx.createUnmarshaller();
 7    StringReader reader = new StringReader(movieString);
 8    StreamSource source = new StreamSource(reader);
 9    JAXBElement<Movie> element =
 10       unmarshaller.unmarshal(source, Movie.class);
 11   Movie movie = element.getValue();
另一個建議解決方案
.   Spring Framework REST Support


      Server-Side:
          以 Spring MVC 為基礎
          利用 Annotation 表示 RESTful Resource
            @Controller/@RequestMapping/@PathVariable

            @RequestParam/@RequestHeader/@RequestBody/@ResponseBody...

            ContentNegotiatingViewResolver   決定 ViewResolver/View
      Client-Side:
           以 RestTemplate 為 Client 端核心
           搭配 Jackson JSON Processor (必須是舊版)
           搭配各種 HttpMessageConverter 來處理資料
. 超強的 RestTemplate




 1   RestTemplate template = new RestTemplate();
 2   Movie movie = template.getForObject(
 3       "http://localhost/demos/resources/movies/{movieId}",
 4       Movie.class, movieId);
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
資料可以 RESTful
.   NetBeans Support for RESTful Services


       Server-Side:
            Entity Classes from Database
            Entity Classes from Patterns
            RESTful Web Services from Entity Classes
            RESTful Web Services from Patterns
            RESTful Web Services from Database
            JSF Pages from Entity Classes
            Test RESTful Web Services
       Client-Side:
            RESTful Java Client
            RESTful JavaScript Client
NetBeans 提供了一堆 REST Wizard
.   Entity Classes from Database
web.xml 也會自動加入宣告
.   ServletAdapter
還可以自動產生 JavaScript 測試端
.   Test RESTful Web Services
當然一定可以產生 Java Client 端
.   RESTful Java Client
. Server 端講 GAE 嘛會通
  不過要做底下的修改:
    拿掉 @EJB/@Stateless
    不支援 EJB
    拿掉 @PersistenceContext
    不支援 DI/CDI
    拿掉 @Table/@Column/@JoinColumn
    不支援 RDBMS
    拿掉 @NotNull/@Size
    不支援 Bean Validation
    改寫 CriteriaQuery
    不支援 JPA 2.0
API 當然也可以 RESTful
.   Twitter REST API
Plurk 也是 RESTful
.   Plurk API 2.0
Facebook 當然也要 RESTful
.   Facebook Graph API
文字資料可以傳
.   https://graph.facebook.com/monster.supreme
二進位資料當然也可以傳
.   https://graph.facebook.com/monster.supreme/picture?type=large
應用程式的管控介面也可以 RESTful
.   GlassFish Server REST Interfaces


             GlassFish Server 3.1 Administration Guide
             http://download.oracle.com/docs/cd/E18930_01/html

             /821-2416/gjipx.html

             透過 RESTful Interface 進行管理與監控
             相關功能定義在 WADL 檔案之中
                   http://localhost:4848/management/application.wadl
                   http://localhost:4848/monitoring/application.wadl

             Client 端也有人提供 Java Wrapper
             http://engineeringnotebook.org

             /building-a-glassfish-monitoring-client-using-rest
GlassFish 管控介面的 WADL
.   http://localhost:4848/monitoring/application.wadl
透過 Browser 監看 GlassFish
.   http://localhost:4848/monitoring/domain
還可以有不同格式的顯示方式
.   Accept: application/json
不同系統之間當然可以透過 REST 整合
.   Windows Azure AppFabric Service Bus REST API for Java, PHP


             Since the AppFabric Service Bus REST API
             can be used from almost all programming
             languages and operating systems, it makes
             it very easy for applications written on any
             platform to interoperate with each another
             through Windows Azure.
             You can download the new PHP and Java
             samples, as well as all others for all other
             supported environments, from CodePlex.
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. Security 怎麼辦
     Intranet (比較可以確定 User)
        可以使用 Java EE 的方式處理
        透過 @Context 可以取得 SecurityContext
        也可以結合 Spring Security 一起使用
     Internet (比較無法確定 User)
        可以使用 OAuth 的方式處理
. 透過 @Context 拿到 SecurityContext
 1    @Path("/system")
 2    @Produces("application/json")
 3    public class SystemInformationService
 4    {
 5        @GET
 6        @Path("information")
 7        public Response getSystemInfo(@Context SecurityContext sc)
 8        {
 9            System.out.println(sc.getUserPrincipal());
 10           return Response.ok("foo", MediaType.APPLICATION_JSON).build();
 11       }
 12   }
. Spring Security web.xml 宣告重點
 1    <?xml version="1.0" encoding="UTF-8"?>
 2    <web-app version="3.0" ...>
 3        <servlet>
 4            <servlet-name>ServletAdaptor</servlet-name>
 5            <servlet-class>
 6                com.sun.jersey.spi.spring.container.servlet.SpringServlet
 7            </servlet-class>
 8            <init-param>
 9                <param-name>
 10                   com.sun.jersey.config.property.packages
 11               </param-name>
 12               <param-value>com.monster.service</param-value>
 13           </init-param>
 14       </servlet>
 15
 16       <servlet-mapping>
 17           <servlet-name>ServletAdaptor</servlet-name>
 18           <url-pattern>/resources/*</url-pattern>
 19       </servlet-mapping>
 20   </web-app>
有些 Facebook 的 API 是被管控的
.   Likes - https://graph.facebook.com/me/likes
Facebook 可以在這邊註冊
.   https://developers.facebook.com/apps/
取得 Facebook 的 Access Token
.   Access Token
呼叫 Facebook 功能就 OK 了
.   Likes - https://graph.facebook.com/me/likes?access_token=2239|2.AQB|Ha4
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. JAX-RS 2.0/JSR-339
      三個主角先後離開,所以停頓了一段時間
         Marc Hadley
         Paul Sandoz
         Roberto Chinnici
      新的 Project Lead
         Santiago Pericas-Geertsen
         Marek Potociar
      目前主要定調的議題
         在 Java EE 7 提供更好的 REST 支援
         Client API
         HATEOAS 支援
         Asynchronous Invocation
JAX-RS 2.0/JSR-339
.   Client API


             希望執行起來能夠又快又順
             希望有一個 Portable 機制啟用底層特異功能
             內建提供 Security Mechanism
             支援 Synchronous 與 Asynchronous 應用
             Non-Blocking Client 以 Asynchronous Http
             Client library for Java 為基礎
             不會支援 Comet、WebSocket 與 HTTP
             Streaming (預計是再下一版的功能)
JAX-RS 2.0/JSR-339
.   Server API


             目前只支援 Synchronous 應用
             預計提供 Asynchronous 應用
             可能會以 Servlet 3.0 的 Asynchronous 功能
             實作,也可能採用其他作法
JAX-RS 2.0/JSR-339
.   Hypermedia as the Engine of Application State


             希望提供 HATEOAS 支援
             http://en.wikipedia.org/wiki/HATEOAS
             不只要提供方便的 URI 產生機制
             還要能夠提供 Link Header 或 Link within
             Entity,方便處理 Representation 裡面的
             Resource
             也要讓 Client 端能夠輕鬆取得這些 Link,進
             行後續的處理
             光靠 Java SE 的 URI 是不夠的
             JAX-RS 的 UriBuilder/UriTemplate/UriInfo 也不夠方便
JAX-RS 2.0/JSR-339
.   Model-View-Controller Pattern


             JPA 的 Entity 相當於 Model
             JAX-RS 的 Resource Class 相當於 Controller
             JavaServer Pages、FreeMarker、String
             Template 等技術會被視為 View
JAX-RS 2.0/JSR-339
.   Bean Validation Integration


             提供 Parameter Validation 機制
             必要時提供有意義的訊息
             應該會以 Bean Validation API 為基礎
JAX-RS 2.0/JSR-339
.   CDI Integration


             JAX-RS 1.1 定義時間早於 CDI,所以並沒有
             提供很好的整合
             JAX-RS 2.0 希望能夠與 CDI 更進一步整合
             可能因此讓一些 Annotation (@Context) 變成
             Deprecated
JAX-RS 2.0/JSR-339
.   Content Negotiation


               JAX-RS 1.1 以 Client 端送來的 Accept Header
               裡面的 q 做決定
               JAX-RS 2.0 會增加一個由 Server 端決定的 qs
    1    <application xmlns="http://research.sun.com/wadl/2006/10">
    2        <resources base="http://localhost:4848/monitoring/">
    3            <resource path="domain{path:.*}">
    4                <param xmlns:xs="http://www.w3.org/2001/XMLSchema"
    5                     name="path" style="template" type="xs:string"/>
    6                <method id="getChildNodes" name="GET">
    7                     <response>
    8                         <representation mediaType="text/html;qs=2"/>
    9                         <representation mediaType="application/json"/>
    10                        <representation mediaType="application/xml"/>
    11                    </response>
    12               </method>
    13           </resource>
    14       </resources>
    15   </application>
JAX-RS 2.0/JSR-339
.   Target Platform


             預計內建於 Java EE 7,使用相同的套件名稱
             javax.ws.rs

             但是要求 Java SE 6 與 Java EE 6 就可以實作
             JAX-RS 2.0
.
. . Introduction
  1


  ..
. 2 Implementation
   .
. . Server-Side API
  3


  ..
. 4 Development Tool
  ..
. 5 Client-Side API
   .
. . Application
  6


  ..
. 7 Concern
   .
. . Future
  8


  ..
. 9 Summary
. Summary
    RESTful 是趨勢
    GlassFish 是很好的平台
    NetBeans 是很棒的開發工具
    Jersey 是很完整的實作
    希望可以平順地轉換到 Java EE 7 的 JSR 339
. References
     Pavel Bucek's weblog
     http://blogs.oracle.com/PavelBucek/

     Japod's blog
     http://blogs.oracle.com/japod/

     Jean-Francois Arcand's blog
     http://jfarcand.wordpress.com/

     The Aquarium
     http://blogs.oracle.com/theaquarium/

     Jersey 1.8 User Guide
     http://jersey.java.net/nonav/documentation/1.8/user-guide.html
資策會教研所 資訊技術訓練中心
.   http://www.iiiedu.org.tw/taipei

Mais conteúdo relacionado

Mais procurados

Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletJustin Lin
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Justin Lin
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Justin Lin
 
FHIR REST API 導論與使用
FHIR REST API 導論與使用FHIR REST API 導論與使用
FHIR REST API 導論與使用Lorex L. Yang
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Railsshaokun
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLJustin Lin
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Justin Lin
 
Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
Inside the browser
Inside the browserInside the browser
Inside the browserotakustay
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享國昭 張
 
中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本Lorex L. Yang
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile ServicesKuo-Chun Su
 

Mais procurados (20)

Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
RESTful API Design
RESTful API DesignRESTful API Design
RESTful API Design
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
 
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
Spring 2.0 技術手冊第八章 - View 層方案、Web 框架整合
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
 
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
Servlet & JSP 教學手冊第二版 - 第 8 章:自訂標籤
 
FHIR REST API 導論與使用
FHIR REST API 導論與使用FHIR REST API 導論與使用
FHIR REST API 導論與使用
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Rails
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援
 
Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝Spring 2.0 技術手冊第九章 - API 封裝
Spring 2.0 技術手冊第九章 - API 封裝
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Inside the browser
Inside the browserInside the browser
Inside the browser
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享
 
中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 

Semelhante a 用JAX-RS和Jersey完成RESTful Web Services

J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍Jim Jiang
 
2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3LiviaLiaoFontech
 
從SOA到REST -- Web Service、WCF、WebAPI的應用情境
從SOA到REST -- Web Service、WCF、WebAPI的應用情境從SOA到REST -- Web Service、WCF、WebAPI的應用情境
從SOA到REST -- Web Service、WCF、WebAPI的應用情境MIS2000 Lab.
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTarget Source
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsChieh Lin
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 zhen chen
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mu-Fan Teng
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
Flex 4.5 action data communication
Flex 4.5 action data communicationFlex 4.5 action data communication
Flex 4.5 action data communicationjexchan
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会Zhi Zhong
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 

Semelhante a 用JAX-RS和Jersey完成RESTful Web Services (20)

J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
Jsp
JspJsp
Jsp
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
RESTful
RESTfulRESTful
RESTful
 
GlassFish特性介绍
GlassFish特性介绍GlassFish特性介绍
GlassFish特性介绍
 
2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3
 
從SOA到REST -- Web Service、WCF、WebAPI的應用情境
從SOA到REST -- Web Service、WCF、WebAPI的應用情境從SOA到REST -- Web Service、WCF、WebAPI的應用情境
從SOA到REST -- Web Service、WCF、WebAPI的應用情境
 
Terracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering ArchitectureTerracotta And Continuent Based Clustering Architecture
Terracotta And Continuent Based Clustering Architecture
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development Fundamentals
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Flex 4.5 action data communication
Flex 4.5 action data communicationFlex 4.5 action data communication
Flex 4.5 action data communication
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 

用JAX-RS和Jersey完成RESTful Web Services

  • 1. . RESTful Services Using JAX-RS and Jersey 蘇國鈞/Monster Su .
  • 2. . RESTful Services Using . JAX-RS and Jersey 蘇國鈞 monster.supreme@gmail.com http://monstersupreme.blogspot.com July 29, 2011
  • 3. . Profile 國立台灣大學電機工程學研究所畢業 現任 資訊工業策進會 數位教育研究所 資訊技術訓練中心 教學組長 在 Java 領域有十多年的講師教學經驗 熟悉 XML/Web Services、Design Patterns、EJB/JPA 等 Java EE 規格, Struts/Spring Framework/Hibernate 等 Open Source Framework,與 JBoss AS、GlassFish 等 Application Server 目前負責雲端運算相關技術的推廣,主要包括 Apache Hadoop、 Google App Engine、Microsoft Azure 等 Cloud Platform,與 iOS、 Android、Windows Phone 7 等 Smart Handheld 端的整合運用
  • 4. . Outline . .. 1 Introduction .. .2 Implementation . .. 3 Server-Side API .. .4 Development Tool . .. 5 Client-Side API .. .6 Application . .. 7 Concern .. .8 Future . .. 9 Summary
  • 5. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 6. . SOAP 的開發方式 Amazon Lite: 賣 Book BookService - save()/delete()/get()/update() http://amazonlite.com/bookService?wsdl 賣 DVD DVDService - persist()/remove()/load()/merge() http://amazonlite.com/dvdService?wsdl 開 Invoice InvoiceService - insert()/cancel()/locate()/replace() http://amazonlite.com/invoiceService?wsdl
  • 7. Service Calling Made Easy - SOAP . http://geekandpoke.typepad.com
  • 8. . 為什麼不繼續 SOAP 下去 ... 1 SOAP 以前不太好寫 (現在倒是不會) ... 2 SOAP Overhead 很大 (XML 一直都很煩) ... 3 SOAP 底層需求很高 (現在還是一樣) ... 4 SOAP 每個介面都不同 (會的單字都用完了) ... 5 SOAP 不容易跨平台 (除非不用 WS-*) ... 6 還沒想到 ... 7 … ... 8 … ... 9 … ... 10 懶得想了
  • 9. . Take a REST Amazon Lite: 賣 Book HTTP Method - POST/DELETE/GET/PUT http://amazonlite.com/books 賣 DVD HTTP Method - POST/DELETE/GET/PUT http://amazonlite.com/dvds 開 Invoice HTTP Method - POST/DELETE/GET/PUT http://amazonlite.com/invoices
  • 10. Service Calling Made Easy - REST . http://geekandpoke.typepad.com
  • 11. . 感覺上… Information 好像是 Web 上的一個一個 Resource 每個 Resource 好像可以用 URI 來表示 CRUD 相關操作好像可以透過 Uniform 的方 式來進行 HTTP 剛好定義了相對應的 Method,很適合 作為底層 Protocol 搭配 HTTP 天生 Stateless 的特性,剛好很有 Scalability
  • 12. . RESTful Services 全名是 REpresentational State Transfer 最早是在 2000 年由 Roy Fielding 提出 以 Resource 為核心,不是以 Action 為核心 透過 URL 表示 Web 上的各種 Resource Resource 可以透過任何方式表示,比方說 XML、JSON、HTML、PDF、Raw Data 不利用 WSDL 定義 Interface 直接透過 HTTP 定義的 Method 存取資料 GET、POST、PUT、與 DELETE 以最適當的方式,在 Client 端與 Server 端 之間,進行 Resource 狀態的轉移
  • 13. . 用 URL/URI 來表示 Resource REST 否: URL 不一定代表 Resource http://localhost:8080/helloWorld URL 不只要可以找到 Resource http://localhost:8080/findBookByIsbn?isbn=0596158041 RESTful: URL 真的可以代表唯一的 Resource https://graph.facebook.com/monster.supreme URL 還是可以有參數 https://graph.facebook.com/monster.supreme/picture?type=large URL 還可以表示想要的 Resource 格式 http://api.twitter.com/1/friends/ids.xml?screen_name=MonsterSupreme
  • 15. . HTTP Method vs. CRUD 取得 Resource:GET 新增 Resource:POST 到既有的 URI 實作上通常會傳回 Resource 的 URI 修改 Resource:PUT 到既有的 URI 刪除 Resource:DELETE 取得 Resource 相關資訊:HEAD 實作上一般視同沒有 Body 的 GET 確認 Resource 支援功能:OPTIONS 實作上一般會列出所有支援的 Method
  • 16. . 類似 WSDL 的介面描述方式 Web Application Description Language: 簡稱 WADL W3C Member Submission Sun 的 Marc Hadley (JAX-RS Lead) 代表提出 http://www.w3.org/Submission/wadl/ 為 HTTP-Based Web Application 提供一個 Machine Process-able Description SOAP:WSDL=REST:WADL
  • 17. . WADL 的長相 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 <application xmlns="http://research.sun.com/wadl/2006/10"> 3 <doc xmlns:jersey="http://jersey.dev.java.net/" 4 jersey:generatedBy="Jersey: 1.5 01/14/2011 12:36 PM"/> 5 <resources base="http://localhost:4848/monitoring/"> 6 <resource path="reload"> 7 <method id="reload" name="POST"/> 8 </resource> 9 <resource path="domain{path:.*}"> 10 <param xmlns:xs="http://www.w3.org/2001/XMLSchema" 11 name="path" style="template" type="xs:string"/> 12 <method id="getChildNodes" name="GET"> 13 <response> 14 <representation mediaType="text/html;qs=2}"/> 15 <representation mediaType="application/json"/> 16 <representation mediaType="application/xml"/> 17 </response> 18 </method> 19 </resource> 20 </resources> 21 </application>
  • 18. REST vs. SOAP RESTful Web Services vs.“Big”Web Services . http://www2008.org/papers/pdf/p805-pautassoA.pdf REST vs. SOAP 一直是個爭議,不過: RPC 通常強調的是呼叫遠端功能 REST 強調的是跟遠端交換資料 REST 比 SOAP 容易瞭解,也容易實作 REST 不是標準,而是 Architecture Style 在一個不太方便撰寫程式的環境下,REST 是一種非常好的 Service 提供方式 非常適合用在 Web 與 Mobile 環境 (雲端) 整合 Web Resource 時考慮用 REST 企業內部比較重視 QoS 時考慮用 SOAP
  • 19. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 20. Java 對 RESTful Services 的支援方式 . J2SE/J2EE 1.4 的 REST 支援 Server 端實作使用 Java Servlet API 或 JSP Client 端實作使用 java.net 套件的 URL 與 HttpURLConnection 類別 透過 Java API for XML Processing (JAXP) 協 助處理 XML 資料 透過 Java I/O 的 InputStream 與 OutputStream 類別協 助處理 HTTP Request/Response 比較直接,但是支援也比較弱
  • 21. Java 對 RESTful Services 的支援方式 . Java SE/EE 5 的 REST 支援 Server 與 Client 端實作都使用 JAX-WS 2.0 的 Service 類別,以及 Dispatch 與 Provider 介面 透過 Java API for XML Processing (JAXP) 協 助處理 XML 資料 透過 Java Architecture for XML Binding 2.0 (JAXB 2.0) 協助處理 XML 資料與 Java 物件之 間的轉換 因為是針對 SOAP 設計,所以套用到 REST 的時候有點彆扭
  • 22. Java 對 RESTful Services 的支援方式 . Java EE 6 的 REST 支援 JSR 311 網址:https://jsr311.dev.java.net/ 全名是 Java API for RESTful Web Services 簡稱 JAX-RS 2007 年 2 月宣佈,2008 年 10 月正式定案 是 Java EE 6 的一部分 套件是 javax.ws.rs.* 以 Annotation 為基礎,至少要 Java SE 5 Jersey 是 JAX-RS 的參考實作
  • 23. Java 對 RESTful Services 的支援比較 . Java EE 5 vs. Java EE 6 Java EE 5 (JSR 244): JAX-WS 2.0 (JSR 224) JAXB 2.0 (JSR 222) Java EE 6 (JSR 316): JAX-WS 2.2 (JSR 224 沒變,實作更新) JAXB 2.2 (JSR 222 沒變,實作更新) JAX-RS 1.1 (JSR 311)
  • 24. . JAX-RS 相關實作 目前檯面上的實作: Noelios Technologies 的 Restlet JBoss 的 RESTEasy Apache 的 CXF Sun/Oracle 的 Jersey Apache 的 Wink eXo 的 everREST Trialox ag 的 Triaxrs
  • 25. 比 JAX-RS 規格還早出現的 Restlet . http://www.restlet.org/
  • 26. JBoss 當靠山的 RESTEasy . http://www.jboss.org/resteasy
  • 27. 支援 SOAP 與 REST 的 CXF . http://cxf.apache.org/
  • 28. JAX-RS 參考實作 Jersey . http://jersey.java.net/
  • 29. 還在孵蛋中的 Wink . http://incubator.apache.org/wink/
  • 30. eXo Platform 的 everREST . http://trialox.org/archives/323
  • 31. 支援 OSGi Container 的 Triaxrs . http://code.google.com/p/everrest/
  • 32. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 33. . 簡化開發過程的 Annotation URI Path Parameter @Path @PathParam HTTP Method @QueryParam @POST @HeaderParam @DELETE @FormParam @GET @CookieParam @PUT @MatrixParam @HEAD @DefaultValue @OPTIONS Media Handling Injection @Consumes @Context @Produces
  • 34. . 把 Resource 表達成 Resource Class Lifecycle 預設是 Per-Request,之後就可以 GC Jersey 支援 Per-Session 與 @Singleton 1 import javax.ws.rs.GET; 2 import javax.ws.rs.Produces; 3 import javax.ws.rs.Path; 4 5 @Path("/helloworld") 6 public class HelloWorldResource 7 { 8 @GET 9 @Produces("text/plain") 10 public String getClichedMessage() 11 { 12 return "Hello World"; 13 } 14 }
  • 35. Resource Class 也有生命週期 . http://www.devx.com/
  • 36. . 用 URI Path Template 標示對應的函式 用 @Path 表示存取路徑 沒有常用屬性,內容就是一個相對網址 是不是 / 開頭或結尾沒有差別 @Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}") URI Path Template 可以在 URI 嵌入變數 @Path("{bookId}/") public Book getBook(@PathParam("bookId") int bookId) {...} URI Path Template 也可以提供參數預設值 @Path("/books/") public List<Book> getBooks( @DefaultValue("5") @QueryParam("max") int max) {...}
  • 37. . 用 Designator 標示 HTTP Method Request Method Designator: 包括 @GET、@POST、@PUT、@DELETE、@HEAD、與 @OPTIONS 沒有常用屬性,用來修飾底下的 Method JAX-RS 實作預設會處理 @HEAD 與 @OPTIONS 1 @Stateless 2 @Path("series") 3 public class SeriesFacadeREST extends AbstractFacade<Series> 4 { 5 @DELETE 6 @Path("{id}") 7 public void remove(@PathParam("id") 8 Integer id) 9 { 10 super.remove(super.find(id)); 11 } 12 }
  • 38. . 可以支援的 Resource 格式 @Produces 表示可以產生的輸出格式 @Consumes 表示可以接受的輸入格式 沒有常用屬性,內容就是 MIME 字串或陣列 Request Header 宣告 Client 端想要的型式 Accept: text/plain;q=0.9, text/html 1 @Stateless 2 @Path("series") 3 public class SeriesFacadeREST extends AbstractFacade<Series> 4 { 5 @POST 6 @Consumes({"application/xml", "application/json"}) 7 public void create(Series entity) 8 { 9 super.create(entity); 10 } 11 }
  • 39. . JAXB/Bean Validation 也支援 JSON 1 @Entity 2 @Table(name="Series") 3 @XmlRootElement 4 @NamedQueries({ 5 @NamedQuery(name="Series.findAll", query="SELECT s FROM Series s"), 6 @NamedQuery(name="Series.findBySeriesId", 7 query="SELECT s FROM Series s WHERE s.seriesId = :seriesId")}) 8 public class Series implements Serializable 9 { 10 @Id 11 @GeneratedValue(strategy=GenerationType.IDENTITY) 12 @Basic(optional=false) 13 @NotNull 14 @Column(name="seriesId") 15 private Integer seriesId; 16 17 @Basic(optional=false) 18 @NotNull 19 @Size(min=1, max=50) 20 @Column(name="seriesName") 21 private String seriesName; 22 }
  • 40. . JPA 的 Entity 是 Resource 的最佳來源 1 @Entity 2 @Table(name="Series") 3 @XmlRootElement 4 public class Series implements Serializable 5 { 6 @OneToMany(cascade=CascadeType.ALL, mappedBy="series") 7 private Collection<Movie> movieCollection; 8 9 @XmlTransient 10 public Collection<Movie> getMovieCollection() 11 { 12 return movieCollection; 13 } 14 15 public void setMovieCollection(Collection<Movie> movieCollection) 16 { 17 this.movieCollection = movieCollection; 18 } 19 }
  • 41. . Jersey 還提供現成的 Front Controller 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" ...> 3 <servlet> 4 <servlet-name>ServletAdaptor</servlet-name> 5 <servlet-class> 6 com.sun.jersey.spi.container.servlet.ServletContainer 7 </servlet-class> 8 <load-on-startup>1</load-on-startup> 9 </servlet> 10 11 <servlet-mapping> 12 <servlet-name>ServletAdaptor</servlet-name> 13 <url-pattern>/resources/*</url-pattern> 14 </servlet-mapping> 15 </web-app>
  • 42. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 43. . 各種不同的工具支援 CLI Tool:cURL、Wget GUI Tool:RESTClient、soapUI Browser Extension Firefox:Poster、RESTClient Chrome:Simple REST Client、REST Console Web Client:RESTGate IDE Plugin NetBeans:soapUI Eclipse:HTTP4e、JBossTools、soapUI
  • 44. Command-Line Tool . cURL:http://curl.haxx.se/
  • 45. Java Application . RESTClient:http://code.google.com/p/rest-client/
  • 46. Java Application . soapUI:http://www.soapui.org/
  • 47. Firefox Addon . RESTClient:https://addons.mozilla.org/en-US/firefox/addon/restclient/
  • 48. Chrome Extension . Simple REST Client:https://chrome.google.com/webstore/
  • 49. Chrome Extension . REST Console:http://www.codeinchaos.com/
  • 50. Web Client . RESTGate:http://www.thomas-bayer.com/restgate/
  • 51. Eclipse Plugin . HTTP4e:http://www.ywebb.com/
  • 52. Eclipse Plugin . JBossTools:http://www.jboss.org/tools
  • 53. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 54. . 沒有定義 Client-Side API JAX-RS 1.1 是一個 Server-Side Only API,對 Client 端並沒有著墨 只要 Programming Language 支援 HTTP, 就可以拿來寫 RESTful Client 有一些 JAX-RS 實作有支援 Client API JAX-RS 2.0 也有在討論要不要制定 Client API
  • 55. URL + HttpURLConnection . Java SE 本身的支援 1 URL url = 2 new URL("http://localhost/demo/resources/movies/" + movieId); 3 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 4 conn.setRequestMethod("GET"); 5 conn.setRequestProperty("Accept", "application/xml"); 6 7 JAXBContext ctx = JAXBContext.newInstance(Movie.class); 8 Unmarshaller unmarshaller = ctx.createUnmarshaller(); 9 StreamSource source = new StreamSource(conn.getInputStream()); 10 JAXBElement<Movie> element = 11 unmarshaller.unmarshal(source, Movie.class); 12 Movie movie = element.getValue(); 13 14 conn.disconnect();
  • 56. Apache HttpClient 功能比較強大 . http://hc.apache.org/ 1 DefaultHttpClient client = new DefaultHttpClient(); 2 HttpGet get = 3 new HttpGet("http://localhost/demo/resources/movies/" + movieId); 4 get.addHeader("Accept", "application/xml"); 5 HttpResponse response = client.execute(get); 6 7 if (response.getStatusLine().getStatusCode() == 200) 8 { 9 JAXBContext ctx = JAXBContext.newInstance(Movie.class); 10 Unmarshaller unmarshaller = ctx.createUnmarshaller(); 11 StreamSource source = 12 new StreamSource(response.getEntity().getContent()); 13 JAXBElement<Movie> element = 14 unmarshaller.unmarshal(source, Movie.class); 15 Movie movie = element.getValue(); 16 } 17 18 client.getConnectionManager().shutdown();
  • 57. 目前可能的解決方案之一 . Jersey Client API Pluggable Architecture,目前支援 Java SE java.net 套件的 Http(s)URLConnection Apache 的 HttpClient (支援 Preemptive Authentication 與 Multipart) 目的是取得現成的 HTTP 實作的優點,但是 又做到方便使用 WebResource 表示一個封裝了 URI 的 Resource 支援 Java 型別 byte[]、String、InputStream、File、DataSource、JAXB Bean 支援 JSON,也支援 Multipart
  • 58. . Jersey 的 Client 叫 NewJerseyClient 1 public class NewJerseyClient { 2 private WebResource wr; 3 private Client client; 4 private String BASE_URI = "http://localhost/demo/resources"; 5 6 public NewJerseyClient(String movieId) 7 { 8 ClientConfig config = new DefaultClientConfig(); 9 client = Client.create(config); 10 String resourcePath = 11 MessageFormat.format("movies/{0}", new Object[]{movieId}); 12 wr = client.resource(BASE_URI).path(resourcePath); 13 } 14 15 public <T> T get_XML(Class<T> responseType) throws Exception { 16 return wr.accept(MediaType.APPLICATION_XML).get(responseType); 17 } 18 19 public void delete() throws Exception { 20 wr.delete(); 21 } 22 }
  • 59. . NewJerseyClient 的 Client 1 NewJerseyClient client = new NewJerseyClient(String.valueOf(movieId)); 2 String movieString = client.get_XML(String.class); 3 client.close(); 4 5 JAXBContext ctx = JAXBContext.newInstance(Movie.class); 6 Unmarshaller unmarshaller = ctx.createUnmarshaller(); 7 StringReader reader = new StringReader(movieString); 8 StreamSource source = new StreamSource(reader); 9 JAXBElement<Movie> element = 10 unmarshaller.unmarshal(source, Movie.class); 11 Movie movie = element.getValue();
  • 60. 另一個建議解決方案 . Spring Framework REST Support Server-Side: 以 Spring MVC 為基礎 利用 Annotation 表示 RESTful Resource @Controller/@RequestMapping/@PathVariable @RequestParam/@RequestHeader/@RequestBody/@ResponseBody... ContentNegotiatingViewResolver 決定 ViewResolver/View Client-Side: 以 RestTemplate 為 Client 端核心 搭配 Jackson JSON Processor (必須是舊版) 搭配各種 HttpMessageConverter 來處理資料
  • 61. . 超強的 RestTemplate 1 RestTemplate template = new RestTemplate(); 2 Movie movie = template.getForObject( 3 "http://localhost/demos/resources/movies/{movieId}", 4 Movie.class, movieId);
  • 62. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 63. 資料可以 RESTful . NetBeans Support for RESTful Services Server-Side: Entity Classes from Database Entity Classes from Patterns RESTful Web Services from Entity Classes RESTful Web Services from Patterns RESTful Web Services from Database JSF Pages from Entity Classes Test RESTful Web Services Client-Side: RESTful Java Client RESTful JavaScript Client
  • 64. NetBeans 提供了一堆 REST Wizard . Entity Classes from Database
  • 66. 還可以自動產生 JavaScript 測試端 . Test RESTful Web Services
  • 67. 當然一定可以產生 Java Client 端 . RESTful Java Client
  • 68. . Server 端講 GAE 嘛會通 不過要做底下的修改: 拿掉 @EJB/@Stateless 不支援 EJB 拿掉 @PersistenceContext 不支援 DI/CDI 拿掉 @Table/@Column/@JoinColumn 不支援 RDBMS 拿掉 @NotNull/@Size 不支援 Bean Validation 改寫 CriteriaQuery 不支援 JPA 2.0
  • 69. API 當然也可以 RESTful . Twitter REST API
  • 70. Plurk 也是 RESTful . Plurk API 2.0
  • 71. Facebook 當然也要 RESTful . Facebook Graph API
  • 72. 文字資料可以傳 . https://graph.facebook.com/monster.supreme
  • 73. 二進位資料當然也可以傳 . https://graph.facebook.com/monster.supreme/picture?type=large
  • 74. 應用程式的管控介面也可以 RESTful . GlassFish Server REST Interfaces GlassFish Server 3.1 Administration Guide http://download.oracle.com/docs/cd/E18930_01/html /821-2416/gjipx.html 透過 RESTful Interface 進行管理與監控 相關功能定義在 WADL 檔案之中 http://localhost:4848/management/application.wadl http://localhost:4848/monitoring/application.wadl Client 端也有人提供 Java Wrapper http://engineeringnotebook.org /building-a-glassfish-monitoring-client-using-rest
  • 75. GlassFish 管控介面的 WADL . http://localhost:4848/monitoring/application.wadl
  • 76. 透過 Browser 監看 GlassFish . http://localhost:4848/monitoring/domain
  • 77. 還可以有不同格式的顯示方式 . Accept: application/json
  • 78. 不同系統之間當然可以透過 REST 整合 . Windows Azure AppFabric Service Bus REST API for Java, PHP Since the AppFabric Service Bus REST API can be used from almost all programming languages and operating systems, it makes it very easy for applications written on any platform to interoperate with each another through Windows Azure. You can download the new PHP and Java samples, as well as all others for all other supported environments, from CodePlex.
  • 79. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 80. . Security 怎麼辦 Intranet (比較可以確定 User) 可以使用 Java EE 的方式處理 透過 @Context 可以取得 SecurityContext 也可以結合 Spring Security 一起使用 Internet (比較無法確定 User) 可以使用 OAuth 的方式處理
  • 81. . 透過 @Context 拿到 SecurityContext 1 @Path("/system") 2 @Produces("application/json") 3 public class SystemInformationService 4 { 5 @GET 6 @Path("information") 7 public Response getSystemInfo(@Context SecurityContext sc) 8 { 9 System.out.println(sc.getUserPrincipal()); 10 return Response.ok("foo", MediaType.APPLICATION_JSON).build(); 11 } 12 }
  • 82. . Spring Security web.xml 宣告重點 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" ...> 3 <servlet> 4 <servlet-name>ServletAdaptor</servlet-name> 5 <servlet-class> 6 com.sun.jersey.spi.spring.container.servlet.SpringServlet 7 </servlet-class> 8 <init-param> 9 <param-name> 10 com.sun.jersey.config.property.packages 11 </param-name> 12 <param-value>com.monster.service</param-value> 13 </init-param> 14 </servlet> 15 16 <servlet-mapping> 17 <servlet-name>ServletAdaptor</servlet-name> 18 <url-pattern>/resources/*</url-pattern> 19 </servlet-mapping> 20 </web-app>
  • 83. 有些 Facebook 的 API 是被管控的 . Likes - https://graph.facebook.com/me/likes
  • 84. Facebook 可以在這邊註冊 . https://developers.facebook.com/apps/
  • 85. 取得 Facebook 的 Access Token . Access Token
  • 86. 呼叫 Facebook 功能就 OK 了 . Likes - https://graph.facebook.com/me/likes?access_token=2239|2.AQB|Ha4
  • 87. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 88. . JAX-RS 2.0/JSR-339 三個主角先後離開,所以停頓了一段時間 Marc Hadley Paul Sandoz Roberto Chinnici 新的 Project Lead Santiago Pericas-Geertsen Marek Potociar 目前主要定調的議題 在 Java EE 7 提供更好的 REST 支援 Client API HATEOAS 支援 Asynchronous Invocation
  • 89. JAX-RS 2.0/JSR-339 . Client API 希望執行起來能夠又快又順 希望有一個 Portable 機制啟用底層特異功能 內建提供 Security Mechanism 支援 Synchronous 與 Asynchronous 應用 Non-Blocking Client 以 Asynchronous Http Client library for Java 為基礎 不會支援 Comet、WebSocket 與 HTTP Streaming (預計是再下一版的功能)
  • 90. JAX-RS 2.0/JSR-339 . Server API 目前只支援 Synchronous 應用 預計提供 Asynchronous 應用 可能會以 Servlet 3.0 的 Asynchronous 功能 實作,也可能採用其他作法
  • 91. JAX-RS 2.0/JSR-339 . Hypermedia as the Engine of Application State 希望提供 HATEOAS 支援 http://en.wikipedia.org/wiki/HATEOAS 不只要提供方便的 URI 產生機制 還要能夠提供 Link Header 或 Link within Entity,方便處理 Representation 裡面的 Resource 也要讓 Client 端能夠輕鬆取得這些 Link,進 行後續的處理 光靠 Java SE 的 URI 是不夠的 JAX-RS 的 UriBuilder/UriTemplate/UriInfo 也不夠方便
  • 92. JAX-RS 2.0/JSR-339 . Model-View-Controller Pattern JPA 的 Entity 相當於 Model JAX-RS 的 Resource Class 相當於 Controller JavaServer Pages、FreeMarker、String Template 等技術會被視為 View
  • 93. JAX-RS 2.0/JSR-339 . Bean Validation Integration 提供 Parameter Validation 機制 必要時提供有意義的訊息 應該會以 Bean Validation API 為基礎
  • 94. JAX-RS 2.0/JSR-339 . CDI Integration JAX-RS 1.1 定義時間早於 CDI,所以並沒有 提供很好的整合 JAX-RS 2.0 希望能夠與 CDI 更進一步整合 可能因此讓一些 Annotation (@Context) 變成 Deprecated
  • 95. JAX-RS 2.0/JSR-339 . Content Negotiation JAX-RS 1.1 以 Client 端送來的 Accept Header 裡面的 q 做決定 JAX-RS 2.0 會增加一個由 Server 端決定的 qs 1 <application xmlns="http://research.sun.com/wadl/2006/10"> 2 <resources base="http://localhost:4848/monitoring/"> 3 <resource path="domain{path:.*}"> 4 <param xmlns:xs="http://www.w3.org/2001/XMLSchema" 5 name="path" style="template" type="xs:string"/> 6 <method id="getChildNodes" name="GET"> 7 <response> 8 <representation mediaType="text/html;qs=2"/> 9 <representation mediaType="application/json"/> 10 <representation mediaType="application/xml"/> 11 </response> 12 </method> 13 </resource> 14 </resources> 15 </application>
  • 96. JAX-RS 2.0/JSR-339 . Target Platform 預計內建於 Java EE 7,使用相同的套件名稱 javax.ws.rs 但是要求 Java SE 6 與 Java EE 6 就可以實作 JAX-RS 2.0
  • 97. . . . Introduction 1 .. . 2 Implementation . . . Server-Side API 3 .. . 4 Development Tool .. . 5 Client-Side API . . . Application 6 .. . 7 Concern . . . Future 8 .. . 9 Summary
  • 98. . Summary RESTful 是趨勢 GlassFish 是很好的平台 NetBeans 是很棒的開發工具 Jersey 是很完整的實作 希望可以平順地轉換到 Java EE 7 的 JSR 339
  • 99. . References Pavel Bucek's weblog http://blogs.oracle.com/PavelBucek/ Japod's blog http://blogs.oracle.com/japod/ Jean-Francois Arcand's blog http://jfarcand.wordpress.com/ The Aquarium http://blogs.oracle.com/theaquarium/ Jersey 1.8 User Guide http://jersey.java.net/nonav/documentation/1.8/user-guide.html
  • 100. 資策會教研所 資訊技術訓練中心 . http://www.iiiedu.org.tw/taipei