簡介
Jersey是JAX-RS(JSR311)開源參考實作用於建構 RESTful Web service,它包含三個部分:
核心伺服器(Core Server)可以使用SR 用直覺的方式開發RESTful Web服務。
核心客戶端(Core Client) :Jersey客戶API能夠幫助開發者與RESTful服務輕鬆通訊; Abdera的庫。
在本次開發中使用Jersey2.0,並且只使用了核心伺服器。
設定Jersey環境
Maven
引入Jar檔案方式
中將以下程式庫複製的WEB-INF下的庫目錄:
伺服器:jersey-server.jar 、jersey-Container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api- 2.0.jar
客戶端:jersey-client.jar
common:jersey-common.jar
json支持:在Jersey2.0中需要使用 Jackson1.9 才能支持json。
Hello World
以下將展示一個Hello World
第一步: 編寫一個名為HelloResource的資源,它接受Http Get請求並回應「Hello Jersey」
@Path(public/class HReello") public/class HReello@Path(public"/class HReello { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello Jersey"; }
}
第二步:
} xml檔案中定義servelt調度程序,目的是將所有REST請求傳送到Jersey容器。除了宣告Jersey Servlet外,還需定義一個初始化參數,指定JAX-RS application。
第四步: 測試程式
在命令終端機中輸入以下命令,將會看到「Hello Jersey」。
curl http://host:port/services/hello
或瀏覽器中輸入下列何/hello
使用
資源
Root Resource And Sub-Resource
資源是組成RESTful服務的關鍵部分,可使用HTTP方法(如:GET、TLEST、PUT、DETLE、PUT、DETLEST)操作資源。在JAX-RX中,資源透過POJO實現,使用 @Path 註釋來組成其識別碼。資源可以有子資源,父資源是資源集合,子資源是成員資源。
在以下範例程式碼中,
Resources是"/services" URI組成是集合資源,UserResource是「/services/user」 URI組成的成員資源;
@Path("/services")public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... }
})
?的集合資源,getUser是「/user/{username}」 URI組成的資源方法
@Path("/user")public class UserResource { @GET @Path("{username"}) @Produces("application/ json") public User getUser(@PathParam("username") String userName) { ... }
}
HTTP方法對應到資源的CRUD(建立、讀取、更新)操作,基本模式如下:
}
@Produces({@Consumes
@Consumes 與 @Produces 相反,以指定可接受的clientMI POST 。
參數(Parameter Annotations)
Parameter Annotations用於取得client所傳送的資料。本文只介紹常用的註解,更多詳見 Jersey使用手冊
@PathParam
使用 @PathParam 可以取得URI中指定規則的參數,例如: 以
@QueryParam
@QueryParam 用於取得GET請求中的查詢參數,如:
@GET@Path("/user")@Produces("text/plain")public User getUser(@Query ") String name, @QueryParam("age") int age) {
...}
Šo:505當瀏覽器請求瀏覽器請求值rose ,age值為25。如果需要為參數設定預設值,可以使用 @DefaultValue ,如:
@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam("name") Stringname,"name") name, getUsername") @DefaultValue("26") @QueryParam("age") int age) {
}
當瀏覽器請求 http://host:port/user?name=rose ,age值為26。@FormParam
@FormParam ,顧名思義,從POST請求的表單參數取得資料。如:
@POST@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) { // Store the message}
@BeanParam
請求參數很多時,例如客戶端提交一個修改使用者的PUT請求,請求包含許多使用者資訊。這時可用 @BeanParam 。 @POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) { // Store the user data}public class User { @PathParam("userName) private String userName; @FormParam("name") private String name; @FormParam("telephone") private String name; @FormParam("telephone") private String private表String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } ...
}
的一個大參數多變,參數結構的調整都會因為以上幾種方式而遇到問題,這時可以考慮使用 @Context 註釋,並獲得UriInfo實例,如下:
@GET
public String get(@Context UriInfo ui) { MultivaluedMap MultivaluedMap
@Path("/")public class Resource { @Context HttpServletRequest req; @Context ServletConfig. eaders hh) { MultivaluedMap
}
Jersey JavaBean綁定到XML或JSON,反之亦然。 JavaBean必須使用 @XmlRootElement 標註,且沒有 @XmlElement 註解的欄位將包含一個名稱與相同的XML元素,如下:
@ffRoot/prim. vate String errorMsg; public String getResult() { return result; this.errorMsg = errorMsg; }
}
然後在REST服務中使用:
@Path("/user")public class UserResource { @POST @Produces("application/json") public OptionResult create(@userBam User }
}最後,要註冊資料轉換器,該轉換器會自動將JavaBean轉換為json資料:
public class APIApplication extends ResourceConfig {
}
}
說明 :返回XML資料的原理相同,僅是資料轉換器不同,只需要在APIApplication詳見 Jersey使用手冊
問題總結
Ajax請求(POST、PUT和DELETE)無法將資料提交至Jersey容器
問題闡述
問題闡述
問題闡述
在簡訊平台的開發中,資料的CRUD全部使用Ajax技術完成,因此必須使用POST、PUT和DELETE請求。此三種請求的content-type都是“application/x-www-form-urlencoded”,使用UTF-8編碼會變成“application/x-www-form-urlencoded; UTF-8”。在使用Firefox的tamperdata擴展調試程序的過程中發現,當content-type為“application/x-www-form-urlencoded”時,Jersey容器能夠透過 @FormParam 註解取得提交的數據,而content-type則為「 application/x-www-form-urlencoded; UTF-8”時可取得不到。
解決方案
最後我使用Java Filter和Jersey RequestFilter解決了問題。首先在Java Filter中使用UTF8將Request中的資料編碼,然後在Jersey RequestFilter中將request物件中的content-type修改為「application/x-www-form-urlencoded」。如:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)quest 8Im| ter implements ContainerRequestFilter { @ Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString("content-type"); if (headerString != null) { 「開頭,則處理 if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_UR ED在web.xml中註冊Java Filter(要註冊在Jersey容器之前),在APIApplication中註冊Jersey RequestFilter,如下:
public class APIApplication extends ResourceConfig {
public APIApplication() {
:在修復此問題後,在Github的Jersey原始碼倉庫中看到已經有人發現並修復了此問題,在下個Jersey正式版本中應該不會再出現這樣的問題,詳見 此Discussion
更多Java Jersey2使用總結相關文章請關注PHP中文網!