Поддержите в node.js использование http для POST - PullRequest
0 голосов
/ 06 ноября 2018

Я уверен, что это простое решение, но я еще не понял его. В Python у нас есть хорошая библиотека для http запросов requests. Теперь это довольно просто в использовании, и я сделал простую программу для проверки концепции:

import requests
s = requests.Session()
r = s.post('website.com',data={login details here})
r = s.post('website.com/something',data={other details})

Это прекрасно работает и делает все, что я хочу, но, к сожалению, это не на том языке, на котором я разрабатывал приложение, для которого я хотел его изначально.

Теперь, конечно, простой POST-запрос не слишком сложен в node.js, но он немного сложнее, и я не могу понять, как набрать keep-alive для второго соединения. Используя приведенный ниже код, я могу получить одно соединение:

var options {
  options here, just know that I sent the keep-alive header
}
var req = http.request(options, function (res){
  console.log('Status: ' + res.statusCode);
  console.log('Headers: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (body) {
    console.log('Body: ' + body);
  });
 });
 req.on('error', function(e) {
   console.log('problem with request: ' + e.message);
 });
 req.write();
 req.end();
}

Хорошо, так что все работает нормально, просто я точно не знаю, что использовать, чтобы сохранить активность и отправить второй запрос. Я думаю, что я должен использовать socket, но я не совсем понимаю документы, так как они очень запутывают меня. При поиске в интернете я не мог найти никого, кто использовал бы поддерживающие связь POST или действительно любое соединение дважды. Я действительно был бы признателен за пример двух разных опций / данных для одного keep-alive соединения.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Нет необходимости использовать дополнительную библиотеку, такую ​​как запрос.

Вместо этого создайте новый объект http.agent, например, так ...

const keepAliveAgent = new http.Agent({ keepAlive: true });

А затем включите его в объект параметров http-запроса, например ...

const requestOptions = {
  agent: keepAliveAgent,
  headers: {
    Connection: 'keep-alive'
  }
  // the rest of your options...
}

const request = https.request(requestOptions, (response) => {
  // handle response here
});

request.write("your request body here"); // if you need to POST/PUT data
request.end();
0 голосов
/ 06 ноября 2018

Если вы хотите использовать http основной модуль, вы должны использовать agent для установки keep-alive.

var myAgent = new http.Agent({
  keepAlive: true,
  maxSockets: 1,
  keepAliveMsecs: 3000
})

затем используйте модуль request и установите его как свойство агента параметра, например, нижеприведенный фрагмент

let url = require('url');
let request = require('request');

request.post({url:'http://website.com/something', agent: myAgent , form: {key:'value'}}, function(err,res,body){
    if(res.statusCode !== 200){
        console.log('err');
    } else {
        //set header cookie from response and send second request
    }
})

для установки второго заголовка cookie-запроса из машины ответа: this

...