HTTP协议的四种传参⽅式
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传参
/**
* 获取⼀篇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传参
//@RequestMapping(value = "/articles", method = RequestMethod.GET)
@GetMapping("/articles")
public AjaxResponse<Article> getArticle(
@RequestParam String name
) {
// 打印⼀下内容
log.info("name:"+name);
// 返回给前端内容
return AjaxResponse.success();
}
Body 传参:@RequestParam
/**
* 新增⼀篇Article,使⽤Post⽅法
*
* @param author
* @param title
* @param content
* @param createTime
* @return
*/
// @RequestMapping(value = "/articles1", method = RequestMethod.POST)
@PostMapping("/articles1")
mvc的controller
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 传参
/**
* 新增⼀篇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)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。