在Node.js中使用HTTP.request时一直收到"Bad Request"错误

4
我刚刚安装了Node.js,可能是我错过了什么,但我正在尝试一个简单的http请求,但却得不到除了400响应以外的任何东西。我尝试了几个主机都没有成功。我从他们的网站安装了Node,但这并没有起作用,所以我通过Homebrew进行了卸载和重新安装,并得到了相同的“400”输出。我特别想知道是否需要在我的Mac上更改某些设置以允许Node发送请求。
操作系统:OSX 10.8.4 Node版本:0.10.13 Homebrew版本:0.9.4
var http = require("http");

var req = http.request({
    host: "http://google.com"
}, function(res){
    if (res.statusCode === 200) console.log(res);
    else console.log(res.statusCode);
});

req.on("error", function(err){
    console.log(err);
});

req.end();

非常感谢任何帮助。谢谢!

3个回答

10

你主机中的http://有些混淆了。尝试将其切换为"www.google.com"。这是一个http请求,不需要重复自己 :)


是的,就是这样!可能是从一个错误的例子中得到的。非常感谢! - Josh R
@JoshR,如果这个回答对你有帮助的话,你应该将其标记为已接受的答案(通过点击绿色复选标志)。 - Brad

1

你尝试过从 host 参数中去掉 http:// 吗?我经常使用 url 工具来处理这类问题。它会自动解析 URL 并将正确的部分传递给 http.request

var url = require('url'),
    link = url.parse('http://www.google.com/');

var req = http.request({
    host: link.hostname,
    path: link.path,
    port: link.port
}, function(res){
    if (res.statusCode === 200) console.log(res);
    else console.log(res.statusCode);
});

此外,我会确保在出现错误时也捕获错误事件。从文档中可以看到:
req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

如果你只需要一个 GET 响应,你也可以使用http.get。来自文档的说明:
http.get("http://www.google.com/index.html", function(res) {
    console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

我来晚了,但“url”实用程序让我省了很多麻烦,即使我已经知道要删除“http://”这一部分。 - MappaGnosis

0
在我的情况下,path参数中缺少前导斜杠。
例如,这样可以正常工作:
http.request({
    host: 'example.com',
    path: '/foo/bar.html',
}, (res) => {...});

但是这个不起作用(出现错误400):

http.request({
    host: 'example.com',
    path: 'foo/bar.html',
}, (res) => {...});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接