其實請求和傳參這些知識屬於SpringMVC 不過這也屬於必須掌握的知識,鞏固基礎吧 GET請求: 以第一篇文章自動的方式創建SpringBoot項目: 然後新建Controller: 測試: 另一種寫法: 測試: 成功!但是,如果我非要POST訪問,結果:顯示方法不允許 這個Demo中:需要傳遞的 ...
其實請求和傳參這些知識屬於SpringMVC
不過這也屬於必須掌握的知識,鞏固基礎吧
GET請求:
以第一篇文章自動的方式創建SpringBoot項目:
然後新建Controller:
package org.dreamtech.springboot.controller; import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * Get請求 * * @author Xu Yiqing * */ //RestController=ResponseBody+Controller @RestController public class GetController { private Map<String, Object> params = new HashMap<String, Object>(); /** * 根據Restful協議:參數應該從路徑中獲取 * * @return */ @RequestMapping(path = "/{city_id}/{user_id}", method = RequestMethod.GET) public Object findUser(@PathVariable("city_id") String cityId, @PathVariable("user_id") String userId) { params.clear(); params.put("city_id", cityId); params.put("user_id", userId); return params; } }
測試:
另一種寫法:
/** * 測試GetMapping * * @param from * @param size * @return */ @GetMapping("/page_user") public Object pageUser(int from, int size) { params.clear(); params.put("from", from); params.put("size", size); return params; }
測試:
成功!但是,如果我非要POST訪問,結果:顯示方法不允許
這個Demo中:需要傳遞的參數是page和size,返回from和size,並且page參數預設值為0
/** * 測試預設屬性和參數命名 * * @param from * @param size * @return */ @GetMapping("/page_user2") public Object pageUser2(@RequestParam(defaultValue = "0", name = "page") int from, int size) { params.clear(); params.put("from", from); params.put("size", size); return params; }
測試:
傳參如果是一個Bean(實體類)呢?
我搞一個實體類:
package org.dreamtech.springboot.domain; public class User { private String username; private String password; private Integer age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
如果傳的參數是實體類呢?
/** * Bean傳參註意使用事項: * 1.HTTP請求頭的content-type為application/json * 2.使用@RequestBody註解 * @param user * @return */ @GetMapping("/save_user") public Object saveUser(@RequestBody User user) { params.clear(); params.put("user", user); return params; }
測試:註意以下紅色框中的設置
獲取HTTP頭信息:
@GetMapping("/get_user_agent") public Object getUserAgent(@RequestHeader("User-Agent")String userAgent) { params.clear(); params.put("userAgent",userAgent); return params; }
測試:
雖然我只是用了Get方式作為實例,但是其他的方式都是一致的,只不過使用的註解不一樣:
@PostMapping
@PutMapping
@DeleteMapping
@GetMapping
不過通常情況下只用GET和POST兩種
GET通常用來查詢(Read)
POST通常用來增j加、刪除、修改(Create、Delete、Update)
註意:只是通常,凡事沒有絕對
最後補充一些知識點:
RestController返回的是JSON,那麼封裝JSON的框架有哪些呢?
阿裡的fastjson,谷歌的gson,還有知名的jackson,到底應該選擇哪一種呢?
只從性能上來講,是jackson>fastjson>gson,不過他們各有優點,這也不能說明太多問題
SpringBoot中使用的是jackson
而jackson也有一些註解可以使用:
@GetMapping("/test_json") public Object testJson() { return new User("admin", "123", 18, new Date()); }
修改一下User實體類:
package org.dreamtech.springboot.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; public class User { // 空值不返回 @JsonInclude(Include.NON_NULL) private String username; // JSON不應該封裝password欄位 @JsonIgnore private String password; // 如果希望隱藏欄位可以採用這種方法 @JsonProperty("secret") private Integer age; // 對日期進行格式化顯示:2019-05-02 20:22:04 @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8") private Date createTime; public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public User(String username, String password, Integer age, Date createTime) { super(); this.username = username; this.password = password; this.age = age; this.createTime = createTime; } }
測試: