nodejs的POST请求
http://blog.csdn.net/puncha/article/details/9015317
Nodejs 发送HTTP POST请求实例
Node.js(44) 
版权声明:本文为博主原创文章,未经博主允许不得转载。
项目里面需要用到使用NodeJs来转发HTTP POST请求,研究了很久最后才弄通,把过程记录一下:
接收端代码很简单,就是回送body.address属性:
- 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的数据进行转发:
- exports.sendEmail = function (req, res) {
- var data = {
- address: 'test@test.com',
- subject: "test"
- };
- data = require('querystring').stringify(data);
- console.log(data);
- var opt = {
- method: "POST",
- host: "localhost",
- port: 8080,
- path: "/v1/sendEmail",
- headers: {
- "Content-Type": 'application/x-www-form-urlencoded',
- "Content-Length": data.length
- }
- };
- var req = http.request(opt, function (serverFeedback) {
- if (serverFeedback.statusCode == 200) {
- var body = "";
- serverFeedback.on('data', function (data) { body += data; })
- .on('end', function () { res.send(200, body); });
- }
- else {
- res.send(500, "error");
- }
- });
- req.write(data + "\n");
- req.end();
- }
这里浏览器回显的就是"test@test.com",注意,我把content type设置成x-www-form-urlencoded,这是bodyparser所支持的了类型之一,而body的格式通过require('querystring').stringify(...)来格式化的,这个会将对象转换成诸如"address=test%40test.com&subject=test"这种格式的字符串。
再来看另外一种content type,JSON:
- exports.sendEmail = function (req, res) {
- var data = {
- address: 'test@test.com',
- subject: "test"
- };
- data = JSON.stringify(data);
- console.log(data);
- var opt = {
- method: "POST",
- host: "localhost",
- port: 8080,
- path: "/v1/sendEmail",
- headers: {
- "Content-Type": 'application/json',
- "Content-Length": data.length
- }
- };
- var req = http.request(opt, function (serverFeedback) {
- if (serverFeedback.statusCode == 200) {
- var body = "";
- serverFeedback.on('data', function (data) { body += data; })
- .on('end', function () { res.send(200, body); });
- }
- else {
- res.send(500, "error");
- }
- });
- req.write(data + "\n");
- req.end();
- }
这同样能成功,但是有2个修改,一个是我用JSON.stringify()来格式化body内容,另一个是我把content type变成了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 负责 multipart/form-data 类型。
- ./urlencoded 负责 application/x-www-form-urlencoded 类型。
- ./json 负责 application/json 类型。
nodejs的POST请求的更多相关文章
- nodejs接收post请求参数
原文 https://blog.csdn.net/u013263917/article/details/78682270#1.2 nodejs接收post请求参数1.1-浏览器发送post请求参数的方 ...
- nodejs模仿http请求组件nodegrass简单例子
1.搭建nodejs环境. 2.执行npm install nodegrass命令. 3.引入模块,var ng= require(nodegrass); 4.下面先看nodegrass底层的get方 ...
- nodejs发起HTTPS请求并获取数据
摘要:在网站中有时候需要跨域请求数据,直接用Ajax无法实现跨域,采用其他方式需要根据不同的浏览器做相应的处理.用Nodejs可以很好的解决这些问题,后台引用HTTPS模块,发送和返回的数据均为JSO ...
- Nodejs发送Post请求时出现socket hang up错误的解决办法
参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...
- nodejs 发起http请求
http://nodejs.cn/api/http.html#http_http_request_options_callback http://yijiebuyi.com/blog/8221eb14 ...
- nodejs处理get请求
主要记录下获取get请求里面的参数的问题. 假设有这样一个链接 urlString='hello?name=LiLei&position=general' 要从这个链接里提取出参数name和p ...
- nodejs笔记2——请求路由
对于不同的URL请求,服务器应该有不同的反应.我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码.我们需要的所有数据都会包含在request对象中, ...
- nodejs中https请求失败,无报错
今天群里一位同学在做练习的时候,采用https例子: // curl -k https://localhost:8000/ const https = require('https'); const ...
- nodejs获取post请求发送的formData数据
前端post请求发送formData的类型数据时,需要服务端引入中间件body-parser,主要原因是post请求发送的数据,是在http的body里面,所以需要进行解析,否则获取不到数据(数据为空 ...
随机推荐
- Android Studio开发技巧
为了android更有效率的开发,总结学习android集成开发环境(android studio1.3为例) android studio 1-打印log及配置ec快捷键 2-代码提示及移动快捷键 ...
- 关于js序列化时间的方法
var time = new Date(); var otime = getMyDate(time); //将毫秒转换成 年月日+时分秒 格式的 (1970-01-11 00:00:00) funct ...
- Redis-简单动态字符串
这是读redis设计与实现的一系列读书笔记 1.SDS定义 C语言字符串:用一个 \0 结尾的 char 数组来表示 SDS:redis自己定义的简单动态字符串(simple dyanmic stri ...
- Android 关于后台杀死App之后改变服务器状态的一些尝试
前言: 如题,我的需求是:我需要在App在后台运行(未退出),调出最近运行记录,杀死App服务时,程序能够向服务器发送一条指令,以此达到我想要的目的. Android方面刚刚才开始玩,我一开始想的是可 ...
- enumerate 枚举
- 网页播放rtsp流媒体
解决方法: 1.搭建Red5流媒体服务器(其他还有CRTMPD.NGINX-RTMP.SRS) 2.FFmpeg(其他还有live555)实现监控摄像头的RTSP协议转RTMP协议直播 3.搭建WEB ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- Directx 9 VS2015环境搭建
安装好Directx9 sdk和vs2015后 打开vs,新建项目 --> c++项目 -->win32控制台应用程序-->空项目 创建项目后,右键项目属性, 包含目录 D:\Pr ...
- 系列文章--Silverlight与WCF通信
Silverlight与WCF通信(一) :Silverlight通过httpBinding访问IIS宿主WCF 摘要: 首语本人在学习Silverlight 和 WCF的时候,各种问题层出不穷,在园 ...
- 洛谷【P1616】疯狂的采药
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...