结合使用HTTP开发客户端和发布请求和Content-Type应用程序/ x-www-form-urlencoded
1)仅@RequestBody
请求-本地主机:8080 / SpringMVC /欢迎进入正文-name = abc
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestBody String body, Model model) {
model.addAttribute("message", body);
return "hello";
}
//如预期的那样将正文命名为“ name = abc”
2)仅@RequestParam
请求-本地主机:8080 / SpringMVC /欢迎进入正文-name = abc
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestParam String name, Model model) {
model.addAttribute("name", name);
return "hello";
}
//预期名称为“ abc”
3)两者在一起
请求-本地主机:8080 / SpringMVC /欢迎进入正文-name = abc
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestBody String body, @RequestParam String name, Model model) {
model.addAttribute("name", name);
model.addAttribute("message", body);
return "hello";
}
// HTTP错误代码400-客户端发送的请求在语法上不正确。
4)上面的参数位置已更改
请求-本地主机:8080 / SpringMVC /欢迎进入正文-name = abc
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestParam String name, @RequestBody String body, Model model) {
model.addAttribute("name", name);
model.addAttribute("message", body);
return "hello";
}
//没有错误。名称为“ abc”。身体是空的
5)在一起但获取类型url参数
请求-本地主机:8080 / SpringMVC / welcome?name = xyz在正文中-name = abc
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestBody String body, @RequestParam String name, Model model) {
model.addAttribute("name", name);
model.addAttribute("message", body);
return "hello";
}
//名称为“ xyz”,主体为“ name = abc”
6)与5)相同,但参数位置已更改
Code
@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestParam String name, @RequestBody String body, Model model) {
model.addAttribute("name", name);
model.addAttribute("message", body);
return "hello";
}
// name =’xyz,abc’主体为空
有人可以解释这种行为吗?
该@RequestBody
javadoc的状态
指示方法参数的注释应绑定到Web请求的正文。
它使用的注册实例HttpMessageConverter
将请求主体反序列化为带注释的参数类型的对象。
和@RequestParamjavadoc
的状态
指示方法参数应绑定到Web请求参数的注释。
Spring将请求的主体绑定到以注释的参数@RequestBody
。
Spring将来自请求主体的请求参数(URL编码的参数)绑定到你的方法参数。Spring将使用参数的名称,即。name,以映射参数。
参数按顺序解析。首先@RequestBody
处理。spring会消耗掉所有的HttpServletRequest InputStream
。然后,当它尝试解析@RequestParam
默认情况下的时required
,查询字符串中没有请求参数,也没有请求正文的剩余内容,即。没有。因此失败400,因为处理程序方法无法正确处理请求。
处理程序@RequestParam首先执行操作,读取可以HttpServletRequest InputStream
映射请求参数的内容,即。整个查询字符串/网址编码的参数。这样做并获取abc映射到参数的值name。@RequestBody
运行处理程序时,请求主体中没有任何内容,因此使用的参数为空字符串。
处理程序@RequestBody读取主体并将其绑定到参数。然后,的处理程序@RequestParam
可以从URL查询字符串获取请求参数。
用于@RequestParam
从正文和URL查询字符串读取的处理程序。通常会将它们放在中Map
,但是由于参数类型为String
,Spring会将序列号Map
分隔为逗号分隔的值。@RequestBody
然后,处理程序再也没有从身体读取的内容了。
使用带有Post请求和Content-Type Application/x-www-form-urlencoded的HTTP dev客户端 URL:localhost:8080/springmvc/welcome 正文:name=abc URL:localhost:8080/springmvc/welcome 在body-name=abc中 URL:localhost:8080/springmvc
看起来在这个话题上有一些问题,但许多问题现在已经过时,或者问的是不同的问题。 例如,我想做 我不想在 我有一个方法签名,它同时接受请求参数和请求主体(它是Kotlin,但我不认为这实际上有什么不同)。 我可以很好地访问RequestParam,但是RequestBody包含的不仅仅是我在body中发送的JSON,它包含了body和请求参数的合并。在上面的示例中,它将为body绑定输出以下内容 有没
我使用的是Spring-MVC3.1.0.版本,由于某种原因,将POST与查询params和请求body进行映射是不起作用的。 下面是我的控制器方法的外观: 但是,如果我将所有请求参数转换为路径参数,映射就会起作用。有人遇到过类似的事情吗? 谢了!
我有一些应用程序在Spring boot中使用微服务架构。我已经在RestTemplate中使用@PathVariable发送了查询参数、对象、模型等。开发应用程序后,我做了一些研究,要求使用@RequestParam和@RequestBody。但我无法理解,也不知道如何使用@RequestBody和@RequestParam。使用@RequestBody而不是@PathVariable有什么好处
问题内容: 为什么不能和这两个一起在构造函数中使用? 合并这样的东西的原因是什么? 问题答案: 将在同一类中调用另一个构造函数,而将调用超级构造函数。如果构造函数中没有,则编译器将隐式添加一个。 因此,如果两者都允许,您最终可能会两次调用构造函数。 示例(不要在参数中寻找含义): 现在,如果调用,将调用以下构造函数: 更新 : 如果您能够使用并且可能会得到如下结果: ( 注意 :这是为了说明 如果
问题内容: 在多个开源项目中,我看到人们确实在获取当前文件的绝对路径。 但是,我发现并产生相同的结果。似乎有点多余。 人们使用它是有原因的吗? 问题答案: 在支持它们的操作系统上取消引用符号链接。 只需从路径中删除类似和的东西,即可提供从目录树的根到命名文件(或符号链接)的完整路径 例如,在Ubuntu上 符号链接可以包含相对路径,因此需要同时使用两者。内部调用可能会返回包含嵌入式部件的路径,然后