1. 程式人生 > >使用SpringMVC 實現RESTful,並解決PUT,DELETE請求無法提交表單資料的問題

使用SpringMVC 實現RESTful,並解決PUT,DELETE請求無法提交表單資料的問題

瞭解RESTful,使用SpringMVC 實現RESTful

關於REST: 1.表述性狀態轉移,是web服務的一種架構風格,是一種思想,而非標準或軟體。 2. 通常基於使用HTTP,URI,XML、JSON、HTML這些現廣泛流行的協議。 3.屬於輕量級(使用時沒有太多依賴,耦合性低),跨平臺、跨語言的架構設計。 REST式(RESTful)的web服務 1.Web service的兩種標準:JAX-WS 、JAX-RS 2.REST式的web服務是ROA(面向資源的架構)、執行JAX-RS標準 REST架構原則 1.同一資源具有多種表現形式,比如xml,json; 2.每個資源具有唯一資源識別符號 3.操作無狀態(伺服器只處理當前request,利用pool技術提高穩定性和效能) 4.符合REST原則的架構方式即為 RESTful URI和URL

uri http://example.com/users/ url http://example.com/users/{user} ,帶參 URI範圍大於URL。 經驗告訴我們,uri和url在定義時限定不要使用大寫字母,使用中線 - 代替下劃線_,引數列表應該被encode過 注:[https 和http區別,https屬於加密傳輸,更安全,需要收費] 資源的四種操作CRUD RESTful中要求:獲取資源 GET,建立資源 POST,修改資源狀態 PUT,刪除資源 DELETE。同http請求方法。 demo: 之前的操作: http://127.0.0.1/user/query/1 GET 根據使用者id查詢使用者資料
http://127.0.0.1/user/save
POST 新增使用者 http://127.0.0.1/user/update POST 修改使用者資訊 http://127.0.0.1/user/delete GET/POST 刪除使用者資訊 每次都對操作做描述,這是沒有必要的 RESTful用法: http://127.0.0.1/user/1 GET 根據使用者id查詢使用者資料 http://127.0.0.1/user POST 新增使用者 http://127.0.0.1/user PUT 修改使用者資訊 http://127.0.0.1/user DELETE 刪除使用者資訊 REST響應設計 遵循原則

統一說法,上面的為業務狀態碼,下面的那個Status響應狀態碼

http響應狀態碼 在這裡插入圖片描述

SpringMVC實現RESTful服務

在這裡插入圖片描述 例項展示:`//restful的應用

@RequestMapping("new/user")
@Controller
public class NewUserController {
    @Autowired
    private UserService userService;
    // 根據使用者id查詢使用者資訊 運用restful
    //測試 http://127.0.0.1/rest/new/user/100 返回404
    //    http://127.0.0.1/rest/new/user/1 以json形式返回具體的使用者資訊
    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<User> queryUserById(@PathVariable("id") Long id) {
        try {
            User user = this.userService.queryUserById(id);
            if (null == user) {
                // 資源不存在,響應404
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
            }
            // 資源存在,響應200
            // return ResponseEntity.status(HttpStatus.OK).body(user);
            return ResponseEntity.ok(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //查詢失敗,返回500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    /**
     * 新增使用者
     * 
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<Void> saveUser(User user) {//響應的為void型別,響應可用bulid()
        try {
            Boolean bool = this.userService.saveUser(user);
            if (bool) {
                // 新增成功,響應201
                return ResponseEntity.status(HttpStatus.CREATED).build();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 新增失敗,響應500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    /** 
     * 更新使用者  
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.PUT)//預設情況下put請求無法提交表單資料,故應在web.xml中配置過濾器
    public ResponseEntity<Void> updateUser(User user) {
        try {
            Boolean bool = this.userService.updateUser(user);
            if (bool) {
                // 更新成功,響應204
                return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 新增失敗,響應500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    /**
     * 刪除使用者  
     * 
     * @param id
     * @return
     */
    @RequestMapping(method = RequestMethod.DELETE)
    //需要在web.xml中新增過濾器解決DELETE請求無法提交表單資料的問題
    public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) {
        try {
            if (id.longValue() == 0) {
                // 沒有傳遞引數,響應狀態碼400
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
            }
            Boolean bool = this.userService.deleteUser(id);
            if (bool) {
                // 刪除成功,響應204
                return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 刪除失敗,響應500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

}`

web.xml中配置:

<!-- 解決PUT請求無法提交表單資料的問題 -->
	<filter>
		<filter-name>HttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 
		將POST請求轉化為DELETE或者是PUT
		要用_method指定真正的請求方法
	 -->
	<filter>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	

`