javarestful
㈠ java使用restful格式有什麼好處
好處:
1.REST規范:強調HTTP應當以資源為中心,好帶並且規范了資源URI的風格;
2.規范了HTTP請求動作(PUT,POST等)的使用,具有對應的語義;
3.遵循REST規范的Web應用將會獲得下面好處:
a.URL具有很強可讀性信襪賀的,具有自描述性;
b.資源描述與視圖的松耦合;
c.可提供OpenAPI,便於第三方系統集成,提高互操作滑派性;
d.如果提供無狀態的服務介面,可提高應用的水平擴展性;
㈡ restful webservice 是java 還是.net
restful 是一種軟體架穗爛肆猜轎構風歷帶格。和java .net沒有關系
也就是說:java .net都可以實現restful service
㈢ 怎樣用通俗的語言解釋什麼叫 REST,以及什麼是 RESTful
REST (REpresentation State Transfer) 描述了一個架構樣式的網路系統,比如 web 應用程序。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規范的主要編寫者之一。REST 指的是鍵畝罩一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。Web 應用程序最重要的 REST 原則是,客戶端和伺服器之間的交互在請求之間是無狀態的。從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。如果伺服器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態請求可以由任何可用伺服器回答,這十分適合雲計算之類的環境。客戶端可以緩存數據以改進性能。在伺服器端,應用程序狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、資料庫記錄、演算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。所有資源都共享統一的界面,以便在客戶端和伺服器之間傳輸狀態。使用的是標准耐塌的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應用程序狀態的引擎,資源表示通過超鏈接互聯。另一個重要的 REST 原則是分層系統,這表示組件無法了解它與之交互的中間層以外的組件。通過將系統知識限制在單個層,可以限制整個系統的復雜性,促進了底層的獨立性。當REST 架構的約束條件作為一個整體應用時,將生成一個可以擴展到大量客戶端的應用程序。它還降低了客戶端和伺服器之間的交互延遲。統一界面簡化了整個系統架構,改進了子系統之間交互的可見性。REST 簡化了客戶端和伺服器的實現。RESTful的實現:RESTful Web 服務與 RPC 樣式的 Web 服務了解了什麼是什麼是REST,我們再看看RESTful的實現。最近,使用 RPC 樣式架構構建的基於 SOAP 的 Web 服務成為實現 SOA 最常用的方法。RPC 樣式的 Web 服務客戶端將一個裝滿數據的信封(包括方法和參數信息)通過 HTTP 發送到伺服器。伺服器打開信封並使用傳入參數執行指定的方法。方法的結果打包到一個信封並作為響應發回客戶端。客戶端收到響應並打開信封。每個對象都有自己獨特的方法以及僅公開一個 URI 的 RPC 樣式 Web 服務,URI 表示單個端點。它忽略 HTTP 的大部分特性且僅支持 POST 方法。由於輕量級以及通過 HTTP 直接傳輸數據的特性,Web 服務的 RESTful 方法已經成為最常見的替代方法。可以使用各種語言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])實現客戶端。RESTful Web 服務通常可以通過自動客戶端或代表用戶的應用程序訪問。但是,這種服務的簡便性讓用戶能夠與之直接交互,使用它們的 Web 瀏覽器構建一個 GET URL 並讀取返回的內容。在REST 樣式的 Web 服務中,每個資源都有一個地址。資源本身都是方法調用的目標,方法列表對所有資源都是一樣的。這些方法都是標准方法,包括 HTTP GET、POST、PUT、DELETE,還可能包括 HEADER 和 OPTIONS。在RPC 樣式的架構中,關注點在於方法,而在 REST 樣式的架構中,關注點在於資源 —— 將使用標准方法檢索並操作信息片段稿鬧(使用表示的形式)。資源表示形式在表示形式中使用超鏈接互聯。Leonard Richardson 和 Sam Ruby 在他們的著作 RESTful Web Services 中引入了術語 REST-RPC 混合架構。REST-RPC 混合 Web 服務不使用信封包裝方法、參數和數據,而是直接通過 HTTP 傳輸數據,這與 REST 樣式的 Web 服務是類似的。但是它不使用標準的 HTTP 方法操作資源。它在 HTTP 請求的 URI 部分存儲方法信息。好幾個知名的 Web 服務,比如 Yahoo 的 Flickr API 和 del.icio.us API 都使用這種混合架構。RESTful的實現:RESTful Web 服務的 Java 框架有兩個 Java 框架可以幫助構建 RESTful Web 服務。erome Louvel 和 Dave Pawson 開發的 Restlet(見 參考資料)是輕量級的。它實現針對各種 RESTful 系統的資源、表示、連接器和媒體類型之類的概念,包括 Web 服務。在 Restlet 框架中,客戶端和伺服器都是組件。組件通過連接器互相通信。該框架最重要的類是抽象類 Uniform 及其具體的子類 Restlet,該類的子類是專用類,比如 Application、Filter、Finder、Router 和 Route。這些子類能夠一起處理驗證、過濾、安全、數據轉換以及將傳入請求路由到相應資源等操作。Resource 類生成客戶端的表示形式。JSR-311是 Sun Microsystems 的規范,可以為開發 RESTful Web 服務定義一組 Java API。Jersey是對 JSR-311 的參考實現。JSR-311 提供一組注釋,相關類和介面都可以用來將 Java 對象作為 Web 資源展示。該規范假定 HTTP 是底層網路協議。它使用注釋提供 URI 和相應資源類之間的清晰映射,以及 HTTP 方法與 Java 對象方法之間的映射。API 支持廣泛的 HTTP 實體內容類型,包括 HTML、XML、JSON、GIF、JPG 等。它還將提供所需的插件功能,以允許使用標准方法通過應用程序添加其他類型。RESTful的實現:構建 RESTful Web 服務的多層架構RESTful Web 服務和動態 Web 應用程序在許多方面都是類似的。有時它們提供相同或非常類似的數據和函數,盡管客戶端的種類不同。例如,在線電子商務分類網站為用戶提供一個瀏覽器界面,用於搜索、查看和訂購產品。如果還提供 Web 服務供公司、零售商甚至個人能夠自動訂購產品,它將非常有用。與大部分動態 Web 應用程序一樣,Web 服務可以從多層架構的關注點分離中受益。業務邏輯和數據可以由自動客戶端和 GUI 客戶端共享。惟一的不同點在於客戶端的本質和中間層的表示層。此外,從數據訪問中分離業務邏輯可實現資料庫獨立性,並為各種類型的數據存儲提供插件能力。圖1 展示了自動化客戶端,包括 Java 和各種語言編寫的腳本,這些語言包括 Python、Perl、Ruby、PHP 或命令行工具,比如 curl。在瀏覽器中運行且作為 RESTful Web 服務消費者運行的 Ajax、Flash、JavaFX、GWT、博客和 wiki 都屬於此列,因為它們都代表用戶以自動化樣式運行。自動化 Web 服務客戶端在 Web 層向 Resource Request Handler 發送 HTTP 響應。客戶端的無狀態請求在頭部包含方法信息,即 POST、GET、PUT 和 DELETE,這又將映射到 Resource Request Handler 中資源的相應操作。每個請求都包含所有必需的信息,包括 Resource Request Handler 用來處理請求的憑據。從Web 服務客戶端收到請求之後,Resource Request Handler 從業務邏輯層請求服務。Resource Request Handler 確定所有概念性的實體,系統將這些實體作為資源公開,並為每個資源分配一個惟一的 URI。但是,概念性的實體在該層是不存在的。它們存在於業務邏輯層。可以使用 Jersey 或其他框架(比如 Restlet)實現 Resource Request Handler,它應該是輕量級的,將大量職責工作委託給業務層。Ajax 和 RESTful Web 服務本質上是互為補充的。它們都可以利用大量 Web 技術和標准,比如 HTML、JavaScript、瀏覽器對象、XML/JSON 和 HTTP。當然也不需要購買、安裝或配置任何主要組件來支持 Ajax 前端和 RESTful Web 服務之間的交互。RESTful Web 服務為 Ajax 提供了非常簡單的 API 來處理伺服器上資源之間的交互。圖1 中的 Web 瀏覽器客戶端作為 GUI 的前端,使用表示層中的 Browser Request Handler 生成的 HTML 提供顯示功能。Browser Requester Handler 可以使用 MVC 模型(JSF、Struts 或 Spring 都是 Java 的例子)。它從瀏覽器接受請求,從業務邏輯層請求服務,生成表示並對瀏覽器做出響應。表示供用戶在瀏覽器中顯示使用。表示不僅包含內容,還包含顯示的屬性,比如 HTML 和 CSS。 業務規則可以集中到業務邏輯層,該層充當表示層和數據訪問層之間的數據交換的中間層。數據以域對象或值對象的形式提供給表示層。從業務邏輯層中解耦 Browser Request Handler 和 Resource Request Handler 有助於促進代碼重用,並能實現靈活和可擴展的架構。此外,由於將來可以使用新的 REST 和 MVC 框架,實現它們變得更加容易,無需重寫業務邏輯層。數據訪問層提供與數據存儲層的交互,可以使用 DAO 設計模式或者對象-關系映射解決方案(如 Hibernate、OJB 或 iBATIS)實現。作為替代方案,業務層和數據訪問層中的組件可以實現為 EJB 組件,並取得 EJB 容器的支持,該容器可以為組件生命周期提供便利,管理持久性、事務和資源配置。但是,這需要一個遵從 Java EE 的應用伺服器(比如 JBoss),並且可能無法處理 Tomcat。該層的作用在於針對不同的數據存儲技術,從業務邏輯中分離數據訪問代碼。數據訪問層還可以作為連接其他系統的集成點,可以成為其他 Web 服務的客戶端。數據存儲層包括資料庫系統、LDAP 伺服器、文件系統和企業信息系統(包括遺留系統、事務處理系統和企業資源規劃系統)。使用該架構,您可以開始看到 RESTful Web 服務的力量,它可以靈活地成為任何企業數據存儲的統一 API,從而向以用戶為中心的 Web 應用程序公開垂直數據,並自動化批量報告腳本。什麼是REST:結束語REST 描述了一個架構樣式的互聯系統(如 Web 應用程序)。REST 約束條件作為一個整體應用時,將生成一個簡單、可擴展、有效、安全、可靠的架構。由於它簡便、輕量級以及通過 HTTP 直接傳輸數據的特性,RESTful Web 服務成為基於 SOAP 服務的一個最有前途的替代方案。用於 web 服務和動態 Web 應用程序的多層架構可以實現可重用性、簡單性、可擴展性和組件可響應性的清晰分離。Ajax 和 RESTful Web 服務本質上是互為補充的。
㈣ java的spring-restful介面怎麼獲取客戶端ip
@RequestMapping(value="")
publicvoidtest(HttpServletRequest裂納request){
握源梁段運Stringip=request.getRemoteAddr();
}
㈤ JAVA中怎樣把後台的值傳到前台 例如:
以微信小程序為例,java後台與微信小程序前台頁面,弊氏主要是通過restful介面進行交互,詳細步驟:
1、之前已經探討了如何快速創建springboot的項目,可以參考下面的地址,主要是修改pom.xml文件,之前引用了spring-boot-starter,這里因為是要創建restFul介面,所以需要引用spring-boot-starter-web。
㈥ Restful Api 路徑定義規則
前言
目前網站上已經有很多關於如何去寫restful風格的api的文章,主要說明下我接下來寫的關於api寫法的連載文章的目的,一個是主要把自己在這方面的心得分享給大家,二是希望大家也能給出更好的意見棚乎輪、建議,歡迎在看文章後討論。
本篇頃弊文章主要說下介面路徑該怎麼定義,一個URL地址的可讀性對於調用者和維護者都是很重要的,當你規劃好URL該怎麼定義後,這也決定了java項目中你的controller類的劃分,我們知道一個HTTP介面通常主要結構為: 協議://域名/應用content path/自定義路徑?查詢參數,例如: https://api.zhuma.com/zm-back/users?pageSize=10&pageNum=1 代表築碼網後台管理用戶功能的API。
那我們到底該怎麼定義我們的API URL會更好一些呢?下面給出幾點建議。
若域名無法區分出是api還是頁面功能的時候,api路徑後面統一加/api用於區分是介面服務。
1. https://back.zhuma.com/api/login
2. https://api-back.zhuma.com/login
上面舉例中back代表著後台管理的意思,所以想要進入後台管理頁面路徑應該為: https://back.zhuma.com 前台當然要留給 https://www.zhuma.com ,在域名使用中我們可以利用三級域名對我們整體系統大的功能或應用進行很好的劃分,正是因此,我們看到舉例中路徑上並沒有加上應用的content path。
★ 備注
建議通過域名去區分api,也就是舉例中2的方式
在開發中對於多環境開發我們也可以通過域名來區分,例如:
https://fe-api-back.zhuma.com 為聯調環境,
https://qa-api-back.zhuma.com 為QA測試環境,
https://stg-api-back.zhuma.com 為模擬環境,
https://api-back.zhuma.com 為生產環境等。
定義自定義路徑部分時,使用名詞的復數形式定義一個資源,如若有動鏈信詞詞性在url中考慮以下劃線區分。
基本操作
GET /users # 獲取用戶列表
GET /users/{userId} # 查看某個具體的用戶信息
POST /users # 新建一個用戶
PUT /users/{userId} # 全量更新某一個用戶信息
PATCH /users/{userId} # 選擇性更新某一個用戶信息
DELETE /users/{userId} # 刪除某一個用戶
批量操作
POST /users/_mget # 批量獲取多個用戶
POST /users/_mcreate # 批量創建多個用戶
POST /users/_mupdate # 批量更新多個用戶
POST /users/_mdelete # 批量刪除多個用戶
POST /users/_bulk # 批量功能組裝(後面會講到)
動詞詞性加入url (原則上此種情況是不被推薦的)
GET /users/_search # 搜索用戶
POST /users/_init # 初化所有用戶
★ 備注
這里可能有人會糾結路徑參數/users/{userId} 是使用userId還是id,畢竟當前資源只有一級,此處不必糾結,原因是:這僅僅是一個後端使用變數而已,不會影響前端的使用,所以我們統一使用userId這種形式定義變數
批量操作時,統一使用POST作為HTTP METHOD,原因是 批量操作參數的數據大小不可控,使用request param可能超過某些瀏覽器對參數的長度限制,實際上,URL不存在參數長度上限的問題,HTTP協議規范沒有對URL長度進行限制,這個限制是特定的瀏覽器及伺服器對它的限制。
這里注意一個小點,URL路徑是對大小寫敏感的,例如:/users 和 /Users 是兩個介面哦,但是我們規定URL全部小寫。
URL區分功能(管理、我的 功能)
上面我們提到的 關於/users 用戶功能的舉例,通常情況下,這其實是一個管理用戶資源的功能的介面,用於表示對用戶這個資源的增刪改查等管理功能。
那 我的 功能是指的什麼呢?
通常來說,是對於前端用戶下的某某資源的說明,我們通常定義為my-開頭。
舉例
GET /my-orders 我的訂單列表
GET /users/{userId}/orders 管理查看某一個用戶下的訂單列表
1. 路徑中多個單詞時,使用中劃線 - 來連接
2. 不允許在路徑中出現大寫字母(查詢參數名稱除外)
3. 介面後省略xxx.do(很多人願意加上.do這種形式,注意我們的每一個url代表的是一個資源哦)
舉例
GET /my-account/profile 獲取我的賬戶的簡要信息
GET /my-notifications 獲取我的消息列表
★ 備注
上面的舉例我們看到,my-account是單數而不是復數形式,這里說明下,在系統中如果明確該信息就是單數,那我們在url定義時也應該使用單數表示。
參考:
Restful Api寫法心得之一《路徑定義篇》
㈦ java restfulapi url 參數前帶冒號是什麼意思
我的理解這個是變化的孝則老ID,比如用戶ID是1 那麼請求的盯轎url就是/1/name;restful 標准里有說這個,忘記咋說了,你可巧升以看下,restful標準的獲取資源的url定義
㈧ springmvc怎麼實現restful
restful 是一個風格而不是一個標准,在springmvc web開發中可以說是
興起於Rails的一種優雅的URI表述方式,是資源的狀態和狀態轉移的描述。
springmvc rest 實現
springmvc的resturl是通過@RequestMapping 及@PathVariable
annotation提供的,通過如@RequestMapping(value="/blog
/{id}",method=RequestMethod.DELETE)即可處理/blog/1 的delete請求.
Java代碼
@RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)
public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {
blogManager.removeById(id);
return new ModelAndView(LIST_ACTION);
}
@RequestMapping @PathVariable如果URL中帶參數,則配合使用,如
Java代碼
@RequestMapping(value="/blog/並燃{blogId}/message/{msgId}",method=RequestMethod.DELETE)
public ModelAndView delete(@PathVariable("blogId") Long blogId,@PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) {
}
spring rest配置指南
1. springmvc web.xml配置
Xml代碼
<!-- 該
servlet為tomcat,jetty等容器提供,將靜態資源映射從/改為/static/目錄,如原來訪問 http://localhost
/foo.css ,現在http://localhost/static/foo.css -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</陸蔽虛servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- URL重寫filter,用於將訪問靜態資源http://localhost/foo.css 轉為http://localhost/早燃static/foo.css -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confReloadCheckInterval</param-name>
<param-value>60</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 覆蓋default servlet的/, springmvc servlet將處理原來處理靜態資源的映射 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 瀏覽器不支持put,delete等method,由該filter將/blog?_method=delete轉換為標準的http delete方法 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
2. webapp/WEB-INF/springmvc-servlet.xml配置,使用如下兩個class激活@RequestMapping annotation
Java代碼
<bean class="org.springframework.web.servlet.mvc.annotation."/>
<bean class="org.springframework.web.servlet.mvc.annotation."/>
完整配置
Java代碼
<beans default-autowire="byName" >
<!-- 自動搜索@Controller標注的類 -->
<context:component-scan base-package="com.**.controller"/>
<bean class="org.springframework.web.servlet.mvc.annotation."/>
<bean class="org.springframework.web.servlet.mvc.annotation."/>
<!-- Default ViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/>
<!-- Mapping exception to the handler view -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.">
<!-- to /commons/error.jsp -->
<property name="defaultErrorView" value="/commons/error"/>
<property name="exceptionMappings">
<props>
</props>
</property>
</bean>
</beans>
3. Controller編寫
Java代碼
/**
* @RequestMapping("/userinfo") 具有層次關系,方法級的將在類一級@RequestMapping之一,
* 如下面示例, 訪問方法級別的@RequestMapping("/new"),則URL為 /userinfo/new
*/
@Controller
@RequestMapping("/userinfo")
public class UserInfoController extends BaseSpringController{
//默認多列排序,example: username desc,createTime asc
protected static final String DEFAULT_SORT_COLUMNS = null;
private UserInfoManager userInfoManager;
private final String LIST_ACTION = "redirect:/userinfo";
/**
* 通過spring自動注入
**/
public void setUserInfoManager(UserInfoManager manager) {
this.userInfoManager = manager;
}
/** 列表 */
@RequestMapping
public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {
PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);
//pageRequest.getFilters(); //add custom filters
Page page = this.userInfoManager.findByPageRequest(pageRequest);
savePage(page,pageRequest,request);
return new ModelAndView("/userinfo/list","userInfo",userInfo);
}
/** 進入新增 */
@RequestMapping(value="/new")
public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
return new ModelAndView("/userinfo/new","userInfo",userInfo);
}
/** 顯示 */
@RequestMapping(value="/{id}")
public ModelAndView show(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
return new ModelAndView("/userinfo/show","userInfo",userInfo);
}
/** 編輯 */
@RequestMapping(value="/{id}/edit")
public ModelAndView edit(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
return new ModelAndView("/userinfo/edit","userInfo",userInfo);
}
/** 保存新增 */
@RequestMapping(method=RequestMethod.POST)
public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
userInfoManager.save(userInfo);
return new ModelAndView(LIST_ACTION);
}
/** 保存更新 */
@RequestMapping(value="/{id}",method=RequestMethod.PUT)
public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
bind(request,userInfo);
userInfoManager.update(userInfo);
return new ModelAndView(LIST_ACTION);
}
/** 刪除 */
@RequestMapping(value="/{id}",method=RequestMethod.DELETE)
public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {
userInfoManager.removeById(id);
return new ModelAndView(LIST_ACTION);
}
/** 批量刪除 */
@RequestMapping(method=RequestMethod.DELETE)
public ModelAndView batchDelete(@RequestParam("items") Long[] items,HttpServletRequest request,HttpServletResponse response) {
for(int i = 0; i < items.length; i++) {
userInfoManager.removeById(items[i]);
}
return new ModelAndView(LIST_ACTION);
}
}
上面是rapid-framework 新版本生成器生成的代碼,以後也將應用此規則,rest url中增刪改查等基本方法與Controller的方法映射規則
Java代碼
/userinfo => index()
/userinfo/new => _new()
/userinfo/{id} => show()
/userinfo/{id}/edit => edit()
/userinfo POST => create()
/userinfo/{id} PUT => update()
/userinfo/{id} DELETE => delete()
/userinfo DELETE => batchDelete()
注(不使用 /userinfo/add => add() 方法是由於add這個方法會被maxthon瀏覽器當做廣告鏈接過濾掉,因為包含ad字元)
4. jsp 編寫
Html代碼
<form:form action="${ctx}/userinfo/${userInfo.userId}" method="put">
</form:form>
生成的html內容如下, 生成一個hidden的_method=put,並於web.xml中的HiddenHttpMethodFilter配合使用,在服務端將post請求改為put請求
Java代碼
<form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post">
<input type="hidden" name="_method" value="put"/>
</form>
另外一種方法是你可以使用ajax發送put,delete請求.
5. 靜態資源的URL重寫
如上我們描述,現因為將default servlet映射至/static/的子目錄,現我們訪問靜態資源將會帶一個/static/前綴.
如 /foo.gif, 現在訪問該文件將是 /static/foo.gif.
那如何避免這個前綴呢,那就是應用URL rewrite,現我們使用 http://tuckey.org/urlrewrite/, 重寫規則如下
Xml代碼
<urlrewrite>
<!-- 訪問jsp及jspx將不rewrite url,其它.js,.css,.gif等將重寫,如 /foo.gif => /static/foo.gif -->
<rule>
<condition operator="notequal" next="and" type="request-uri">.*.jsp</condition>
<condition operator="notequal" next="and" type="request-uri">.*.jspx</condition>
<from>^(/.*\..*)$</from>
<to>/static$1</to>
</rule>
</urlrewrite>
另筆者專門寫了一個 RestUrlRewriteFilter來做同樣的事件,以後會隨著rapid-framework一起發布. 比這個更加輕量級.
並且該代碼已經貢獻給spring,不知會不會在下一版本發布
在線DEMO地址: http://demo.rapid-framework.org.cn:8080/springmvc_rest_demo/userinfo
㈨ java有哪些好用的REST框架
1 Dropwizard
Dropwizard 提供了穩定成熟的Java庫, 並封裝成一個簡單的輕量級的包。
Dropwizard 介於框架和庫之間。它提供了一個開發web應用程序的全部所需。由於內置模塊化,一個應用程序可以保持小而精乾的特點,減少開發改慎和維護的時間,減少負擔。
Dropwizard 使用已有的 Jetty HTTP 庫,嵌入到你的項目中,無需外部的server。所有的Dropwizard項目都有一個 main 方法來管理內建的 HTTP server.
2 Jersey
Jersey RESTful 框架是開源的RESTful框架, 實現了JAX-RS (JSR 311 & JSR 339) 規范。它擴展了JAX-RS 參考實現, 提供了更多的特性和工具, 可以進一步地簡化 RESTful service 和 client 開發。盡管相對年輕,它已經是一個產品級的 RESTful service 和 client 框架。
3 Ninja Web Framework
Ninja Web Framework是全棧的 java web framework。穩定, 快速, 可靠, 產品級.
它提供了開發,測試,發布,維護 RESTful web應用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).
就像 DropWizzard, Ninja Web Framework 是一個集成備殲跡的軟體棧。你不必建立你自己的,只需使用 Maven archetype生成一個新的項目,導入到IDE中就可以開始編碼了。
4
Play Framework
使用Play Framework 很容易地創建,構仿並建和發布 web 應用程序,支持 Java & Scala。它使用Akka, 基於一個輕量級的無狀態的架構。它應該應用於大規模地低CPU和內存消耗的應用。
5
Spark Framework
不要和 Apache 的大數據框架 Spark 弄混, 這里的 Spark 框架是一個輕量級的 Java web 框架,用來進行快速的開發(50% Spark用戶使用 Spark 創建 REST APIs)。 它受 Ruby 框架 Sinatra 啟發。
它有一個不到1M的最小化的內核, 提供了所有基本的特性, 用來構建 RESTful 或者傳統的 web 應用程序。
㈩ 如何使用RestTemplate訪問restful服務
一. 什麼是RestTemplate
傳統情況下在Java代碼里訪問restful服務,一般使用Apache的HttpClient。不過此種方法使用起來太過繁瑣。spring提供了一種簡單便捷的模板類來進行操作,這就是RestTemplate。
二、舉個例子。 //請求地址
String url = "http://localhost:8080/testPost";
//入參
RequestBean requestBean = new RequestBean();
requestBean.setTest1("1");
requestBean.setTest2("2");
requestBean.setTest3("3");
RestTemplate restTemplate = new RestTemplate();
ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);
從這個例子可以看出,使用restTemplate訪問restful介面非常的簡單粗暴無腦。(url,
requestMap, ResponseBean.class)這三個參數分別代表 請求地址、請求參數、HTTP響應轉換被轉換成的對象類型。
RestTemplate方法的名稱遵循命名約定,第一部分指出正在調用什麼HTTP方法,第二部分指示返回的內容。本例中調用了restTemplate.postForObject方法,post指調用了HTTP的post方法,Object指將HTTP響應轉換為您選擇的對象類型。
三.手動指定轉換器(HttpMessageConverter)
我們知道,調用reseful介面傳遞的數據內容是json格式的字汪團御符串,返回的響應也是json格式的字元串。然而restTemplate.postForObject方法的請求參數RequestBean和返回參數ResponseBean卻都是java類。是RestTemplate通過HttpMessageConverter自動幫我們做了轉換的操作。
默認情況下RestTemplate自動幫我們注冊了一組HttpMessageConverter用來處理一些不同的contentType的請求。
如StringHttpMessageConverter來處理text/plain;來處理application/json;來處理application/xml。
你可以在org.springframework.http.converter包下找到所有spring幫我們實現好的轉換器。
如果現有的轉換器不能滿足你的需求,你還可以實現org.springframework.http.converter.HttpMessageConverter介面自己寫一個。
四.設置底層連接方式
要創建一個RestTemplate的實例,您可以簡單地調用默認的無參數構造函數。這將使用java.NET包中的標准Java類作為底層實現來創建HTTP請求。
但很多時候我們需要像傳統的HttpClient那樣設置HTTP請求的一些屬性。RestTemplate使用了一種很偷懶的方式實現了這個需求,那就是直接使用一個HttpClient作為底層實現......
五.設置或橋攔截器(ClientHttpRequestInterceptor)
有時候我們需要對請求做一些通用的攔截設置,這就可以使用攔截器進行處困岩理。攔截器需要我們實現org.springframework.http.client.ClientHttpRequestInterceptor介面自己寫。
以上是如何使用RestTemplate方便快捷的訪問restful介面。其實RestTemplate的功能非常強大