一引言:java
之前一說到Web Service你們確定會聯想到SOAP,如今提到Web Service你們立刻聯想到RESTful,由於RESTful Web Service已經深得人心,獲得重用,相比笨重的SOAP愈來愈流行了,那麼什麼是RESTful Web Service?REST英文全稱爲Representational State Transfer,翻譯爲中文即表徵狀態轉移,是一種軟件架構風格,REST關鍵原則爲:spring
爲全部「事物」定義IDjson
將全部事物連接在一塊兒網絡
使用標準方法架構
資源多重表述mvc
無狀態通訊app
RESTful Web Service 是一個使用HTTP並遵循REST原則的Web服務。它從三個方面資源進行定義:spa
URI,好比:http://example.com/resources/。.net
Web Service接受與返回的互聯網媒體類型,好比:JSON,XML等。翻譯
Web Service在該資源上所支持的一系列請求方法(好比:POST,GET,PUT或DELETE)。
HTTP 請求方法在RESTful Web 服務中的典型應用 |
||||
資源 |
GET |
PUT |
POST |
DELETE |
一組資源的URI,好比http://example.com/resources/ |
列出 URI,以及該資源組中每一個資源的詳細信息(後者可選)。 |
使用給定的一組資源替換當前整組資源。 |
在本組資源中建立/追加一個新的資源。該操做每每返回新資源的URL。 |
刪除整組資源。 |
單個資源的URI,好比http://example.com/resources/142 |
獲取指定的資源的詳細信息,格式能夠自選一個合適的網絡媒體類型(好比:XML、JSON等) |
替換/建立指定的資源。並將其追加到相應的資源組中。 |
把指定的資源當作一個資源組,並在其下建立/追加一個新的元素,使其隸屬於當前資源。 |
刪除指定的元素。 |
二SpringMVC對RESTful Web Service的支持:
1.將URI和HTTP請求方法映射到JAVA處理方法,並將JAVA方法處理結果返回給HTTP請求者(對應資源定義I和III)。
@RequestMapping
這是最重要的一個註解,用於處理HTTP請求地址映射,可用於類或方法上,用於類上時表示類中的全部響應請求的方法都是以該地址做爲父路徑,在Spring中,通常一個Controller類處理一種資源,因此每一個Controller類都會加@RequestMapping註解。
經常使用屬性:
value:指定請求的地址
method:指定請求的method類型, GET、POST、PUT、DELETE等
params:指定request中必須包含某些參數值是,才讓該方法處理
1
2
3
4
5
6
7
8
9
10
11
|
@RequestMapping
(value =
"/contact"
)
public
class
ContactController {
final
Logger logger = LoggerFactory.getLogger(ContactController.
class
);
@Autowired
private
ContactService contactService;
@RequestMapping
(value =
"/listdata"
, method = RequestMethod.GET)
@ResponseBody
public
Contacts listData() {
return
new
Contacts(contactService.findAll());
}
|
@PathVariable
映射URL路徑裏面的參數
1
2
3
4
5
|
@RequestMapping
(value =
"/{id}"
, method = RequestMethod.GET)
@ResponseBody
public
Contact findContactById(
@PathVariable
Long id) {
return
contactService.findById(id);
}
|
2.將接收的數據(如JSON格式數據)轉換爲JAVA對象和將JAVA對象轉換爲請求格式(如XML)的數據(對應資源定義II)。
@RequestBody
用於讀取Request請求的body數據,使用Bean配置中的 HttpMessageConverter 將數據轉換爲JAVA對象,再把對象綁定到 controller中方法的參數上。
1
2
3
4
5
6
7
8
|
@RequestMapping
(value =
"/"
, method = RequestMethod.POST)
@ResponseBody
public
Contact create(
@RequestBody
Contact contact) {
logger.info(
"Creating contact: "
+ contact);
contactService.save(contact);
logger.info(
"Contact created successfully with info: "
+ contact);
return
contact;
}
|
@ResponseBody
用於將Controller中方法返回的對象,使用Bean配置中的 HttpMessageConverter 轉換爲指定格式數據,再寫入到Response對象的body數據區。
1
2
3
4
5
|
@RequestMapping
(value =
"/listdata"
, method = RequestMethod.GET)
@ResponseBody
public
Contacts listData() {
return
new
Contacts(contactService.findAll());
}
|
HttpMessageConverter配置示例:
1
2
3
4
5
6
7
8
9
10
|
<
mvc:annotation-driven
>
<
mvc:message-converters
>
<
bean
class
=
"org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"
/>
<
bean
class
=
"org.springframework.http.converter.xml.MarshallingHttpMessageConverter"
>
<
property
name
=
"marshaller"
ref
=
"castorMarshaller"
/>
<
property
name
=
"unmarshaller"
ref
=
"castorMarshaller"
/>
</
bean
>
</
mvc:message-converters
>
</
mvc:annotation-driven
>
|
默認狀況下Spring已經啓用了不少HttpMessageConverter,只要將他們的實如今類路徑下便可,無需再配置。
ByteArrayHttpMessageConverter – converts byte arrays
StringHttpMessageConverter – converts Strings
ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream
SourceHttpMessageConverter – converts javax.xml.transform.Source
FormHttpMessageConverter – converts form data to/from a MultiValueMap<String, String>.
Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath)
MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath)
MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath)
AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath)
RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)
Spring作得太貼心了,因此開發者簡單配置就搞定RESTful WebService功能,而後就可專一於業務邏輯實現上。
本文出自 「力量來源於赤誠的愛!」 博客,請務必保留此出處http://stevex.blog.51cto.com/4300375/1355154