[http] node.js http.Client에서 http 프록시를 사용하려면 어떻게해야합니까?

standard을 사용하여 node.js에서 나가는 HTTP 호출을 만들고 싶습니다 http.Client. 그러나 네트워크에서 직접 원격 서버에 연결할 수 없으므로 프록시를 거쳐야합니다.

node.js가 프록시를 사용하도록하려면 어떻게해야합니까?



답변

Tim Macfarlane답변 은 HTTP 프록시 사용과 관련하여 가깝습니다.

비보안 요청에 HTTP 프록시를 사용하는 것은 매우 간단합니다. 경로 부분에 전체 URL이 포함되고 호스트 헤더가 연결하려는 호스트로 설정되는 것을 제외하고 프록시에 연결하고 정상적으로 요청합니다.
Tim은 그의 대답에 매우 가까웠지만 호스트 헤더를 올바르게 설정하지 못했습니다.

var http = require("http");

var options = {
  host: "proxy",
  port: 8080,
  path: "http://www.google.com",
  headers: {
    Host: "www.google.com"
  }
};
http.get(options, function(res) {
  console.log(res);
  res.pipe(process.stdout);
});

레코드의 경우 그의 대답은 http://nodejs.org/에서 작동 하지만 서버가 호스트 헤더를 신경 쓰지 않기 때문입니다.


답변

request 를 사용할 수 있습니다 . 방금 하나의 외부 “proxy”매개 변수를 사용하여 node.js에서 프록시를 사용하는 것이 믿을 수 없을 정도로 쉽다는 것을 알았습니다. 더 많은 HTTP 프록시를 통해 HTTPS를 지원합니다.

var request = require('request');

request({
  'url':'https://anysite.you.want/sub/sub',
  'method': "GET",
  'proxy':'http://yourproxy:8087'
},function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
})


답변

https 서버로 프록시를 시도하는 경우에도 ‘http’를 사용하여 프록시에 액세스하는 데 시간이 걸렸습니다. 이것은 Charles (osx 프로토콜 분석기)를 사용하여 저에게 효과적입니다.

var http = require('http');

http.get ({
    host: '127.0.0.1',
    port: 8888,
    path: 'https://www.google.com/accounts/OAuthGetRequestToken'
}, function (response) {
    console.log (response);
});


답변

여기서 @Renat에서 이미 언급했듯이 프록시 된 HTTP 트래픽은 일반적인 HTTP 요청에서 발생합니다. 목적지 의 전체 URL 을 경로로 전달하여 프록시에 대해 요청 하십시오.

var http = require ('http');

http.get ({
    host: 'my.proxy.com',
    port: 8080,
    path: 'http://nodejs.org/'
}, function (response) {
    console.log (response);
});


답변

https://www.npmjs.org/package/global-tunnel 이 모듈을 추가하겠다고 생각 했습니다.

require('global-tunnel').initialize({
  host: '10.0.0.10',
  port: 8080
});

이 작업을 한 번 수행하면 응용 프로그램의 모든 http (및 https)가 프록시를 거치게됩니다.

또는 전화

require('global-tunnel').initialize();

http_proxy환경 변수를 사용합니다


답변

나는 개인 프록시 서버를 샀다.

255.255.255.255 // IP address of proxy server
99999 // port of proxy server
username // authentication username of proxy server
password // authentication password of proxy server

그리고 나는 그것을 사용하고 싶었습니다. 첫 번째 답변두 번째 답변 은 http (proxy)-> http (destination)에서만 작동했지만 http (proxy)-> https (destination)을 원했습니다.

그리고 https 대상의 경우 HTTP 터널을 직접 사용하는 것이 좋습니다 . 여기 에서 해결책을 찾았 습니다 . 최종 코드 :

const http = require('http')
const https = require('https')
const username = 'username'
const password = 'password'
const auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64')

http.request({
  host: '255.255.255.255', // IP address of proxy server
  port: 99999, // port of proxy server
  method: 'CONNECT',
  path: 'kinopoisk.ru:443', // some destination, add 443 port for https!
  headers: {
    'Proxy-Authorization': auth
  },
}).on('connect', (res, socket) => {
  if (res.statusCode === 200) { // connected to proxy server
    https.get({
      host: 'www.kinopoisk.ru',
      socket: socket,    // using a tunnel
      agent: false,      // cannot use a default agent
      path: '/your/url'  // specify path to get from server
    }, (res) => {
      let chunks = []
      res.on('data', chunk => chunks.push(chunk))
      res.on('end', () => {
        console.log('DONE', Buffer.concat(chunks).toString('utf8'))
      })
    })
  }
}).on('error', (err) => {
  console.error('error', err)
}).end()


답변

‘요청’http 패키지에는 다음 기능이있는 것 같습니다.

https://github.com/mikeal/request

예를 들어, 아래의 ‘r’요청 객체는 localproxy를 사용하여 요청에 액세스합니다.

var r = request.defaults({'proxy':'http://localproxy.com'})

http.createServer(function (req, resp) {
  if (req.url === '/doodle.png') {
    r.get('http://google.com/doodle.png').pipe(resp)
  }
})

불행히도 “전역”기본값은 없으므로이를 사용하는 lib 사용자는 lib가 http 옵션을 통과하지 않으면 프록시를 수정할 수 없습니다 …

크리스, HTH