1. 程式人生 > >搭建Restful風格WebServcie

搭建Restful風格WebServcie

目錄

1.Restful風格介紹

表現層狀態轉換(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士於2000年在他的博士論文[1] 中提出來的一種全球資訊網軟體架構風格,目的是便於不同軟體/程式在網路(例如網際網路)中互相傳遞資訊。表現層狀態轉換是根基於超文字傳輸協議(HTTP)之上而確定的一組約束和屬性,是一種設計提供全球資訊網絡服務的軟體構建風格。匹配或兼容於這種架構風格(簡稱為 REST 或 RESTful)的網路服務,允許客戶端發出以統一資源識別符號訪問和操作網路資源的請求,而與預先定義好的無狀態操作集一致化。因此表現層狀態轉換提供了在網際網路絡的計算系統之間,彼此資源可互動使用的協作性質(interoperability)。相對於其它種類的網路服務,例如 SOAP服務則是以本身所定義的操作集,來訪問網路上的資源。

目前在三種主流的Web服務實現方案中,因為REST模式與複雜的SOAPXML-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框架

Restx

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