使用SpringMVC 實現RESTful,並解決PUT,DELETE請求無法提交表單資料的問題
阿新 • • 發佈:2018-12-13
瞭解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
http響應狀態碼
SpringMVC實現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>
`