Node.JS http get请求返回undefined

时间:2017-09-08 22:22:47

标签: node.js httprequest http-proxy

这应该是非常简单的,但我没有得到数据,而是未定义。

我在代理服务器后面,我不擅长从代理服务器后面发出请求。我发现只有一个教程解释了在不使用外部模块的情况下使用代理服务器时的http请求,并且没有正确解释。

const http = require('http');
let options = {
    host: '10.7.0.1',
    port:8080,
    path:'www.google.co.uk'
}

http.get(options,(res) => {
    let str = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
    str += chunk;
})

res.on('end', (str) => {
    console.log(str);
    })
})

10.7.0.1是代理服务器的地址,8080是端口。

此代码的输出未定义。

我甚至不知道方法是否正确,我无法弄明白。我阅读了节点http docs,并根据我的理解编写了选项对象,如果我错了,请纠正我。< / p>

一般来说,如何在代理服务器后面发出请求。

2 个答案:

答案 0 :(得分:0)

重要

如果您想使用http连接到代理,请看这个,您需要使用connect方法

const options = {
    port: 8080,
    hostname: '10.7.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
console.log('got connected!');

socket.write('GET / HTTP/1.1\r\n' +
             'Host: www.google.com:80\r\n' +
             'Connection: close\r\n' +
             '\r\n');
socket.on('data', (chunk) => {
  console.log(chunk.toString());
});
socket.on('end', () => {
  proxy.close();
}

附加信息(不需要)

这是我在here关于如何创建代理并在其后面发出请求的完整代码。它基本上是创建一个服务器并通过它发出请求。

const http = require('http');
const net = require('net');
const url = require('url');

// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, cltSocket, head) => {
  // connect to an origin server
  const srvUrl = url.parse(`http://${req.url}`);
  const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    srvSocket.write(head);
    srvSocket.pipe(cltSocket);
    cltSocket.pipe(srvSocket);
  });
});

// now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {

  // make a request to a tunneling proxy
  const options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('got connected!');

    // make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});

它正在通过http.createServer()创建服务器,然后在完成后开始使用proxy.listen()进行监听,使用http {1}}方法进行连接,并在套接字上写入简单获取请求,并将其发送到谷歌,因为它是指定的路径。

答案 1 :(得分:0)

request包允许以一种非常优雅的方式发出一个http请求,对于指定代理,只需要在options对象请求所使用的内部设置proxy键的值即可作为参数。

const request = require('request');

request({url: 'http://example.com', proxy: 'https://host:port'}, (error, response, body) => {
  //Do whatever you want
});