搭建Restful風格WebServcie
目錄
1.Restful風格介紹
表現層狀態轉換(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士於2000年在他的博士論文[1] 中提出來的一種全球資訊網軟體架構風格,目的是便於不同軟體/程式在網路(例如網際網路)中互相傳遞資訊。表現層狀態轉換是根基於超文字傳輸協議(HTTP)之上而確定的一組約束和屬性,是一種設計提供全球資訊網絡服務的軟體構建風格。匹配或兼容於這種架構風格(簡稱為 REST 或 RESTful)的網路服務,允許客戶端發出以統一資源識別符號訪問和操作網路資源的請求,而與預先定義好的無狀態操作集一致化。因此表現層狀態轉換提供了在網際網路絡的計算系統之間,彼此資源可互動使用的協作性質(interoperability)。相對於其它種類的網路服務,例如 SOAP服務則是以本身所定義的操作集,來訪問網路上的資源。
目前在三種主流的Web服務實現方案中,因為REST模式與複雜的SOAP和XML-RPC相比更加簡潔,越來越多的web服務開始採用REST風格設計和實現。例如,Amazon.com提供接近REST風格的Web服務執行圖書查詢;雅虎提供的Web服務也是REST風格的。
1.1傳統的請求
1.2基於restful風格的請求:
1.3注意事項
1. 針對一個一個url地址的訪問,還需要指定請求方式:
2. 後臺寫方法,且指定這個方法處理的是什麼型別的請求,如:get、post、put、delete
1.4風格約定:
只是約定規範格式
GET用來獲取資源, select…. 操作
POST用來新建資源,insert…….. 操作
PUT用來更新資源, update….. 操作
DELETE用來刪除資源,delete….. 操作
2.常用的restful框架
3.Apache-cxf框架
這裡我用的apache-cxf的框架,其他框架不是很熟。
3.1專案架構圖
我們先搭建測試環境,這裡關注Server和Client即可
3.2pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fengling</groupId> <artifactId>06jaxrs_server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>restful風格的服務端</name> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </project>
3.3服務端介面
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.jws.WebService;
@Path("/userService")
@Produces("*/*")
@WebService
public interface IUserService {
@POST //新增
@Path("/user")
@Consumes({"application/xml","application/json"})
public void saveUser(User user);
@PUT //更改
@Path("/user")
@Consumes({"application/xml","application/json"})
public void updateUser(User user);
@DELETE //刪除
@Path("/user/{id}")
@Consumes({"application/xml","application/json"})
public void deleteUser(@PathParam("id")Integer id);
@POST//獲取
@Path("/user/all")
@Consumes({"application/xml","application/json"})
public List<User> findAllUser();
@POST //獲取
@Path("/user/{id}")
@Consumes({"application/xml","application/json"})
public User findById(@PathParam("id")Integer id);
}
3.4釋出服務
package com.fengling.server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import com.fengling.service.UserServiceImpl;
public class Server {
public static void main(String[] args) {
//獲取本機ip地址,當我們遠端訪問的時候可以使用
//InetAddress address = InetAddress.getLocalHost();
//String hostAddress = address.getHostAddress();
//System.out.println(hostAddress);
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
//"http://localhost:3000/ws/userService/user"
//設定服務地址
factory.setAddress("http://localhost:3000/ws/");
//遠端訪問地址
//factory.setAddress("http://" +hostAddress+":12345/reLo");
//設定服務類
factory.setServiceBean(new UserServiceImpl());
//釋出
factory.create();
System.out.println("釋出成功。。。。。");
}
}
3.5客戶端
import java.util.Collection;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import org.junit.Test;
import com.fengling.domain.User;
public class Client {
@Test
public void testUpdate() throws Exception {
User user = new User(100,"宋江haosd","");
WebClient
.create("http://localhost:3000/ws/userService/user")
.type(MediaType.APPLICATION_JSON)
.put(user);
}
@Test
public void testDelete() throws Exception {
User user = new User(100,"宋江","");
WebClient
.create("http://localhost:3000/ws/userService/user/1")
.type(MediaType.APPLICATION_JSON)
.delete();
}
@Test
public void testInsert() throws Exception {
User user = new User(100,"宋","");
//通過WebClient工具類就可以直接通過http訪問服務介面
WebClient
.create("http://localhost:3000/ws/userService/user")// 服務介面地址
.type(MediaType.APPLICATION_JSON) // 請求的資料格式: json
//.type(MediaType.APPLICATION_XML) // 請求的資料格式: json
.post(user);
}
@Test
public void testGet() throws Exception {
WebClient
.create("http://localhost:3000/ws/userService/user/1")
.accept(MediaType.APPLICATION_XML)// 響應的資料格式xml
.get(User.class);
}
@Test
public void testGetAll() throws Exception {
Collection<? extends User> collection =
WebClient
.create("http://localhost:3000/ws/userService/user")
.accept(MediaType.APPLICATION_XML)// 響應的資料格式xml
.getCollection(User.class);
}
}