【问题标题】:NodeJS post request doesn't return bodyNodeJS发布请求不返回正文
【发布时间】:2017-06-27 03:31:48
【问题描述】:

我正在发出“GET”请求以从 URL 中获取会话 ID,然后应该发送带有所需表单数据的“POST”请求,结果应该返回 html 正文,但事实并非如此。我根本没有 JS 经验,并试图自己做一些事情,但无法弄清楚出了什么问题......我能够从 POST 请求中打印出标题,但正文仍然是空的(并且似乎挂起)

还尝试使用抛出 socket hang up 错误的 requests 模块。

var querystring = require('querystring');
var http = require('http');

var conn_cookie;

var uri = "my_url.com";

var options_get = {
    host: uri,
    path: '/index.php',
    headers: {
        "User-Agent":  "Request"
    }
};

var postData = querystring.stringify({
    cert_num: "xxx",
    car_num: "yyy",
    answer: "0"
});

var options_post = {
    host: uri,
    method: 'POST',
    path: '/index.php',
    headers: {
        "User-Agent":  "Request",
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
    }
};

var post_req = http.request(options_post, function(res) {
    console.log("POST STATUS: " + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');

    // Nothing is happening here !!
    res.on('data', function (chunk) {
        console.log('Response: ' + chunk);
    });
});
post_req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

http.get(options_get, function(res) {
    conn_cookie = res.headers['set-cookie'];

    if (res.statusCode === 200) {
        //options_post['headers']['set-cookie'] = conn_cookie;
        console.log("SENDING POST DATA");

        post_req.write(postData);
        post_req.end();
    }
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

【问题讨论】:

  • 使用 request nodejs 的 npm 模块有一种简单的方法
  • @IndraniSen 嗯,我收到socket hang up 错误...可能是什么问题?标题?
  • 添加这个post_req.write('{"string": "Hello, World"}'); post_req.end(); post_req.end() 将有助于停止sock hangup 错误

标签: javascript node.js request


【解决方案1】:

post请求是发送body,需要设置http请求body大小。

将此添加到您的帖子标题

 'Content-Length': Buffer.byteLength(post_data)

另外,将您的var post_data 移到var options_post 之前

缓冲区是全局的,所以你不需要它

【讨论】:

  • 您必须将path 设置为/index.php 吗?您的 php 脚本是否设置为响应 POST 请求?
  • 是的,我也尝试过...没有任何变化
  • 听起来可能是你的服务器。要调试,您可以使用此服务requestb.in,然后将帖子网址设置为它提供给您的端点。然后您可以排除问题是您的请求还是服务器。
  • 不幸的是我正在做网页抓取,所以我无法访问主服务器
  • 如果您的 post 请求在 requestb.in 中看起来不错,那么问题出在远程服务器上。它没有响应,也没有关闭连接。
【解决方案2】:

我尝试了你的代码,通过创建一个示例服务器并尝试在我下面的代码中向服务器发送一个发布请求,它适用于我,在你的 GET 调用中,你可以测试 post_req.end() 实际上是打电话或不打电话,

var querystring = require('querystring');
var http = require('http');
var post_data = querystring.stringify({
 name: "Jack",
 surname: "Daniels",
 answer: "0"
 });

var options_post = {
  host: 'localhost',
  method: 'POST',
  path: '/test/data',
  port:9008,
  headers: {
    connection: 'keep-alive',
    accept: 'text/html',
    'Content-Type': 'application/x-www-form-urlencoded',
    "User-Agent":  "Mozilla/5.0",
     'Content-Length': Buffer.byteLength(post_data)
  }
};

 var post_req = http.request(options_post, function(res) {
   console.log("POST STATUS: " + res.statusCode);
   console.log('HEADERS: ' + JSON.stringify(res.headers));
   res.setEncoding('utf8');

  // Nothing is happening here !!
    res.on('data', function (chunk) {
     console.log('Response: ' + JSON.stringify(chunk));
    });
  });
   post_req.on('error', function(e) {
   console.log('problem with request: ' + e.message);
 });
 post_req.write(post_data);
 post_req.end();

这是我的服务器代码:

var bodyParser = require('body-parser');
var express=require('express');
var app = express();
var port =  9008;


// Start the server

app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({extended: true})); // support encoded bodies

app.post("/test/data",function(req,res){

var body=req.body;
res.send("ok"+JSON.stringify(body));
});
//start the server
app.listen(port);
console.log('Server has started!! ' + port);

我得到了输出:

HEADERS: {"x-powered-by":"Express","content-type":"text/html; charset=utf-8","content-length":"50","etag":"W/\"32-ml7xbrRwyj1GKXj
cJAYZOcmEm2s\"","date":"Mon, 26 Jun 2017 17:12:23 GMT","connection":"keep-alive"}
Response: "ok{\"name\":\"Jack\",\"surname\":\"Daniels\",\"answer\":\"0\"}"

requestnpm 模块做 POST/GET 请求要容易得多,不用担心太多错误处理,请求关闭和打开模块处理一切。

【讨论】:

  • 也不工作......似乎服务器完全是fu****了......有趣的是我可以通过java或python实现我想要的结果
  • server statusCode 在执行 post 请求后返回 302,它会给你任何线索吗?
  • 我已经为我测试过它的工作,你能不能只测试上面的代码只是发布请求数据,可能你的 GET 调用代码有问题,
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多