使用Apache CXF开发RESTful服务
介紹
如您所知,有兩種開發Web服務的方法
在繼續學習如何使用Apache CXF創建基于REST的Web服務之前,我們將了解什么是REST。 REST不是一項技術,當然也不是某種標準。 這只是一種架構風格,它限制了如何以某種方式編寫Web服務。 這種樣式是由某個Roy Fielding在2000年定義的(您猜對了,是的,他是HTTP的架構師之一)。REST體系結構的主要主角是資源 ,可以由統一資源標識符或URI 。 在任何給定時間點資源的狀態由文件表示,稱為資源的表示 。 客戶端可以通過將表示形式與請求一起傳送來更新資源狀態。 現在,新的表示形式將與響應一起返回給客戶端。 該表示形式包含資源接受的html,xml,JSON等格式的信息。 遵守REST體系結構規則的資源稱為RESTfull資源,遵守此規則的Web服務稱為RESTfull Web服務。
創建一個項目以包含您的Web服務
我通常使用maven Strut2入門原型在struts2 + spring中進行Web開發,以創建我的Web項目。 要在我的項目中使用CXF,我將以下依賴項添加到我的POM中
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version> </dependency> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version> </dependency> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>${cxf.version}</version> </dependency>非maven用戶可以在以下鏈接中找到要添加的依賴項的詳細信息: http : //cxf.apache.org/docs/using-cxf-with-maven.html 。 可以從此處直接下載CXF: http : //cxf.apache.org/download.html
如何創建CXF RESTfull Web服務?
假設您想使用CXF創建RESTfull Web服務來管理個人書架中的書。 您通常需要在書架上執行以下操作
需要執行以下步驟來創建這樣的服務
獲取本教程的源代碼
我已經在SVN中提交了本教程的源文件。
- 您可以從以下網站下載該Web應用程序: http : //subversion.assembla.com/svn/weblog4j/Weblog4jDemo/trunk
- 您可以從以下 網址 下載客戶端: http : //subversion.assembla.com/svn/weblog4j/DemoClient/trunk
注意:這兩個都是ItelliJ maven項目,因此您可以將它們直接導入到intelliJ IDE或手動將文件復制到其他IDE
創建BookVO(值對象)以在請求和響應中作為表示形式傳遞。
BookVO類
package com.aranin.weblog4j.vo;import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.io.Serializable;@XmlRootElement(name="Book") public class BookVO implements Serializable{private long bookId; private String bookName; private String author;public long getBookId() { return bookId; }public void setBookId(long bucketId) { this.bookId = bookId; }public String getBookName() { return bookName; }public void setBookName(String bookName) { this.bookName = bookName; }public String getAuthor() { return author; }public void setAuthor(String author) { this.author = author; } }圖書清單類
package com.aranin.weblog4j.vo;import javax.xml.bind.annotation.XmlRootElement; import java.util.ArrayList; import java.util.List;@XmlRootElement(name="BookList") public class BookList { private List<BookVO> bookList;public List<BookVO> getBookList() { if(bookList == null){ bookList = new ArrayList<BookVO>(); } return bookList; }public void setBookList(List<BookVO> bookList) { this.bookList = bookList; } }將數據對象(即BookVO)與請求和響應綁定
要將BookVO與請求或響應綁定,需要將其序列化為XML或JSON流。 序列化需要使用數據綁定組件之一來完成。 CXF使用JAXB作為默認數據綁定組件。 JaXB使用@XmlRootElement批注將數據對象映射到xml。 您可以在上面的代碼中看到XmlRootElement批注的使用。
創建服務實現類以接受請求并生成響應
讓我們看看CXF RestFull Web服務的外觀。 我們將創建一個BookService類,該類將對BookSelf執行添加,更新,刪除和獲取操作。
BookService類別
package com.aranin.weblog4j.services.rest;import com.aranin.weblog4j.hashdb.HashDB; import com.aranin.weblog4j.vo.BookVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import javax.ws.rs.*; import javax.ws.rs.core.Response; import java.io.UnsupportedEncodingException; import java.net.URLDecoder;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/13/13* Time: 3:58 PM* To change this template use File | Settings | File Templates.*/ public class BookService {protected final Logger log = LoggerFactory.getLogger(BookService.class);@POST@Path("/getbook/{name}")@Produces({"application/xml","application/json"})@Consumes({"application/xml","application/json","application/x-www-form-urlencoded"})public Response getBucket(@PathParam("name") String name) {log.debug("name : " + name);BookVO bookVO = null;try {bookVO = HashDB.getBook(URLDecoder.decode(name, "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.}if(bookVO == null){return Response.status(Response.Status.BAD_REQUEST).build();}else{return Response.ok(bookVO).build();}}@POST@Path("/addbook")@Produces({"application/xml","application/json"})@Consumes({"application/xml","application/json","application/x-www-form-urlencoded"})public Response addBook(@FormParam("name") String bookName,@FormParam("author") String author) {log.debug("inside addBook");BookVO bookVO = new BookVO();bookVO.setBookName(bookName);bookVO.setAuthor(author);HashDB.insertBook(bookVO);if(HashDB.getBook(bookName) == null){return Response.status(Response.Status.BAD_REQUEST).build();}else{return Response.ok(bookVO).build();}} }您可以在BookService類的getBook和addBook中看到兩個方法。 它們是獲取和添加書籍的服務方法。 其余的更新刪除等方法可以用相同的方式編寫。 現在,讓我們看看各種注釋和方法調用的含義。
- @POST –表示服務僅接收POST請求。
- @Path –這是Web服務的路徑。 因此,可以使用以下URL <base_url> / bookservice / getbook / {name}進行獲取,使用<base_url> / bookservice / addbook進行添加來調用Web服務。
- @Produces –指示生成的響應的MIME類型。 在我們的例子中,它既是application / xml也是application / json。
- @Consumes –指示此服務可以使用的請求的MIME類型。
使用CXF容器注冊您的Web服務。
CXF的一件很酷的事情是,它使用基于Spring的配置來注冊其Web服務端點,因此讓我們在WEB-INF中創建beans.xml并在web.xml中配置CXF。 首先,我們需要連接beans.xml以通過spring容器加載。
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans.xml,/WEB-INF/applicationContext.xml</param-value> </context-param>其次,將注冊CXFServlet加載到web.xml中。
<servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXF Servlet</display-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet><servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>現在打開bean.xml并注冊bookservice端點。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><jaxws:endpointid="bookShelfService"implementor="com.aranin.weblog4j.services.BookShelfServiceImpl"address="/bookshelfservice" /><bean id="bookserviceclass" class="com.aranin.weblog4j.services.rest.BookService"/><jaxrs:server id="bookservice" address="/bookservice"><jaxrs:serviceBeans><ref bean="bookserviceclass" /></jaxrs:serviceBeans></jaxrs:server></beans>現在您的Web服務已準備就緒。 構建您的Web應用程序并將其部署在任何servlet容器中。
為您的Web服務創建客戶端
可以通過多種方式創建客戶端,我已經使用apache Http Components編寫了客戶端。 這些庫可以在http://hc.apache.org/httpclient-3.x/中找到。
Maven用戶可以使用以下命令拉動Http組件jar
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.1.3</version> <scope>compile</scope> </dependency><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.1.3</version> <scope>compile</scope> </dependency>現在調用Web服務,我創建了一個名為DemoRestClient的util類。
package com.aranin.weblog4j.client;import com.aranin.weblog4j.vo.BookVO; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod;import java.net.URLEncoder;/*** Created by IntelliJ IDEA.* User: Niraj Singh* Date: 3/13/13* Time: 4:15 PM* To change this template use File | Settings | File Templates.*/ public class DemoRestClient {public static void main(String[] args){DemoRestClient restClient = new DemoRestClient();try {//restClient.addBook("Naked Sun", "Issac Asimov");restClient.getBook("Naked Sun");} catch (Exception e) {e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.}}public BookVO getBook(String bookName) throws Exception {String output = null;try{String url = "http://localhost:8080/weblog4jdemo/bookservice/getbook/";url = url + URLEncoder.encode(bookName, "UTF-8");HttpClient client = new HttpClient();PostMethod mPost = new PostMethod(url);client.executeMethod( mPost );Header mtHeader = new Header();mtHeader.setName("content-type");mtHeader.setValue("application/x-www-form-urlencoded");mtHeader.setName("accept");mtHeader.setValue("application/xml");mPost.addRequestHeader(mtHeader);client.executeMethod(mPost);output = mPost.getResponseBodyAsString( );mPost.releaseConnection( );System.out.println("out : " + output);}catch(Exception e){throw new Exception("Exception in retriving group page info : " + e);}return null;}public void addBook(String bookName, String author) throws Exception {String output = null;try{String url = "http://localhost:8080/weblog4jdemo/bookservice/addbook";HttpClient client = new HttpClient();PostMethod mPost = new PostMethod(url);mPost.addParameter("name", "Naked Sun");mPost.addParameter("author", "Issac Asimov");Header mtHeader = new Header();mtHeader.setName("content-type");mtHeader.setValue("application/x-www-form-urlencoded");mtHeader.setName("accept");mtHeader.setValue("application/xml");//mtHeader.setValue("application/json");mPost.addRequestHeader(mtHeader);client.executeMethod(mPost);output = mPost.getResponseBodyAsString( );mPost.releaseConnection( );System.out.println("output : " + output);}catch(Exception e){throw new Exception("Exception in adding bucket : " + e);}}}運行此客戶端以查看Web服務的輸出。 現在,它將發送xmloutput,因為響應接受標頭為“ application / xml”。 您可以將其更改為application / json以獲得json輸出。
多數民眾贊成。 這是使用apache CXF開發RestFull Web服務的非常基本的介紹,還有很多要探索的內容。 愉快的探索,直到那再見。 如果您閱讀了此文章,請留下一些評論,以使我不斷受到啟發。
翻譯自: https://www.javacodegeeks.com/2013/07/developing-restful-services-using-apache-cxf.html
總結
以上是生活随笔為你收集整理的使用Apache CXF开发RESTful服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【IT之家众测】联想小新 Pad Pro
- 下一篇: Spring Web应用程序的最大缺陷