0

ベアラー トークンがあり、次のコードを使用してプロキシの背後からユーザーのタイムラインを取得しようとしています。

var parsedUrl = url.parse( 'https://api.twitter.com/1.1/statuses/user_timeline.json:443/?count=2&screen_name=twitterapi', true, true );
var options = {
    'host': parsedUrl.host,
    'path': parsedUrl.path,
    'method': 'GET',
    'headers': {
        'Host': parsedUrl.host,
        'Authorization': 'Bearer ' + settings.accessToken
    }
};

var adapter = https;
if(settings.proxy)
{
    options.host = settings.proxy;
    options.port = settings.proxyPort;
    options.path = parsedUrl.path;

    options.headers['Proxy-Connection'] = 'Keep-Alive';

    adapter = http;
}

var body = '';
var req = adapter.request(options, function(res) {

    res.on('data', function (chunk) {
        body += chunk;
    });

    res.on('end', function () {
        try
        {
            var result = JSON.parse( body );
        }
        catch(ex)
        {
         //...
        }
    });

});
req.end();

このリクエストは、本文やエラー メッセージなしで常に 400 を返します。cUrl でアクセスを試すと、魅力的に機能します。同じ方法でベアラー トークンを取得します。Twitter が 400 で応答するのはなぜですか?

curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: Bearer <token>' --verbose --proxy http://proxy.example.com:8080

cUrl の違いは何ですか?

編集: ステータス コードは 404 ではなく 400 です! ごめん。

EDIT2: Authorization ヘッダーを省略しても、認証に失敗したというメッセージが表示されるはずですが、400 が返されます。特別なエンコンディングは必要ですか?

EDIT3:ステータスコードは401になりました。何か臭いが続きます:(

4

1 に答える 1

1

秘訣は次のとおりです。プロキシを通過するには、CONNECT を使用して HTTP 要求で HTTPS 接続をトンネリングする必要があります。最初の方法が間違っています。

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

var connectReq = http.request({ // establishing a tunnel
  host: 'localhost',
  port: 3128,
  method: 'CONNECT',
  path: 'github.com:443',
}).on('connect', function(res, socket, head) {
  // should check res.statusCode here
  var req = https.get({
    host: 'github.com',
    socket: socket, // using a tunnel
    agent: false    // cannot use a default agent
  }, function(res) {
    res.setEncoding('utf8');
    res.on('data', console.log);
  });
}).end();

詳細については、次の node.js バグ/問題を参照してください: HTTPS 要求がプロキシで機能しない

于 2013-07-15T08:54:18.233 に答える