• ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data


    ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data



    使用postman发送一个post请求,在body里面加上了form-data数据,name=xxx,age=23,为什么输出request.body()得到的是这样的结果
    ----------------------------817240066476907930266144
    Content-Disposition: form-data; name=“name” xxx
    ----------------------------817240066476907930266144
    Content-Disposition: form-data; name=“age” 24
    ----------------------------817240066476907930266144
    ChatGPT:
    这是因为你在发送POST请求时,使用了"form-data"格式的数据,这种格式会在请求体中以一定格式进行编码。实际上,请求体中的数据是按照一定的格式进行分割和编码的,每个数据项都由一个包含了该数据项的元数据的“part”组成,每个“part”都由一个包含了该数据项的Content-Disposition和Content-Type信息的头部和该数据项的实际数据组成。
    当你调用request.body()函数时,会以字符串的形式返回整个请求体,包括每个“part”和它们的头部。因此,你看到的输出结果就是一个字符串,其中包含了两个“part”,分别对应了"name"和"age"这两个数据项。每个“part”都以一串分隔符开始,紧接着是该“part”的头部信息,然后是两个回车换行符和该“part”的实际数据。最后以分隔符结尾。
    如果你想以程序的方式解析这个请求体,你需要解析每个“part”并从中提取出实际的数据。你可以使用一些现有的库来完成这个任务,例如Java中的Apache HttpClient库。

    为什么使用vue2和axios发送表单数据,
    const {data: res} = await this.$http.post(“http://” + host + “:9002/testPost”, this.function12581_12_Form);
    再输出request.body(),会得到以下结果
    { “name”: “xxx”, “age”: “23” }
    ChatGPT:
    这是因为在Vue2和axios中,默认情况下,使用的是"application/json"格式来发送POST请求,而不是"form-data"格式。当你向后端发送一个JavaScript对象时,axios会自动将其转换为JSON格式,并将其放置在请求体中。在后端中,你可以通过解析JSON格式的请求体来获取数据。
    因此,当你在前端使用以下代码来发送POST请求时:
    const { data: res } = await this.$http.post("http://" + host + ":9002/testPost", this.function12581_12_Form);
    
    • 1
    其中,this.function12581_12_Form是一个JavaScript对象,包含了两个属性"name"和"age"。在后端中,你可以使用类似以下的代码来获取这些数据:
    @RequestMapping(value = "/testPost", method = RequestMethod.POST)
    public String testPost(@RequestBody Map<String, Object> requestBody) {
        String name = (String) requestBody.get("name");
        String age = (String) requestBody.get("age");
        // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    在这种情况下,request.body()的输出结果是一个包含"name"和"age"两个属性的JSON字符串,它们的值分别为"xxx"和"23"。这也是为什么你看到的输出结果是这样的:
    { "name": "xxx", "age": "23" }
    
    • 1
    如果你想使用"form-data"格式来发送POST请求,你需要手动将数据转换为"form-data"格式并将其放置在请求体中,例如:
    const formData = new FormData();
    formData.append("name", this.function12581_12_Form.name);
    formData.append("age", this.function12581_12_Form.age);
    
    const { data: res } = await this.$http.post("http://" + host + ":9002/testPost", formData);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    在后端中,你可以使用类似以下的代码来获取这些数据:
    @RequestMapping(value = "/testPost", method = RequestMethod.POST)
    public String testPost(HttpServletRequest request) throws IOException {
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    这种情况下,request.body()的输出结果将会是一个空字符串。

    "form-data"格式是什么
    ChatGPT:
    "form-data"是一种常见的HTTP请求数据格式,通常用于提交表单数据。它是一种多部分(multipart)格式,其中每个部分都可以包含不同的数据类型,例如文本、二进制、文件等。每个部分都有自己的Content-Type、Content-Disposition和Content-Transfer-Encoding等元数据。
    在"form-data"格式中,每个部分由以下内容组成:
    1. 一个包含Content-Disposition和Content-Type信息的头部,例如:
      Content-Disposition: form-data; name="file"; filename="example.txt"
      Content-Type: text/plain
      
      • 1
      • 2
      其中,name是该数据项的名称,filename是文件名称,如果该部分不是文件,则没有filename属性。Content-Type指定该部分的数据类型,例如text/plain表示文本数据,image/jpeg表示JPEG图片。
    2. 两个回车换行符。
    3. 实际的数据,例如文本或二进制数据。
    4. 一个回车换行符,表示该部分的结束。
    每个部分之间由一个特定的分隔符分隔。分隔符是一个随机生成的字符串,确保在整个请求体中唯一。在请求体的最后一个部分后面,再加上一组分隔符表示整个请求体的结束。
    在客户端发送"form-data"格式的请求时,通常会使用multipart/form-data编码格式。在服务端接收"form-data"格式的请求时,需要解析请求体,提取出每个部分的元数据和数据,以便进行后续处理。

    "application/json"格式是什么
    ChatGPT:
    "application/json"是一种常见的HTTP请求数据格式,用于在客户端和服务器之间传递JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,易于阅读和编写,也易于解析和生成。它支持字符串、数字、布尔值、数组、对象等基本数据类型,以及它们的组合。
    在"application/json"格式中,请求体中的数据是一个JSON对象,通常由一个JavaScript对象序列化成JSON字符串后发送给服务器。例如,以下是一个简单的JSON对象:
    {
        "name": "John",
        "age": 30,
        "city": "New York"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    在客户端发送"application/json"格式的请求时,通常需要设置请求头的Content-Type字段为application/json,以指示请求体中包含的数据是JSON格式的数据。例如,使用axios发送一个POST请求可以这样写:
    axios.post('https://example.com/api/users', {
      name: 'John',
      age: 30,
      city: 'New York'
    }, {
      headers: {
        'Content-Type': 'application/json'
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    在服务端接收"application/json"格式的请求时,需要解析请求体中的JSON数据,并将其转换为相应的数据类型,以便进行后续处理。通常,服务器端的框架或库都提供了解析JSON数据的方法,例如,在Node.js中,可以使用express框架提供的body-parser中间件来解析JSON数据:
    const express = require('express')
    const bodyParser = require('body-parser')
    
    const app = express()
    
    // parse application/json
    app.use(bodyParser.json())
    
    app.post('/api/users', function(req, res) {
      const name = req.body.name
      const age = req.body.age
      const city = req.body.city
      // ...
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    x-www-form-urlencoded是什么格式
    ChatGPT:
    “x-www-form-urlencoded"是一种常见的HTTP请求数据格式,通常用于提交表单数据。在这种格式下,请求体中的数据由键值对构成,每个键值对之间以”&“符号分隔。键和值之间用”="号连接。例如,以下是一个x-www-form-urlencoded格式的数据:
    name=John&age=30&city=New%20York
    
    • 1
    在这个例子中,有三个键值对:name=John,age=30和city=New%20York。注意,空格字符被编码为%20,这是一种URL编码方式,用于确保数据可以在HTTP请求中正确传输。
    在客户端发送"x-www-form-urlencoded"格式的请求时,通常需要设置请求头的Content-Type字段为application/x-www-form-urlencoded,以指示请求体中包含的数据是x-www-form-urlencoded格式的数据。例如,使用axios发送一个POST请求可以这样写:
    axios.post('https://example.com/api/users', {
      name: 'John',
      age: 30,
      city: 'New York'
    }, {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    在服务端接收"x-www-form-urlencoded"格式的请求时,需要解析请求体中的数据,将其转换为键值对的形式,以便进行后续处理。通常,服务器端的框架或库都提供了解析"x-www-form-urlencoded"格式的方法,例如,在Node.js中,可以使用express框架提供的body-parser中间件来解析"x-www-form-urlencoded"数据:
    const express = require('express')
    const bodyParser = require('body-parser')
    
    const app = express()
    
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }))
    
    app.post('/api/users', function(req, res) {
      const name = req.body.name
      const age = req.body.age
      const city = req.body.city
      // ...
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

  • 相关阅读:
    代码随想录第六十天
    腾讯云服务器竞价实例是什么意思?
    MyBatisPlus学习笔记
    R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...
    我可能永远也没办法成为全栈工程师了,看看你还差多少?
    MySQL高级-01.Linux系统下安装MySQL
    代码随想录算法训练营第四十六天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ
    Linux 命令个人学习笔记
    QT使用MSVC编译时报错C2001: 常量中有换行符
    16位、32位、64位系统字节长度
  • 原文地址:https://blog.csdn.net/XRT_knives/article/details/133214459