在spring中使用webservice(Restful風格)

来源:http://www.cnblogs.com/zr520/archive/2016/03/30/5338945.html
-Advertisement-
Play Games

我們一般都會用webservice來做遠程調用,大概有兩種方式,其中一種方式rest風格的簡單明瞭。 記錄下來作為筆記: 開發服務端: 具體的語法就不講什麼了,這個網上太多了,而且只要看一下代碼基本上都懂,下麵是直接貼代碼: 這個風格和springmvc實在太像了,所以一看基本上就懂了。 下麵是配置 ...


我們一般都會用webservice來做遠程調用,大概有兩種方式,其中一種方式rest風格的簡單明瞭。

記錄下來作為筆記:

開發服務端:

具體的語法就不講什麼了,這個網上太多了,而且只要看一下代碼基本上都懂,下麵是直接貼代碼:

package com.web.webservice.rs;

import java.util.Iterator;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.google.common.collect.Lists;
import com.web.module.index.model.dao.UserDao;
import com.web.module.index.model.entity.User;

/**
 * 
 * @author Hotusm
 * 
 */
@Path("/test")
public class UserService {
    
    private static final Logger logger=LoggerFactory.getLogger(UserService.class);
    
    public static final String APPLICATION_XML_UTF_8 = "application/xml; charset=UTF-8";
    @Autowired
    private UserDao userDao;
    
    /**
     * 
     * @Produces 表示返回的數據格式 
     * @Consumes 表示接受的格式類型
     * @GET 表示請求的類型
     * @return
     * 
     * <a href="http://www.ibm.com/developerworks/cn/web/wa-jaxrs/"> BLOG</a>
     */
    @GET
    @Path("/list")
    @Produces("application/json")
    public List<User> list(){
        List<User> users=Lists.newArrayList();
        Iterable<User> iters = userDao.findAll();
        Iterator<User> iterator = iters.iterator();
        while(iterator.hasNext()){
            users.add(iterator.next());
        }
        
        return users;
    }
    
    /**
     * 
     * 在網頁上顯示鏈接
     * @return
     */
    @GET
    @Path("/page")
    @Produces("text/html")
    public String page(){
        
        return "<a href='http://www.baidu.com'>百度</a>";
    }
    
}

這個風格和springmvc實在太像了,所以一看基本上就懂了。

下麵是配置文件:

<?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:jaxrs="http://cxf.apache.org/jaxrs"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.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" />  
        
        <jaxrs:server id="rsService" address="/jaxrs">
      <!--在其中可以添加一些配置,比如攔截器等等的--> <jaxrs:serviceBeans> <ref bean="iuserService"/> </jaxrs:serviceBeans> <jaxrs:providers> <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"/> </jaxrs:providers> </jaxrs:server> <bean id="iuserService" class="com.web.webservice.rs.UserService"></bean> </beans>

寫好這些之後,啟動發現並不能夠使用,這是因為我們還需要在web.xml中配置發現ws:

web.xml

    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <!-- 這樣設置在rs下麵才能看到ws的界面,所以的服務都在這個後面 -->
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

註意我們現在這樣做以後,我們只要輸入$ctx/rs那麼下麵所以的ws服務都能看到了。

其實使用spring的話,是非常的簡單的。我們只需要配置一下上面的文件,最難的還是邏輯部分。

開發ws的服務端:

1:配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
  <!--設置一些屬性,具體的可以看源碼--> <property name="requestFactory"> <bean class="org.springframework.http.client.SimpleClientHttpRequestFactory"> <property name="readTimeout" value="30000"/> </bean> </property> </bean> </beans>

配置好了客戶端的配置文件以後,我們就可以直接將restTemplate註入到我們需要使用的地方中去,這個類是spring幫我抽象出來的,裡面有很多方法供我們的使用,其實就是封裝了一層,如果不喜歡,完成可以自己封裝一個,然後註入:

源碼:

protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
            ResponseExtractor<T> responseExtractor) throws RestClientException {

        Assert.notNull(url, "'url' must not be null");
        Assert.notNull(method, "'method' must not be null");
        ClientHttpResponse response = null;
        try {
            ClientHttpRequest request = createRequest(url, method);
            if (requestCallback != null) {
                requestCallback.doWithRequest(request);
            }
            response = request.execute();
            if (!getErrorHandler().hasError(response)) {
                logResponseStatus(method, url, response);
            }
            else {
                handleResponseError(method, url, response);
            }
            if (responseExtractor != null) {
                return responseExtractor.extractData(response);
            }
            else {
                return null;
            }
        }
        catch (IOException ex) {
            throw new ResourceAccessException("I/O error on " + method.name() +
                    " request for \"" + url + "\":" + ex.getMessage(), ex);
        }
        finally {
            if (response != null) {
                response.close();
            }
        }
    }

下麵是一個客戶端調用的例子(用的是springtest)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:/spring-context.xml","classpath*:/spring-mq-provider.xml","classpath*:/spring-mq-consumer.xml","classpath*:/spring-jaxrs-service.xml","classpath*:/spring-jaxrs-client.xml"})
public class RestTest {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${rest.service.url}")
    String url;
    @Test
    public void test(){
        //restTemplate=new RestTemplate();
        String str = restTemplate.getForObject(url+"test/list", String.class);
        
    }
}

 

基本上這些就能購我們使用了。

下次有空吧soap方法的也總結一下。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇在這 C++混合編程之idlcpp教程Lua篇(3) 與前面的工程相似,工程LuaTutorial2中,同樣加入了三個文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua。其中LuaTutorial2.cpp的內容基本和LuaTutorial1.cpp ...
  • 在使用Elasticsearch的時候,一定會遇到這種場景——希望批量的導入數據,而不是一條一條的手動導入。那麼此時,就一定會需要bulk命令! 更多內容參考 "我整理的Elk教程" bulk批量導入 批量導入可以合併多個操作,比如index,delete,update,create等等。也可以幫助 ...
  • 本文章向大家介紹java如何實現判斷時間是否為下午或上午,感興趣的碼農可以參考一下,請看下麵代碼: 原文地址:http://www.manongjc.com/article/536.html 其他文章: d3.js畫矢量圖+可拖拽的實現思路 ZXing 二維碼解析生成工具類 java貪食蛇源代碼分享 ...
  • 本文章向碼農們介紹php 表單提交錯誤後返回數據消失問題的解決方法,感興趣的碼農可以參考一下。 表單提交錯誤後返回數據消失怎麼辦吶,今天就來分析解決一下這個問題。 狀況概述: 做填寫表單信息提交的時候會碰到一個問題就是當用戶填寫並提交表單後,程式判斷不符合要求並返回,返回之後之前填寫的表單信息會被清 ...
  • opencv3.1 +windows10+ vs2015配置見文章 win10下vs2015配置Opencv3.1.0過程詳解(轉) 代碼經過測試,識別度極高,測試圖片50w張,識別率90%以上 如果可以結合微軟牛津計劃的api可以識別圖片物品 https://www.azure.cn/projec ...
  • 下載安裝Opencv3.1.0 下載Opencv3.1.0,進入官網,點擊opencv for windows即可下載。 點擊運行下載好的文件。實際上,opencv的安裝程式就是解壓縮文件,個人因為只有C盤,所以就直接在C盤建了一個文件夾Opencv3.1.0。 選好路徑之後點擊Extract即可。 ...
  • 如果我們需要產生多個對象,每個對象的邏輯完全一樣,只是對象內的成員變數的類型不同。那麼我們該如何去做? ① 創建多個類文件,給每個類中的成員變數設置指定的數據類型; 1 public class Demo1{ 2 public static void main(String []args){ 3 M ...
  • apache預設路徑配置方法 apache的配置 apache已經自帶了,只需如下三個命令就可以了。 開啟apache服務 sudo apachectl start 停止apache服務 sudo apachectl stop 重啟服務 sudo apachectl restart 查看版本 htt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...