用JAX-RS和Jersey完成RESTful Web Services
Upcoming SlideShare
Loading in...5
×
 

用JAX-RS和Jersey完成RESTful Web Services

on

  • 8,773 views

大綱...

大綱
1. RESTful Services 簡介
2. 現有的 JAX-RS (JSR-311) 與 Implementation
3. JAX-RS Service 端的使用方式
4. JAX-RS Client 端的支援
5. Security 的考量
6. 未來 Java EE 7 的 JAX-RS 2.0 (JSR-339)

介紹
這個 Session 主要會以 NetBeans 7.0 搭配 GlassFish 3.1 裡面的 Jersey,為大家介紹
JAX-RS 1.1 在 Server 端與 Client 端的應用方式,以及未來 JAX-RS 2.0 預計要提供的一些新功能。

Statistics

Views

Total Views
8,773
Views on SlideShare
7,512
Embed Views
1,261

Actions

Likes
9
Downloads
255
Comments
0

23 Embeds 1,261

http://cloudtu.blogspot.tw 1051
http://cloudtu.blogspot.com 100
http://cloudtu.blogspot.hk 53
http://www.blogger.com 8
http://cloud.feedly.com 7
http://cloudtu.blogspot.com.au 6
http://cloudtu.blogspot.de 5
http://cloudtu.blogspot.ca 4
http://cloudtu.blogspot.jp 4
http://translate.googleusercontent.com 4
https://twitter.com 3
http://feeds.feedburner.com 2
http://cloudtu.blogspot.in 2
http://www.feedspot.com 2
http://digg.com 2
http://www.cloudtu.blogspot.tw 1
http://feedly.com 1
http://cloudtu.blogspot.fr 1
http://cloudtu.blogspot.com.br 1
https://www.facebook.com 1
http://summary 1
http://cloudtu.blogspot.it 1
http://www.inoreader.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

用JAX-RS和Jersey完成RESTful Web Services 用JAX-RS和Jersey完成RESTful Web Services Presentation Transcript

  • .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 Buceks weblog http://blogs.oracle.com/PavelBucek/ Japods blog http://blogs.oracle.com/japod/ Jean-Francois Arcands 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