请求头content-type的不同格式后端应该如何接收
作者:mmseoamin日期:2023-12-25

博客原文地址

"Content-Type" 是HTTP请求头中的一个标头,用于指示请求或响应中包含的实体的媒体类型。它告诉客户端如何处理响应中的数据,并通知服务器客户端正在发送的数据类型。它可以出现在请求或响应标头中。

常见的Content-Type类别

Content-Type的值通常由一个媒体类型和一个可选的字符集组成,例如 “Content-Type: text/html; charset=UTF-8”

常见的 Content-Type 类型:

  • text/plain:纯文本
  • text/html:HTML格式
  • application/json:JSON数据格式
  • application/xml:XML数据格式
  • application/x-www-form-urlencoded:普通表单格式(键值对)
  • multipart/form-data:多部分表单格式(用于文件上传)
  • image/jpeg:JPEG图片格式
  • image/png:PNG图片格式
  • audio/mpeg:MPEG音频格式
  • video/mp4:MP4视频格式
  • application/octet-stream:二进制流数据格式

    HTTP规范还支持其他多种媒体类型,具体取决于实际需要。当客户端发送请求时,它必须设置Content-Type头以告知服务器发送的数据类型。而服务器返回的响应也必须设置Content-Type头以告知客户端响应数据的类型。

    后端如何接收参数

    SpringBoot后端接收参数的方式有以下几种:

    • @PathVariable:用于接收Get请求通过拼接url传递的参数,例如localhost:7001/param/123
    • @RequestParam:用于接收Get请求通过查询字符串传递的参数,例如localhost:7001/param?id=123
    • @RequestBody:用于接收Post请求通过请求体传递的参数,可以是JSON或表单格式
    • @RequestHeader:用于接收请求头部传递的参数

      1.@RequestBody

      @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),对于get方法来说是没有请求体的,所以一般都是使用post请求方式时使用这种方式传参。

      如果参数时放在请求体中,并且Content-Type为application/json,那么后台要用@RequestBody才能接收到;

      如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或则形参前 什么也不写也能接收。

      @PostMapping("/example")
      public String handleFormSubmit(@RequestBody User user) {
          // 处理表单提交数据
      }
      

      @RequestBody会自动将请求体中的json数据封装进User实体类中。json的key和实体类的属性名一一对应。

      2.@RequestParam

      @RequestParam注解通常用于接收前端传递的URL参数或表单参数。这些参数可以通过HTTP GET请求的URL参数或HTTP POST请求的表单参数进行传递。

      1.Query参数:即URL中的查询参数,例如

      http://example.com/path?param1=value1¶m2=value2
      

      在这种情况下,@RequestParam注解会将查询参数的值与方法参数进行绑定。例如:

      @GetMapping("/example")
      public String example(@RequestParam("param1") String param1, @RequestParam("param2") String param2) {
          // method body
      }
      

      2.Form表单参数:即表单提交时的参数,例如通过application/x-www-form-urlencoded格式以Post方式的提交的表单。在这种情况下,@RequestParam注解会将表单参数的值与方法参数进行绑定。例如:

      @PostMapping("/example")
      public String example(@RequestParam("param1") String param1, @RequestParam("param2") String param2) {
          // method body
      }
      

      另外,如果通过application/x-www-form-urlencoded格式提交的表单,也可以将其直接封装成Java类,此时参数前不需要加任何注解即可。

      @PostMapping("/example")
      public String example(Param param) {
          // method body
      }
      

      注:如果是通过json传递的表单数据,则必须加@RequestBody才能将其转成Java类

      需要注意的是,使用@RequestParam注解时需要指定参数的名称,这个名称要和前端传递参数时的名称一致。如果前端传递参数时使用了不同的名称,可以通过@RequestParam注解的value属性或name属性来指定正确的参数名称。

      post和get提交表单的区别

      1. 对于HTTP GET请求提交的表单,表单参数通常会被编码到URL中,形成类似于以下的URL
      http://example.com/api/example?id=123&name=John
      

      这种直接使用@RequestParam接收参数,但是如果参数较多,可以使用Java类接收

      //使用@RequestParam接收单个参数
      @PostMapping("/example")
      public String example(@RequestParam("param1") String param1, @RequestParam("param2") String param2) {
          // method body
      }
      //使用Java类接收参
      @PostMapping("/example")
      public String example(User user) {
          // method body
      }
      public  class User{
          String id;
          String name;
      }
      
      1. 对于post提交的表单,格式可以有多种,这里主要说一下application/x-www-form-urlencoded和application/json两种格式

      (1)"application/x-www-form-urlencoded"格式

      这是一种常用的表单格式,也是浏览器默认使用的表单格式。在这种格式下,表单数据会被放置在HTTP请求的正文中,也就是请求体中。正文内容由键值对组成,每个键值对之间用&符号连接例如:

      POST /example HTTP/1.1
      Host: www.example.com
      Content-Type: application/x-www-form-urlencoded
      id=123&name=John&age=20
      

      接收这种格式的参数,可以使用@RequestParam接收,也可以使用Java类接收,因为是application/x-www-form-urlencoded格式,使用Java类不需要加@RequestBody,和上面接收get表单方法一致。

      (2)"application/json"格式

      这是一种常用的数据交换格式,它使用JSON格式来描述数据。在这种格式下,表单数据会被序列化为JSON字符串,并放置在HTTP请求的正文中。例如:

      {
        "id": 123,
        "name": "John",
        "age": 20
      }
      

      可以使用@RequestBody注解来接收这种格式的表单数据,并将其反序列化为Java对象。此时Java对象前必须加@RequestBody注解才行。