转: Nodejs 发送HTTP POST请求实例
项目里面需要用到使用NodeJs来转发HTTP POST请求,把过程记录一下:
- exports.sendEmail = function (req, res) {
- res.send(200, req.body.address);
- }
之所以能够访问body的address属性,这得益于express.js(connect)的bodyparser中间件。该中间件解析request的body,假如其content type满足某些条件的话,就尝试将其转换成javascript对象。某些条件是指:multipart, urlencoded, json。
好了,接下来看转发端的代码,为了简单起见,我直接将hard-coding的数据进行转发:
/**
* nodejs向apache发送请求,接收响应后返回到浏览器端
*/
app.get('/nodeReq', function(req,res,next){
var data = {
age: 20,
name: "cici",
like: "shopping"
};
data = require('querystring').stringify(data); //数据以url param格式发送
data = JSON.stringify(data); //数据以json格式发送
console.log(data);
var opt = {
method: "POST",
host: "localhost",
port: 8012,
path: "/php/get_data.php",
headers:{
//"Content-Type": "application/x-www-form-urlencoded", //for url parameter
"Content-Type": "application/json", // for json data
"Content-Length": data.length
}
}; var req = http.request(opt, function(apacheRes){//建立连接 和 响应回调
if(apacheRes.statusCode == 200){
apacheRes.setEncoding('utf8');
var body = "";
apacheRes.on('data', function(recData){ body += recData;});
apacheRes.on('end', function(){ res.send(body); /*发送收到的响应*/ });
}else{
res.send(500, "error");
}
});
req.write(data + "\n"); //发送请求
req.end(); //请求发送完毕
});
注意,我把content type设置成x-www-form-urlencoded,这是bodyparser所支持的了类型之一,而body的格式通过require('querystring').stringify(...)来格式化的,这个会将对象转换成诸如"address=test%40test.com&subject=test"这种格式的字符串。
另一个是用JSON.stringify()来格式化body内容,然后把content-type改为application/json格式,当然,这个也是body parser所支持的格式之一!
另外,有两个地方,我不是很清楚,一个是貌似content-length不是必须的,另一个是req.write(data+"\n")的"\n"也不是必须的,这个有待研究。。。
补充:
bodyparser的代码在”\node_modules\express\node_modules\connect\lib\middleware\bodyParser.js“,它其实什么都没做,只是把解析body的任务派发给了另外3个中间件:./multipart, ./urlencoded, ./json:
- ./multipart 负责 application/x-www-form-urlencoded 类型。
- ./urlencoded 负责 multipart/form-data 类型。
- ./json 负责 application/json 类型。
用http.request发送文件给服务端, 或带参post数据到服务端
var http = require('http');
var fs = require('fs');
var queryString = require('querystring');
var boundaryKey = 'A' + new Date().getTime(); //随便加个前缀A 避免全数字作为分界符
/**
* 带参数发post请求
*/
function doPost(){
var opt = {
host:'localhost', //注意:不用协议部分(http://)
port:'80',
path: '/testonly/doupload.php', //斜杠开头
method:'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} //设置content-type 头部
};
var body = '';
var req = http.request(opt, function(res){
res.statusCode == 200 && console.log('REQUEST OK..' );
res.setEncoding('utf8');//res为ClientResponse的实例,是readableStream, 设置字符编码
res.on('data', function(chunk){
body += chunk;
}).on('end', function(){
console.log('Got data: ', body);//end事件中 打印全部响应数据
});
}).on('error', function(err){
console.log('error: ', err.message);
});
var data = {name:'sindy', age:22};
var data1 = JSON.stringify(data);
var data2 = queryString.stringify(data); //注意 querystring.stringify 和 JSON.stringify的区别
console.log(data1);
console.log(data2);
req.write(data2); //req为ClientRequest的实例,是writableStream,写数据到流中
req.end();//结束请求
}
/**
* 发送文件给服务器并带上其他表单字段数据
*/
function doUpload(){
var opt = {
host:'localhost',
port:'80',
path: '/testonly/doupload.php',
method:'POST',
headers: {'Content-Type':'multipart/form-data; boundary='+boundaryKey, 'Connection':'keep-alive'} //注意:上传文件时的 content-type 设置
};
var body = '';
var req = http.request(opt, function(res){
res.statusCode == 200 && console.log('REQUEST OK..' );
res.setEncoding('utf8');
res.on('data', function(chunk){
body += chunk;
}).on('end', function(){
console.log('Got data: ', body);//php 返回 $_FILES 和 $_POST的内容给客户端
});
}).on('error', function(err){
console.log('error: ', err.message);
});
//ClientRequest writableStream 注意:文件字段的分界符
req.write('--'+boundaryKey+'\r\nContent-Disposition:form-data; name="upfile"; filename="test.zip"\r\nContent-Type:application/x-zip-compressed');
// 1M缓冲
var fileStream = fs.createReadStream('test.zip', {bufferSize: 1024 * 1024});
fileStream.pipe(req, {end: false});
fileStream.on('end', function(){
// ::注意::文件字段内容和其他字段之间空2行,字段名和字段值之间空2行
req.write('\r\n\r\n--'+boundaryKey+'\r\n'+'Content-Disposition: form-data; name="submit"\r\n\r\n'+'sendfile');
req.end('\r\n--'+ boundaryKey + '--'); //注意:结束时的分界符 末尾'--'
});
}
// doPost();
doUpload();
转: Nodejs 发送HTTP POST请求实例的更多相关文章
- Nodejs发送Post请求时出现socket hang up错误的解决办法
参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...
- Nginx做NodeJS应用负载均衡配置实例
这篇文章主要介绍了Nginx做NodeJS应用负载均衡配置实例,本文直接给出配置实例,需要的朋友可以参考下. 负载均衡可以把用户的请求分摊到多个服务器上进行处理,从而实现了对海量用户的访问支持.负载均 ...
- php 中使用cURL发送get/post请求,上传图片,批处理
cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get post请求,文件上传. 在php中建立curl的基本步骤如下: 1 初始化 ...
- Vert.x(vertx)发送 HTTP/HTTPS请求
Vert.x Web服务有两种协议,一种是HTTP,另外一种是使用ssl的HTTPS,请求的方式有五种,分别是get.post.put.delete.head.为了简单,服务端主要实现对HTTP协议的 ...
- nodejs之get/post请求的几种方式
最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...
- 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...
- 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?
理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环 ...
- 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案
第一次调用webapi出错如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:// ...
- nodejs,node原生服务器搭建实例
nodejs,node原生服务器搭建实例
随机推荐
- Qt 之 show,hide,setVisible,setHidden,close 等小结
0QObject::deleteLater()delete obj;析构对象1QWidget::setVisible(bool)使得Widget可见或不可见2QWidget::setHidden(bo ...
- QF——OC内存管理详解
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...
- codeforces 15D . Map 优先队列
题目链接 题目意思很简单nm的矩阵里, 选若干个ab的小矩阵, 定义每个矩阵的值为这个矩阵里的所有数的和-最小值*数的个数. 选小矩阵时, 优先选值最小的,然后次小的.. 知道不能选位置. 输出所有矩 ...
- 函数 setjmp, longjmp, sigsetjmp, siglongjmp
一,相关函数接口 1,setjmp,longjmp,sigsetjmp,siglongjmp #include <setjmp.h> int setjmp(jmp_buf env); ...
- 得到IP包的数据意义(简单实现例子)
#include <stdio.h> #include <unistd.h> #include <linux/if_ether.h> #include <li ...
- MYSQL 用户
MYSQL 并没有与SQL Server一样的两个级别的主体,它只有user. user 的信息都保存在mysql 数据库的 user 表中:我想也可以用insert 的方式新建用户,只是这种尝试还没 ...
- WIX 学习笔记- 1 简介
一个项目 Code Complete 后,程序员们欢欣鼓舞,以为事情到此结束,可以 Happy 了.其实 Code Complete 五十之于百里.一个没有运行在设备上,为人们创造价值的项目是注定失败 ...
- Cortex-M3学习日志(四) -- UART0实验
LPC1768含有4 个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS-485/EIA-485接口模式.串口通讯接口是连接计算机.终端.通讯控制 ...
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
- 新iPhone开售现场:土豪金火了
今日苹果在全球范围内开始正式发售iPhone 5s与5c手机.在中国王府井苹果零售店,首位购机者李先生在今早4点50分便在此等候. 现场未发现黄牛 本次苹果在中国大陆的自有零售店渠道首批iPhone ...