HTTP協議的四種傳參方式
HTTP協議組成 | 協議內容示例 | 對應Spring注解 |
---|---|---|
path info傳參 | /articles/12 (查詢id為12的文章,12是參數) | @PathVariable |
URL Query String傳參 | /articles?id=12 | @RequestParam |
Body 傳參 | Content-Type: multipart/form-data | @RequestParam |
Body 傳參 | Content-Type: application/json,或其他自定義格式 | @RequestBody |
Headers 傳參 | @RequestHeader |
path info傳參
請求路徑:http://localhost:8080/rest/articles/1
/**
* 獲取一篇Article,使用GET方法,根據id查詢一篇文章
* restful注意:
* 請求路徑要是復數的,加上s
* 又因為是{id},所以要接收參數值用@PathVariable("id")
* method = RequestMethod.GET:必須要求是get請求
*/
//@RequestMapping(value = "/articles/{id}", method = RequestMethod.GET)
@GetMapping("/articles/{id}")
public AjaxResponse<Article> getArticle(
// @PathVariable作用:接收請求路徑中占位符的值
@PathVariable("id") Long id
) {
// 不搞數據庫查詢,做一個偽代碼
Article article = Article.builder().id(1l).author("周周").title("z1").content("RESTful風格查詢一篇文章").createTime(new Date()).build();
// 打印一下內容
log.info("article:", article);
// 返回給前端內容
return AjaxResponse.success(article);
}
URL Query String傳參
請求路徑:http://localhost:8080/rest/articles?name=zhoujinyuan
//@RequestMapping(value = "/articles", method = RequestMethod.GET)
@GetMapping("/articles")
public AjaxResponse<Article> getArticle(
@RequestParam String name
) {
// 打印一下內容
log.info("name:"+name);
// 返回給前端內容
return AjaxResponse.success();
}
Body 傳參:@RequestParam
請求路徑:http://localhost:8080/rest/articles1
/**
* 新增一篇Article,使用Post方法
*
* @param author
* @param title
* @param content
* @param createTime
* @return
*/
// @RequestMapping(value = "/articles1", method = RequestMethod.POST)
@PostMapping("/articles1")
public AjaxResponse saveArticle(
// @RequestParam:將請求參數綁定到你控制器的方法參數上(是springmvc中接收普通參數的注解)
@RequestParam Long id,
@RequestParam String author,
@RequestParam String title,
@RequestParam String content,
/*
這里加了兩個注解:
@DateTimeFormat:在SpringMVC中Controller中方法參數為Date類型想要限定請求傳入時間格式時,可以通過@DateTimeFormat來指定,但請求傳入參數與指定格式不符時,會返回400錯誤。
@RequestParam:請求的參數和方法中的參數做對應的注解
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date createTime
) {
log.info("saveArticle:" + createTime);
return AjaxResponse.success();
}
開始我測試一直報錯:required string parameter 'XXX'is not present
情況一:原因是由於頭文件類型不對,可以在MediaType中選擇合適的類型,例如GET和POST
情況二:jquery提交delete時,不支持@RequestParam,只支持@PathVariable形式
情況三:若api在調用的時候,如果存在重類型,但不重名;例如:/id與/name,兩者在類型上是一樣的
情況四:這里提示Required String parameter 'XXX' is not present並不一定是XXX的錯,也有可能是后面的參數錯誤。總的來說就是頁面傳遞的參數和后台接受參數名自不匹配。
情況五:傳遞的參數里面包含特殊符號,比如前台傳遞字符串不能包含逗號等。(待證明)
情況六:傳的參數是undefined;
我的問題就是用了@RequestParam接收參數,必須接受表單形式的提交。類似get中❓后一鍵一值的那種。@RequestBody才是接收json形式的數據的!!!
Body 傳參 和 Headers 傳參
請求路徑:http://localhost:8080/rest/articles2
/**
* 新增一篇Article,使用Post方法
* restful注意:
*/
// @RequestMapping(value = "/articles2", method = RequestMethod.POST)
@PostMapping("/articles2")
public AjaxResponse saveArticle(
// body形式的傳參:傳過來的參數自動封裝成實體類對象,還有一個好處就是可以接收集合類型的參數。
@RequestBody Article article,
// 請求頭的方式傳參:用@RequestHeader接收鍵名,形參為值;postman中
@RequestHeader(value = "name") String name
) {
// 請求頭參數中的Host屬性
System.out.println(name);
// 日志打印
log.info("article:" + article);
return AjaxResponse.success();
}
@RequestBody接收json形式的數據自動轉換成實體類!!!而且還可以接受集合類型的數據。
{
"id": 1,
"author": "zhoujinyuan",
"title": "boot",
"content": "body傳參",
"createTime": "2020-10-20 12:12:12",
"reader":[{"name":"zhou","age":18},{"name":"tom","age":37}]
}
但是我還用了一個注解 @RequestHeader 。所以傳json數據的同時也還要把請求頭中的數據傳過來(沒有的話自定義一個也要穿過來,不然報錯400)。