日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cxf restful_使用Apache CXF开发RESTful服务

發(fā)布時(shí)間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cxf restful_使用Apache CXF开发RESTful服务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

cxf restful

介紹

如您所知,有兩種開發(fā)Web服務(wù)的方法

  • 簡單對(duì)象訪問協(xié)議(SOAP)
  • 代表性狀態(tài)轉(zhuǎn)移(REST)
  • 在繼續(xù)學(xué)習(xí)如何使用Apache CXF創(chuàng)建基于REST的Web服務(wù)之前,我們將了解什么是REST。 REST不是一種技術(shù),當(dāng)然也不是某種標(biāo)準(zhǔn)。 它只是一種架構(gòu)風(fēng)格,它限制了如何以某種方式編寫Web服務(wù)。 這種樣式是由某個(gè)Roy Fielding定義的(您猜對(duì)了,是的,他是HTTP的架構(gòu)師之一)在2000年定義。REST體系結(jié)構(gòu)的主要主角是資源 ,可以由統(tǒng)一資源標(biāo)識(shí)符或URI 。 在任何給定時(shí)間點(diǎn)資源的狀態(tài)由文件表示,稱為資源的表示 。 客戶端可以通過將表示形式與請(qǐng)求一起傳送來更新資源狀態(tài)。 現(xiàn)在,新的表示形式將與響應(yīng)一起返回給客戶端。 表示形式包含資源接受的html,xml,JSON等格式的信息。 遵守REST體系結(jié)構(gòu)規(guī)則的資源稱為RESTfull資源,遵守此規(guī)則的Web服務(wù)稱為RESTfull Web服務(wù)。

    創(chuàng)建一個(gè)項(xiàng)目以包含您的Web服務(wù)

    我通常使用maven Strut2入門原型在struts2 + spring中進(jìn)行Web開發(fā),以創(chuàng)建我的Web項(xiàng)目。 要在我的項(xiàng)目中使用CXF,我將以下依賴項(xiàng)添加到我的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用戶可以在以下鏈接中找到要添加的依賴項(xiàng)的詳細(xì)信息: http : //cxf.apache.org/docs/using-cxf-with-maven.html 。 可以從此處直接下載CXF: http : //cxf.apache.org/download.html

    如何創(chuàng)建CXF RESTfull Web服務(wù)?

    假設(shè)您要使用CXF創(chuàng)建RESTfull Web服務(wù)來管理個(gè)人書架中的書。 您通常需要在書架上執(zhí)行以下操作

  • 新增書籍
  • 更新書籍信息
  • 從書架上刪除一本書
  • 拿書
  • 獲取圖書清單
  • 按作者姓名獲取圖書清單
  • 需要執(zhí)行以下步驟來創(chuàng)建這樣的服務(wù)

  • 創(chuàng)建BookVO,BookList(值對(duì)象)以在請(qǐng)求和響應(yīng)中作為表示形式傳遞。
  • 將對(duì)象與請(qǐng)求和響應(yīng)綁定。
  • 創(chuàng)建服務(wù)實(shí)現(xiàn)類以接受請(qǐng)求并生成響應(yīng)。
  • 使用CXF容器注冊(cè)您的Web服務(wù)。
  • 在Web容器中部署服務(wù)。
  • 創(chuàng)建客戶端以調(diào)用服務(wù)上的方法。
  • 獲取本教程的源代碼

    我已經(jīng)在SVN中提交了本教程的源文件。

    • 您可以從以下網(wǎng)站下載該Web應(yīng)用程序: http : //subversion.assembla.com/svn/weblog4j/Weblog4jDemo/trunk
    • 您可以從以下 網(wǎng)址 下載客戶端: http : //subversion.assembla.com/svn/weblog4j/DemoClient/trunk

    注意:這兩個(gè)都是ItelliJ maven項(xiàng)目,因此您可以將它們直接導(dǎo)入到intelliJ IDE或?qū)⑽募謩?dòng)復(fù)制到其他IDE

    創(chuàng)建BookVO(值對(duì)象)以在請(qǐng)求和響應(yīng)中作為表示形式傳遞。

    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; } }

    將數(shù)據(jù)對(duì)象(即BookVO)與請(qǐng)求和響應(yīng)綁定

    要將BookVO與請(qǐng)求或響應(yīng)綁定,需要將其序列化為XML或JSON流。 序列化需要使用數(shù)據(jù)綁定組件之一來完成。 CXF使用JAXB作為默認(rèn)數(shù)據(jù)綁定組件。 JaXB使用@XmlRootElement批注將數(shù)據(jù)對(duì)象映射到xml。 您可以在上面的代碼中看到XmlRootElement批注的使用。

    創(chuàng)建服務(wù)實(shí)現(xiàn)類以接受請(qǐng)求并生成響應(yīng)

    讓我們看看CXF RestFull Web服務(wù)的外觀。 我們將創(chuàng)建一個(gè)BookService類,該類將對(duì)BookSelf執(zhí)行添加,更新,刪除和獲取操作。

    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中看到兩個(gè)方法。 它們是獲取和添加書籍的服務(wù)方法。 其余的更新刪除等方法可以用相同的方式編寫。 現(xiàn)在,讓我們看看各種注釋和方法調(diào)用的含義。

    • @POST –這表示服務(wù)僅接收POST請(qǐng)求。
    • @Path –這是Web服務(wù)的路徑。 因此,可以使用以下URL <base_url> / bookservice / getbook / {name}進(jìn)行獲取,使用<base_url> / bookservice / addbook進(jìn)行添加來調(diào)用Web服務(wù)。
    • @Produces –指示生成的響應(yīng)的MIME類型。 在我們的例子中,它既是application / xml也是application / json。
    • @Consumes –指示此服務(wù)可以使用的請(qǐng)求的MIME類型。

    使用CXF容器注冊(cè)您的Web服務(wù)。

    CXF的一件很酷的事情是,它使用基于Spring的配置來注冊(cè)其Web服務(wù)端點(diǎn),因此讓我們?cè)赪EB-INF中創(chuàng)建beans.xml并在web.xml中配置CXF。 首先,我們需要連接bean.xml以通過spring容器加載。

    <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans.xml,/WEB-INF/applicationContext.xml</param-value> </context-param>

    其次,將注冊(cè)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>

    現(xiàn)在打開bean.xml并注冊(cè)bookservice端點(diǎn)。

    <?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>

    現(xiàn)在您的Web服務(wù)已準(zhǔn)備就緒。 構(gòu)建您的Web應(yīng)用程序并將其部署在任何servlet容器中。

    為您的Web服務(wù)創(chuàng)建客戶端

    可以通過多種方式創(chuàng)建客戶端,我已經(jīng)使用apache Http Components編寫了客戶端。 這些庫可以在http://hc.apache.org/httpclient-3.x/中找到。

    Maven用戶可以使用以下命令拉動(dòng)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>

    現(xiàn)在調(diào)用Web服務(wù),我創(chuàng)建了一個(gè)名為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);}}}

    運(yùn)行此客戶端以查看Web服務(wù)的輸出。 現(xiàn)在,它將發(fā)送xmloutput,因?yàn)轫憫?yīng)接受標(biāo)頭為“ application / xml”。 您可以將其更改為application / json以獲得json輸出。

    多數(shù)民眾贊成。 這是使用apache CXF開發(fā)RestFull Web服務(wù)的非常基本的介紹,還有很多值得探索的地方。 愉快的探索,直到那再見。 如果您閱讀了此評(píng)論,請(qǐng)留下一些評(píng)論,以使我不斷受到啟發(fā)。

    參考: Weblog4j博客上的JCG合作伙伴 Niraj Singh 使用Apache CXF開發(fā)RESTful服務(wù) 。

    翻譯自: https://www.javacodegeeks.com/2013/07/developing-restful-services-using-apache-cxf.html

    cxf restful

    總結(jié)

    以上是生活随笔為你收集整理的cxf restful_使用Apache CXF开发RESTful服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。