restful web_泽西岛的RESTful Web服务
restful web
我已經(jīng)討論了有關(guān)體系結(jié)構(gòu)考慮事項(xiàng)<< link >>的早期文章,以成為可在我的系統(tǒng)/機(jī)器上使用的分布式環(huán)境上的RESTful系統(tǒng)。 本文我們將討論如何基于REST體系結(jié)構(gòu)考慮來(lái)構(gòu)建Web服務(wù)。 本教程說(shuō)明了如何使用Tomcat 6,Eclipse和Jersey JAX-RS(JSR 311)參考實(shí)現(xiàn)在Java中開(kāi)發(fā)RESTful Web服務(wù)。
簡(jiǎn)而言之,RESTful Web服務(wù)是使用HTTP on REST原理的機(jī)器之間的通信,它具有以下要點(diǎn):
- 每個(gè)資源代表唯一的URI,以通過(guò)HTTP協(xié)議進(jìn)行通信
- HTTP方法支持的每個(gè)資??源操作(POST,GET,PUT和DELETE)
- JSON,XML和各種MIME類型(例如圖像,字節(jié)流等)支持的請(qǐng)求和響應(yīng)。
JAX-RS
JAX-RS是基于注釋的API,用于在Java中基于HTTP實(shí)現(xiàn)RESTful Web服務(wù)。 本質(zhì)上,類和方法用信息注釋,這些信息使運(yùn)行時(shí)可以將它們公開(kāi)為資源。 在考慮到URI,請(qǐng)求和接受的內(nèi)容類型以及HTTP方法的情況下,實(shí)現(xiàn)JAX-RS的運(yùn)行時(shí)在HTTP協(xié)議和Java類之間進(jìn)行中介。
Jersey框架實(shí)現(xiàn)了JSR-RS(JSR-311)參考API。 除了Jersey之外,還有其他各種實(shí)現(xiàn),例如Retlet,JBOSS RESTeasy,Apache CXF等。
球衣:
澤西島包含以下主要部分:
- 核心服務(wù)器:要基于注釋構(gòu)建RESTful Web服務(wù),請(qǐng)包含諸如jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar之類的關(guān)鍵庫(kù)。
- 核心客戶端:Jersey客戶端API可幫助您輕松與REST服務(wù)進(jìn)行通信,包括libabry ersey-client.jar
- JAXB支持:(在高級(jí)示例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
- JSON支持:(在高級(jí)示例中使用)jersey-json.jar
- 集成:Jersey還提供了可以輕松與Spring,Guice,Apache Abdera等集成的庫(kù)。
獲取工具
| 軟件 | 下載 |
| Java JDK-6 | http://www.oracle.com/ |
| Eclipse –印度 | http://www.eclipse.org/ |
| Tomcat的Apache -6 | http://tomcat.apache.org/ |
| H2-數(shù)據(jù)庫(kù) | http://www.h2database.com/ |
注意 :您可以在此處下載完整的演示應(yīng)用程序,包括H2和Jersey庫(kù)<link>
使用Jersey的RESTful Web服務(wù)實(shí)現(xiàn)
我們將為用戶管理構(gòu)建一個(gè)小型應(yīng)用程序,以對(duì)用戶進(jìn)行CRUD操作。 然后,我們將使用列用戶名和密碼創(chuàng)建一個(gè)小的User表,并使用Jersey注釋對(duì)Web服務(wù)使用POJO類公開(kāi)操作進(jìn)行CRUD操作。
以下是開(kāi)始RESTful Web服務(wù)開(kāi)發(fā)之前的設(shè)計(jì)注意事項(xiàng)。
- 資源:具有用戶名和密碼屬性的用戶
- 資源類: UsersResource.java
- URI: http:// localhost:8080 / UserManagement / users
- 表示形式: XML
應(yīng)用程序開(kāi)發(fā)文件夾結(jié)構(gòu)
我們的應(yīng)用程序的目錄結(jié)構(gòu)如下所示:
以下是所需的應(yīng)用程序庫(kù)列表:
應(yīng)用配置:
在開(kāi)始開(kāi)發(fā)之前,我們需要將Jersey servlet添加到web.xml中,以將整個(gè)請(qǐng)求定向到j(luò)ersey,以進(jìn)行資源標(biāo)識(shí)和操作過(guò)程(POST,GET,PUT和DELETE)。
包含jersey servlet之后,Web.xml將如下所示
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>UserManagement</display-name><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>resource.com.users.java</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Jersey REST Service</servlet-name><url-pattern>/*</url-pattern></servlet-mapping> </web-app>資源資源
資源是指可通過(guò)網(wǎng)絡(luò)尋址和操縱的任何東西。 Jersey資源是帶有@Path注釋的純Java對(duì)象(PO??JO),將由HTTP方法POST,GET,PUT和DELETE進(jìn)行操縱。 資源還具有子資源。 在示例應(yīng)用程序Users Users的UsersResource中,Java bean是Resources。 用戶是具有屬性名稱和密碼的簡(jiǎn)單POJO
UsersResource.java @Path("/users") public class UsersResource implements IUsersResource{ @Context UriInfo uriInfo; @GET @Produces ("application/xml") public List<User> getUsersAll() { List<User> als=null; try { als= UserService.getInstance().getUserAll(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return als; }@POST @Consumes ("application/xml") @Produces ("application/xml") public User createUser(User user){ URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName()).build(); Response res=Response.created(uri).build(); try { UserService.getInstance().CreateUser(user); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return user; }@Path("/user/{username}") @GET @Produces ("application/xml")public List<User> getUser(@PathParam("username") String username) { List<User> asl=null; try { asl= UserService.getInstance().getUser(username); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return asl; }以下是對(duì)JAX-RS注釋的簡(jiǎn)要說(shuō)明
- @Path:與根路徑結(jié)合的路徑提供URI來(lái)標(biāo)識(shí)資源。 例如,在給定的示例URI中將為http:// localhost:8080 / UserManagement / users
- @Path(“ / user / {username}”):我們也可以在方法上使用子路徑來(lái)公開(kāi)子資源,此示例URI將為http:// localhost:8080 / UserManagement / users / user / john
- @Context:上下文用于注入上下文對(duì)象,例如Request,Response,UriInfo,ServletContext等。
- @PathParam:此批注與@Path一起使用,并與GET,POST,PUT和DELETE結(jié)合使用。 其他可用的注釋是@ FormParam,@ QueryParam等。
- @Produces(“ application / xml”):支持多種MIME類型的響應(yīng)。 在這種情況下,application / xml將是默認(rèn)的MIME類型。
- @Consumes(“ application / xml”):輸入請(qǐng)求有效負(fù)載將以xml格式發(fā)送。
- @GET:由GET,POST,PUT和DELET方法之一操縱的資源通過(guò)HTTP標(biāo)頭傳遞
JAXB – Java POJO XML綁定
澤西島支持JAXB,實(shí)習(xí)生將POJO轉(zhuǎn)換為XML,反之亦然。 為了使POJO具備支持XML的資格,我們必須聲明@XmlRootElement注釋,如下所示:
不要忘記在轉(zhuǎn)換過(guò)程中根據(jù)需要添加空的構(gòu)造函數(shù)。
@XmlRootElement public class User { private String userName; private String userPasswd; public User(String userName, String userPasswd) { this.userName = userName; this.userPasswd = userPasswd; } public User() { super(); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPasswd() { return userPasswd; } public void setUserPasswd(String userPasswd) { this.userPasswd = userPasswd; } }我們將在H2數(shù)據(jù)庫(kù)的User表中創(chuàng)建執(zhí)行CRUD操作的服務(wù)類。
UserService.javapublic class UserService{ public static UserService userService = new UserService(); public static final String GET_USER="SELECT * FROM USER"; public static final String INSERT_USER="Insert into user "; public List<User> getUserAll() throws ClassNotFoundException, SQLException { List<User> ls = new ArrayList(); ls=DataServiceHelper.getInstance().executeQuery(GET_USER); return ls; }public List<User> getUser(String name) throws ClassNotFoundException, SQLException{ String SQL_WHERE_CAS=" where name='"+name+"'"; List<User> als=DataServiceHelper.getInstance().executeQuery(GET_USER+SQL_WHERE_CAS); return als; }public void CreateUser(User user) throws SQLException, ClassNotFoundException { String SQL_WHERE_CASE=" VALUES('" + user.getUserName() + "','" + user.getUserPasswd() + "')"; DataServiceHelper.getInstance().executeUpdateQuery(INSERT_USER+SQL_WHERE_CASE); } public static UserService getInstance() { return userService; } }助手類
我們必須創(chuàng)建更多的類來(lái)與DB(在本例中為H2)進(jìn)行交互并執(zhí)行CRUD操作。
DaraServiceHelper.javapublic class DataServiceHelper { public static DataServiceHelper dataServiceHelper = null; private Connection con = null; DataSource dataSource = null; InitialContext initialContext = null; public static final String DB_URL = "jdbc:h2:tcp://localhost/~/test"; public static final String DRIVER_NAME = "org.h2.Driver"; /*** This method is used to create an object for the given DAO class name. */public Connection getConnection() throws ClassNotFoundException, SQLException { Class.forName(DRIVER_NAME); con = DriverManager.getConnection(DB_URL, "sa", ""); return con; }public void closeConnection() throws SQLException { if (isConnectionOpen()) { con.close(); con = null; } } public boolean isConnectionOpen() { return (con != null); }public static DataServiceHelper getInstance() { if (dataServiceHelper == null) { dataServiceHelper = new DataServiceHelper(); } return dataServiceHelper; }public void executeUpdateQuery(String query) throws SQLException, ClassNotFoundException { Connection con = getConnection(); Statement stmt = con.createStatement(); stmt.execute(query); closeConnection(); }public List<User> executeQuery(String query) throws ClassNotFoundException, SQLException { Connection con = getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); List<User> als = convertPojoList(rs); closeConnection(); return als; }private List<User> convertPojoList(ResultSet rs) throws SQLException { List<User> asl = new ArrayList<User>(); while (rs.next()) { User user = new User(rs.getString("name"), rs.getString("password")); asl.add(user); } return asl; }public static void main(String[] args) throws ClassNotFoundException, SQLException { String query = "Select * from user where name='nitin'"; List<User> als = DataServiceHelper.getInstance().executeQuery(query); System.out.println("List==>" + als); } }注意:為簡(jiǎn)單起見(jiàn),我將所有代碼都包含在一個(gè)類中
澤西島客戶測(cè)試
澤西島提供客戶端來(lái)測(cè)試RESTful Web服務(wù),它有助于與服務(wù)器進(jìn)行通信并測(cè)試服務(wù)。 該庫(kù)是一個(gè)通用實(shí)現(xiàn),可以與任何基于HTTP / HTTPS的Web服務(wù)配合使用。
public class UserResourceSample { public static final String USER_URI="http://localhost:8080/UserManagement/users"; public String testGetUsersAll() { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(ForumConstant.USER_URI); ClientResponse response = resource.type(MediaType.APPLICATION_XML).get( ClientResponse.class); String en = response.getEntity(String.class); return en; }public String testGetUsers() { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(ForumConstant.USER_URI); ClientResponse response = resource.type(MediaType.APPLICATION_XML).get( ClientResponse.class); String en = response.getEntity(String.class); return en; }public User testCreateUser() { User user = new User("John", "john@"); Client client = Client.create(); WebResource r = client.resource(ForumConstant.USER_URI); ClientResponse response = r.accept(MediaType.APPLICATION_XML).post( ClientResponse.class, user); return user; } }使用瀏覽器運(yùn)行
在Eclipse中運(yùn)行Web應(yīng)用程序,并在以下位置測(cè)試REST服務(wù)的可用性: http:// localhost:8080 / UserManagement / users&#8221;。 您應(yīng)該看到用戶項(xiàng)目的XML表示形式:
對(duì)于子資源:
注意 :在運(yùn)行應(yīng)用程序之前,請(qǐng)不要忘記運(yùn)行H2數(shù)據(jù)庫(kù)并將記錄插入到User表中
結(jié)論:
這個(gè)例子討論了Apache tomcat與Jersey的基本用法。 我們將在以后討論一些JAX-RS的高級(jí)用法。 您也可以將完整的代碼下載到此鏈接下面的<>
資源:
- http://en.wikipedia.org/wiki/Representational_state_transfer
- https://jersey.java.net/
翻譯自: https://www.javacodegeeks.com/2013/07/restful-webservices-with-jersey.html
restful web
總結(jié)
以上是生活随笔為你收集整理的restful web_泽西岛的RESTful Web服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓手机adb工具箱(安卓手机adb)
- 下一篇: 使用Apache Ignite优化Spa