1. 程式人生 > >RESTful Web Service

RESTful Web Service

RESTful 是什麼

       rest是一種設計風格。它不是一種標準,也不是一種軟體,而是一種思想。

       restful即是rest式,restful web service 是一種常見的rest應用,是準守rest風格的web服務。


REST 架構的主要原則




資源操作


REST介面定義


REST介面響應設計

指定響應的屬性欄位




http響應狀態碼



SpringMVC實現RESTful服務

springMVC原生支援Rest風格:註解:@RequestMapping、@ResponseBody、@PathVariable

以下以user作為資源為例:


1、查詢資源

@RequestMapping("new/user")
@Controller
public class UserController{}
//PathVariable  獲取上面的id
    @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();
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }
2、新增資源
/**
     * 新增使用者
     * 
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<Void> saveUser(User user) {
        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();
    }


3、更新資源

/**
     * 更新使用者
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.PUT)
    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();
    }


需要在web.xml中新增過濾器解決PUT請求無法提交表單資料的問題:

<!-- 解決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>


4、刪除資源
/**
     * 刪除使用者
     * 
     * @param id
     * @return
     */
    @RequestMapping(method = RequestMethod.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();
    }


delete請求在前臺還是使用post,經過過濾器轉化為 DELETE

<!-- 
		將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>