我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP协议之上的应用层规范。该规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
1 | 复制代码<method> <request-url> <version> |
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端如 Node.js、php、python、java 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。
关于POST 提交数据方式,详细的内容就不介绍了,请参考
四种常见的 POST 提交数据方式。
好了,进入正片 >>>
对于Node的Express框架来说,主要需要处理一下四种格式:
一.www-form-urlencoded
http默认的post请求是这种方式,注意这是是默认的提交方式,比如你写一个
1 | 复制代码<form>....<input type="submit" /></form> |
form表单,里面的submit按钮默认就是这种 www-form-urlencoded 方式提交的。
我们采用body-parser这个插件就可以了,具体用法请点链接。
二. form-data
表单提交默认是www-form-urlencoded,但是当需要上传文件的时候,必须在form标签里做这样的标识 enctype=”multipart/form-data”。
Node中处理这类表单还需要以下其中一种中间件
需要特别注意的是,form-data这三个插件本身就可以处理www-form-urlencoded,所以如果需要同时处理字段和文件,不需要再引入www-form-urlencoded相关的插件了。
三.application/json
bodyParser 支持此类参数解析.
注意: 在提交之前需要指定http请求头设为 content-type=application/json
四.text/xml
这种请求类型不是特别常见,body-parse默认也不解析这种数据格式,但是由于目前腾讯微信平台在使用这种数据交换格式,在做微信相关的接口用的还是很多.Node在express如何解析这种格式,没有好的办法,只能自己用代码处理,把请求体参数按照字符串读取出来,然后使用xml2json包把字符串解析成json对象,使用起来就方便多了.
1 | 复制代码const express = require('express'), |
第二种方式就是使用针对微信的中间件,wechat-parser .
推荐采用后者。
本文转载自: 掘金