zoukankan      html  css  js  c++  java
  • Nodejs 发送HTTP POST请求实例

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

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

    [javascript] view plain copy

     print?

    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的数据进行转发:

    [javascript] view plain copy

     print?

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

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

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

    [javascript] view plain copy

     print?

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

    这同样能成功,但是有2个修改,一个是我用JSON.stringify()来格式化body内容,另一个是我把content type变成了json格式,当然,这个也是body parser所支持的格式之一!

    另外,有两个地方,我不是很清楚,一个是貌似content-length不是必须的,另一个是req.write(data+" ")的" "也不是必须的,这个有待研究。。。

    补充:

    bodyparser的代码在” ode_modulesexpress ode_modulesconnectlibmiddlewareodyParser.js“,它其实什么都没做,只是把解析body的任务派发给了另外3个中间件:./multipart, ./urlencoded, ./json:

    • ./multipart 负责 multipart/form-data 类型。
    • ./urlencoded 负责 application/x-www-form-urlencoded 类型。
    • ./json 负责 application/json 类型。
  • 相关阅读:
    JWT在flask中的demo
    14.Android开发笔记:碎片(Fragment)
    13.Android开发笔记:界面开发最佳实践
    12.Android开发笔记:RecyclerView
    11.Android开发笔记:ListView
    10.Android开发笔记:布局控件(五) 自定义控件
    9.Android开发笔记:布局控件(四) 百分比布局
    8.Android开发笔记:布局控件(三)FrameLayout 帧布局
    7.Android开发笔记:布局控件(二)RelativeLayout 相对布局
    6.Android开发笔记:布局控件(一)LinearLayout 线性布局
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313578.html
Copyright © 2011-2022 走看看