http://blog.csdn.net/puncha/article/details/9015317

Nodejs 发送HTTP POST请求实例

2013-06-03 17:55 71745人阅读 评论(3) 收藏 举报
 分类:
JavaScript(26)  Node.js(44) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

项目里面需要用到使用NodeJs来转发HTTP POST请求,研究了很久最后才弄通,把过程记录一下:

接收端代码很简单,就是回送body.address属性:

  1. exports.sendEmail = function (req, res) {
  2. res.send(200, req.body.address);
  3. }

之所以能够访问body的address属性,这得益于express.js(connect)的bodyparser中间件。该中间件解析request的body,假如其content type满足某些条件的话,就尝试将其转换成javascript对象。某些条件是指:multipart, urlencoded, json。

好了,接下来看转发端的代码,为了简单起见,我直接将hard-coding的数据进行转发:

  1. exports.sendEmail = function (req, res) {
  2. var data = {
  3. address: 'test@test.com',
  4. subject: "test"
  5. };
  6. data = require('querystring').stringify(data);
  7. console.log(data);
  8. var opt = {
  9. method: "POST",
  10. host: "localhost",
  11. port: 8080,
  12. path: "/v1/sendEmail",
  13. headers: {
  14. "Content-Type": 'application/x-www-form-urlencoded',
  15. "Content-Length": data.length
  16. }
  17. };
  18. var req = http.request(opt, function (serverFeedback) {
  19. if (serverFeedback.statusCode == 200) {
  20. var body = "";
  21. serverFeedback.on('data', function (data) { body += data; })
  22. .on('end', function () { res.send(200, body); });
  23. }
  24. else {
  25. res.send(500, "error");
  26. }
  27. });
  28. req.write(data + "\n");
  29. req.end();
  30. }

这里浏览器回显的就是"test@test.com",注意,我把content type设置成x-www-form-urlencoded,这是bodyparser所支持的了类型之一,而body的格式通过require('querystring').stringify(...)来格式化的,这个会将对象转换成诸如"address=test%40test.com&subject=test"这种格式的字符串。

再来看另外一种content type,JSON:

  1. exports.sendEmail = function (req, res) {
  2. var data = {
  3. address: 'test@test.com',
  4. subject: "test"
  5. };
  6. data = JSON.stringify(data);
  7. console.log(data);
  8. var opt = {
  9. method: "POST",
  10. host: "localhost",
  11. port: 8080,
  12. path: "/v1/sendEmail",
  13. headers: {
  14. "Content-Type": 'application/json',
  15. "Content-Length": data.length
  16. }
  17. };
  18. var req = http.request(opt, function (serverFeedback) {
  19. if (serverFeedback.statusCode == 200) {
  20. var body = "";
  21. serverFeedback.on('data', function (data) { body += data; })
  22. .on('end', function () { res.send(200, body); });
  23. }
  24. else {
  25. res.send(500, "error");
  26. }
  27. });
  28. req.write(data + "\n");
  29. req.end();
  30. }

这同样能成功,但是有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请求的更多相关文章

  1. nodejs接收post请求参数

    原文 https://blog.csdn.net/u013263917/article/details/78682270#1.2 nodejs接收post请求参数1.1-浏览器发送post请求参数的方 ...

  2. nodejs模仿http请求组件nodegrass简单例子

    1.搭建nodejs环境. 2.执行npm install nodegrass命令. 3.引入模块,var ng= require(nodegrass); 4.下面先看nodegrass底层的get方 ...

  3. nodejs发起HTTPS请求并获取数据

    摘要:在网站中有时候需要跨域请求数据,直接用Ajax无法实现跨域,采用其他方式需要根据不同的浏览器做相应的处理.用Nodejs可以很好的解决这些问题,后台引用HTTPS模块,发送和返回的数据均为JSO ...

  4. Nodejs发送Post请求时出现socket hang up错误的解决办法

    参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...

  5. nodejs 发起http请求

    http://nodejs.cn/api/http.html#http_http_request_options_callback http://yijiebuyi.com/blog/8221eb14 ...

  6. nodejs处理get请求

    主要记录下获取get请求里面的参数的问题. 假设有这样一个链接 urlString='hello?name=LiLei&position=general' 要从这个链接里提取出参数name和p ...

  7. nodejs笔记2——请求路由

    对于不同的URL请求,服务器应该有不同的反应.我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码.我们需要的所有数据都会包含在request对象中, ...

  8. nodejs中https请求失败,无报错

    今天群里一位同学在做练习的时候,采用https例子: // curl -k https://localhost:8000/ const https = require('https'); const ...

  9. nodejs获取post请求发送的formData数据

    前端post请求发送formData的类型数据时,需要服务端引入中间件body-parser,主要原因是post请求发送的数据,是在http的body里面,所以需要进行解析,否则获取不到数据(数据为空 ...

随机推荐

  1. 剑指offer-7.旋转数组的最小数字

    看起来不需要用二分法查找 --------------------------------------------------------- 时间限制:3秒 空间限制:32768K 热度指数:5098 ...

  2. 20165210 Java第九周学习总结

    20165210 Java第九周学习总结 教材学习内容 - 第十三章学习总结 URL类: URL的构造方法: try { URL url = new URL("http://www.goog ...

  3. uva489(需要考虑周全)

    这个题是简单题,但是我的思路本身不周全,忽略了一种比较“无理”的情况,而导致WA多次.我是把猜的串全扫一遍以后判断出结果,但是实际上可能是前面已经全猜对了,但是这个选手是个逗比,已经猜对了还要猜,而且 ...

  4. signal 信号具体含义解释~

    ) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控 制进程结束时, 通知同一session内的各个作业,这时它们与控制终端不再关联. ) SIGINT 程序终止(int ...

  5. docker 存储

    [root@docker01 ~]# docker run --name b1 -v /data -it busybox / # ls bin data dev etc home proc root ...

  6. LeetCode Reshape the Matrix

    原题链接在这里:https://leetcode.com/problems/reshape-the-matrix/#/description 题目: In MATLAB, there is a ver ...

  7. GO语言list剖析

    GO语言list剖析 本节内容 使用方法 list提供的方法 源码剖析 1. 使用方法 在GO语言的标准库中,提供了一个container包,这个包中提供了三种数据类型,就是heap,list和rin ...

  8. Pix mesa 自动化测试

    最近在准备PIX的认证, 需要进行mesa测试. 但是Mesa的标准测试工具中没有针对PIX的TestCase, 只是提到NIST的web测试.路径为:http://pixpdqtests.nist. ...

  9. 二:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现

    这和一篇与上一篇的区别在与,上一篇是直接请求到action我们剩下的都是我们全部手动处理, 而这一片篇是由kindeditor内部处理,图片上传到本地,基本上没什么区别,但是有一点一定要注意的就是,这 ...

  10. Hot resize Multipath Disk – Linux

    This post is for the users of the great dm-multipath system in Linux, who encounter a major availabi ...