如何nodejs中发送post请求

JavaScript011

如何nodejs中发送post请求,第1张

调用官方api的时候,有一步需要用post发送请求,于是上网查了些资料,发现一般发送post请求的做法是(下面是简化版代码):

var querystring = require('querystring')

var https = require('https')

var post_data = querystring.stringify({

"name":"BOb",

"age":30,

"job":"teacher"

})

var post_req = https.request(post_opt,function(res){

//some code here

})

post_req.write(post_data)

post_req.end()

然而官方api要求发送的数据是这样的:

{

"action_name": "QR_LIMIT_SCENE",

"action_info": {

"scene": {

"scene_id": 1000

}

}

}

也就是说,调用了querystring.stringify方法之后,变成了action_name=QR_LIMIT_SCENE&action_info=。

获取http请求报文头部信息

利用nodejs中的 http.ServerRequest中获取1):

request.method

用来标识请求类型

request.headers

其中我们关心两个字段:

content-type

包含了表单类型和边界字符串(下面会介绍)信息。

content-length

post数据的长度

关于content-type

get请求的headers中没有content-type这个字段

post 的 content-type 有两种

application/x-www-form-urlencoded

这种就是一般的文本表单用post传地数据,只要将得到的data用querystring解析下就可以了

multipart/form-data

文件表单的传输,也是本文介绍的重点

获取POST数据

前面已经说过,post数据的传输是可能分包的,因此必然是异步的。post数据的接受过程如下:

   var postData = ''

   request.addListener("data", function(postDataChunk) {  // 有新的数据包到达就执行

     postData += postDataChunk

     console.log("Received POST data chunk '"+

     postDataChunk + "'.")

   })

   request.addListener("end", function() {  // 数据传输完毕

     console.log('post data finish receiving: ' + postData )

   })

注意,对于非文件post数据,上面以字符串接收是没问题的,但其实 postDataChunk 是一个 buffer 类型数据,在遇到二进制时,这样的接受方式存在问题。