post请求四种数据格式,前端对应传参方式总结

2 篇文章 0 订阅

前言

HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

<method> <request-URL> <version>
<headers>

<entity-body>

协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python ,java等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。post提交数据有四种方式,下面介绍他们以及前端应该如何传参


一、Content-Type设置为application/x-www-form-urlencoded

传统的这种格式表单通过$(“form”).serialize()方法将参数序列化变成形如key&value的格式,然后传给后台解析现,如今serialize()在vue/angula/react等前端框架中都不怎么用了,如果要使用这种编码传输,可以使用npm的qs

1.使用qs

qs可以将json序列化如下:
let a = {
  name:'june',
  age:26  
}
qs.stringify(a)  //"name=june&age=26" qs可以将josn对象转换成形如key&value

如何使用:
import qs from 'qs'
let data = {code: 'fds', headImgUrl: '99', innerDemoVos: [{code: '篮球', name: 'xx'}, {code: '台球', name: '小芳'}]}
let params = qs.stringify(data, {arrayFormat: 'indices', allowDots: true})

// post的content-type的格式需要设置成application/x-www-form-urlencoded,data就是post请求体。
let data = {code: 'fds', headImgUrl: '99', innerDemoVos: [{code: '篮球', name: 'xx'}, {code: '台球', name: '小芳'}]};
// 将json对象转换成form表单的key&value的形式,包括复杂的数组对象,注意{arrayFormat: 'indices', allowDots: true}参数,一定要写,这个关系到数组对象转换成的格式后台是否可以解析,如果不写那么数组对象就是innerDemo[0].[code]: 篮球,这样后台是无法解析,只有innerDemo[0].code: 篮球的格式才可以解析,
console.info(qs.stringify(data, {arrayFormat: 'indices', allowDots: true}));

2.自定义全局方法

//utils->utils.js
export function objserialize (obj) {
  let str = ''
  for (var key in obj) {
    str += key + '=' + obj[key] + '&'
  }
  return str.slice(0, -1)
}

//在组件中引入
import {objTostring} from "@/utils/utils"
let data = {
          name: 'xiaoming',
          age: 18,
        }
let params = objTostring(data) //name='xiaoming'&age=18

二、Content-Type设置为application/json

这种编码格式现在比较流行推荐使用,前端传参不用管数据结构有多复杂层次有多深直接以json形式传就ok,不用像上面的转key&value的形式。实例

let param = {
    name : 'xiaohong',
    age: 18,
    sex: '女',
    goods: {
        a: 1,
        b:2
    }
}
传参直接传json对象param,非常简单

三、Content-Type设置为 multipart/form-data

这也是常见的post请求方式,一般用来上传文件图片等,各大服务器的支持也比较好。

//在vue的js中
data(){
    return{
        params:{
            file:"",//上传文件
        }
    }
}
methods:{
    update(){
       let fd = this.transformData(this.params)
       let api = '/api/updateFile'
       this.axios.post(api,fd,{
            headers:{
                "content-type":"multipart/form-data"
            }
            }).then(res=>{
            console.log(res)
            })
    },
    // 转化为formdata格式
    transformData(obj){  
        let fd = new FormData()
        Object.keys(obj).forEach(key=>{
            fd.append(key,obj[key])
        })
        return fd
    }
}

四、Content-Type设置为 text/xml

它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的: 

POST http://www.example.com HTTP/1.1 
Content-Type: text/xml 

<!--?xml version="1.0"?--> 
<methodcall> 
    <methodname>examples.getStateName</methodname> 
    <params> 
        <param> 
            <value><i4>41</i4></value> 
         
    </params> 
</methodcall> 

XML-RPC 协议简单、功能够用,各种语言的实现都有,但是个人觉得略显臃肿,没有Json格式简单灵活

总结

平时开发中有时候会出现参数格式错误一定要注意查看Content-Type设定值,以及跟后端沟通

  • 15
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Node.js 是一个非阻塞 I/O 的环境,能够快速地构建高效的网络应用程序。而 Express 则是 Node.js 中最受欢迎的 Web 框架之一,它为 Node.js 提供了大量的功能和模块。其中,解析 POST 请求数据格式是 Express 最常用的功能之一。 Express 支持解析四种 POST 请求数据格式:URL-encoded 格式、JSON 格式、Raw 格式和 multipart/form-data 格式。 1. URL-encoded 格式:这是最常用的 POST 数据格式,也是默认格式。它的数据格式类似于 URL 查询字符串,通过 key=value 的形式数。Express 提供了 body-parser 中间件,可以自动将 URL-encoded 格式请求数据解析成 JSON 格式。 2. JSON 格式:JSON 是一种轻量级的数据交换格式,它比 XML 更加简洁易懂,也更加易于解析。如果服务端需要处理 JSON 格式请求,可以使用 express.json() 中间件来解析请求数据。 3. Raw 格式:Raw 格式是一种原始数据格式,不做任何编码和处理。如果客户端发送的 POST 请求数据是 Raw 格式的,服务端需要使用 body-parser 中间件提供的 raw() 方法解析请求数据,将其转换成 Buffer 类型。 4. multipart/form-data 格式:这种格式常用于上文件或者提交包含二进制数据的表单。如果服务端需要处理 multipart/form-data 格式请求,可以使用 multer 中间件来解析请求数据。multer 中间件可以处理文件上,同时还支持设置上文件的限制条件。 综上所述,Express 中提供了多种中间件来解析不同格式POST 请求数据,开发者可以根据实际需求选择对应的中间件来使用。这些中间件的使用方式都非常简单,在应用程序中添加一条或几条中间件即可完成对 POST 请求数据的解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空千古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值