Come viene effettuata una richiesta POST HTTP in node.js?


946

Come posso effettuare una richiesta POST HTTP in uscita, con dati, in node.js?


16
Come suggerito nella risposta di Jed Watson , consiglio vivamente di utilizzare la richiesta a meno che tu non stia scrivendo un'API di basso livello.
namuol,

4
Si potrebbe semplicemente usare node-fetchquale è un'implementazione del fetchmetodo JavaScript nativo per effettuare richieste HTTP.
Fez Vrasta,

Questo post illustra gli scenari di utilizzo di base per l'utilizzo della richiesta. blog.modulus.io/node.js-tutorial-how-to-use-request-module
Shaswat Rungta

Risposte:


855

Ecco un esempio dell'utilizzo di node.js per effettuare una richiesta POST all'API del compilatore di Google:

// We need this to build our post string
var querystring = require('querystring');
var http = require('http');
var fs = require('fs');

function PostCode(codestring) {
  // Build the post string from an object
  var post_data = querystring.stringify({
      'compilation_level' : 'ADVANCED_OPTIMIZATIONS',
      'output_format': 'json',
      'output_info': 'compiled_code',
        'warning_level' : 'QUIET',
        'js_code' : codestring
  });

  // An object of options to indicate where to post to
  var post_options = {
      host: 'closure-compiler.appspot.com',
      port: '80',
      path: '/compile',
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(post_data)
      }
  };

  // Set up the request
  var post_req = http.request(post_options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
          console.log('Response: ' + chunk);
      });
  });

  // post the data
  post_req.write(post_data);
  post_req.end();

}

// This is an async file read
fs.readFile('LinkedList.js', 'utf-8', function (err, data) {
  if (err) {
    // If this were just a small part of the application, you would
    // want to handle this differently, maybe throwing an exception
    // for the caller to handle. Since the file is absolutely essential
    // to the program's functionality, we're going to exit with a fatal
    // error instead.
    console.log("FATAL An error occurred trying to read in the file: " + err);
    process.exit(-2);
  }
  // Make sure there's data before we post it
  if(data) {
    PostCode(data);
  }
  else {
    console.log("No data to post");
    process.exit(-1);
  }
});

Ho aggiornato il codice per mostrare come pubblicare i dati da un file, invece della stringa codificata. Utilizza il fs.readFilecomando asincrono per raggiungere questo obiettivo, pubblicando il codice effettivo dopo una lettura corretta. Se c'è un errore, viene generato e se non ci sono dati il ​​processo esce con un valore negativo per indicare un errore.


4
L'intestazione della lunghezza del contenuto è calcolata correttamente? Si suppone che siano byte, giusto?
Eric

7
Nota che querystring.stringify() non supporta gli oggetti nidificati , quindi potresti voler usare qs.stringify()invece.
johndodo,

51
Content-Lengthè byte e non necessariamente lunghezza della stringa (UTF-16 ecc.). L'uso Buffer.byteLength(data)sarà sempre corretto.
Greenimpala,

4
per l'invio di postdata standard, l'oggetto in querystring.stringifydovrebbe essere il proprio oggetto dati, non la posta indesiderata visualizzata in questa risposta (che può essere utile per oggetti basati su file?). Sono rimasto bloccato per anni ... stackoverflow.com/questions/9768192/… ha fornito la mia soluzione completa
RozzA

7
Gotcha: se stai utilizzando un sito crittografato con SSL, avrai bisogno della libreria "https". Non puoi semplicemente cambiare la porta in 443.
Dave Collins,

1137

Questo diventa molto più semplice se si utilizza la libreria di richieste .

var request = require('request');

request.post(
    'http://www.yoursite.com/formpage',
    { json: { key: 'value' } },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
    }
);

Oltre a fornire una buona sintassi, semplifica le richieste json, gestisce la firma oauth (per Twitter, ecc.), Può eseguire moduli multi-parte (ad esempio per caricare file) e lo streaming.

Per installare la richiesta utilizzare il comando npm install request


153
{form: {chiave: 'valore'}} deve essere sostituito da {json: {chiave: 'valore'}} (poiché la domanda non è specifica per i moduli). Bisogna anche capire 'form' e 'json' sono parole chiave della libreria di richiesta e non fanno parte dei dati personalizzati (per quanto banale possa apparire questo ultimo commento, mi ci è voluto del tempo per capirlo ...)
blacelle

7
Continuo a tornare a questa domanda e risposta. Dovrebbe davvero essere la "risposta" alla domanda.
Spencer Kormos il

6
Ti meriti un distintivo d'oro puramente per questa risposta. È molto più utile di quello accettato ... ed esisteva già nel 2012? Wow
Zoltán Schmidt,

3
potresti dover aggiungere dipendenza eseguendo questo comando 'npm install --save request'
Shady Sherif

18
Questa libreria è stata deprecata.
Evorlor,

138

È possibile utilizzare la libreria di richieste. https://www.npmjs.com/package/request

var request = require('request');

Per pubblicare dati JSON:

var myJSONObject = { ... };
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    json: true,   // <--Very important!!!
    body: myJSONObject
}, function (error, response, body){
    console.log(response);
});

Per pubblicare dati XML:

var myXMLText = '<xml>...........</xml>'
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    headers: {
        "content-type": "application/xml",  // <--Very important!!!
    },
    body: myXMLText
}, function (error, response, body){
    console.log(response);
});

Dopo la revisione nella loro documentazione. indica quanto segue: json: imposta body ma su JSON la rappresentazione di valore e aggiunge Content-type: application / json header. Inoltre, analizza il corpo della risposta come JSON. Ciò significa che quando json = true, imposterà intestazione, json e body. Altrimenti, nessuna intestazione è impostata e analizza come testo. (Come nell'esempio XML sopra). Ciò rende l'API di richiesta a portata di mano e semplicistica ma piuttosto difficile da capire per la prima volta.
Josiah Choi,

È tecnicamente nei loro documenti, ma nessuno degli esempi lo mostra - solo i dati dei moduli. È un ago nel pagliaio e, in quanto tale, è una grande ommissione, poiché questo è il secondo modo più frequente in cui uso ajax in JS, mai, e sicuramente uno dei più comuni sul web.
Kyle Baker,

L'uso di request.post è IMO un po 'più semplice che specificare POST come metodo. Ecco alcuni esempi di GitHub per l'utilizzo di request.post
drorw il

12
Questa libreria è stata deprecata.
Evorlor,

44

Uso Restler e Needle per scopi di produzione. Sono entrambi molto più potenti della richiesta http nativa. È possibile richiedere con autenticazione di base, voce di intestazione speciale o persino caricare / scaricare file.

Per quanto riguarda l'operazione post / get, sono anche molto più semplici da usare rispetto alle chiamate ajax non elaborate che utilizzano httprequest.

needle.post('https://my.app.com/endpoint', {foo:'bar'}, 
    function(err, resp, body){
        console.log(body);
});

Ho provato richiesta, nodo-modulo-dati e superagente prima dell'ago. ago è stato l'unico che ha funzionato correttamente per me quando ho provato a fare un caricamento di file in più moduli.
Paul Young,

35

Semplice e senza dipendenze. Utilizza una promessa in modo da poter attendere il risultato. Restituisce il corpo della risposta e non controlla il codice di stato della risposta.

const https = require('https');

function httpsPost({body, ...options}) {
    return new Promise((resolve,reject) => {
        const req = https.request({
            method: 'POST',
            ...options,
        }, res => {
            const chunks = [];
            res.on('data', data => chunks.push(data))
            res.on('end', () => {
                let body = Buffer.concat(chunks);
                switch(res.headers['content-type']) {
                    case 'application/json':
                        body = JSON.parse(body);
                        break;
                }
                resolve(body)
            })
        })
        req.on('error',reject);
        if(body) {
            req.write(body);
        }
        req.end();
    })
}

Uso:

const res = await httpsPost({
    hostname: 'sentry.io',
    path: `/api/0/organizations/org/releases/${changesetId}/deploys/`,
    headers: {
        'Authorization': `Bearer ${process.env.SENTRY_AUTH_TOKEN}`,
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        environment: isLive ? 'production' : 'demo',
    })
})

A cosa serve il writemetodo on req,write()?
Ari,

@Ari che scrive il corpo della richiesta ... nodejs.org/api/…
mpen

21

Puoi anche usare Requestify , un client HTTP davvero interessante e semplice che ho scritto per nodeJS + che supporta la memorizzazione nella cache.

Basta fare quanto segue:

    var requestify = require('requestify');

    requestify.post('http://example.com', {
        hello: 'world'
    })
    .then(function(response) {
        // Get the response body (JSON parsed or jQuery object for XMLs)
        response.getBody();
    });

1
Non funziona per me, vedi il problema qui: github.com/ranm8/requestify/issues/2
Erel Segal-Halevi

20

Aggiornamento 2020:

Mi sono davvero divertito con phin : il client HTTP Node.js ultraleggero

Può essere utilizzato in due modi diversi. Uno con Promises (Async / Await) e l'altro con i tradizionali stili di callback.

Installa tramite: npm i phin

Direttamente dal suo README con await:

const p = require('phin')

await p({
    url: 'https://ethanent.me',
    method: 'POST',
    data: {
        hey: 'hi'
    }
})


Stile non sollecitato (richiamata):

const p = require('phin').unpromisified

p('https://ethanent.me', (err, res) => {
    if (!err) console.log(res.body)
})

A partire dal 2015 ora ci sono una vasta gamma di librerie diverse che possono farlo con una codifica minima. Preferisco di gran lunga le librerie leggere ed eleganti per le richieste HTTP a meno che tu non abbia assolutamente bisogno del controllo delle cose HTTP di basso livello.

Una di queste librerie è Unirest

Per installarlo, utilizzare npm.
$ npm install unirest

E Hello, World!sull'esempio a cui tutti sono abituati.

var unirest = require('unirest');

unirest.post('http://example.com/helloworld')
.header('Accept', 'application/json')
.send({ "Hello": "World!" })
.end(function (response) {
  console.log(response.body);
});


Extra:
molte persone stanno anche suggerendo l'uso della richiesta [2]

Vale la pena notare che dietro le quinte si Unirestutilizza la requestlibreria.

Unirest fornisce metodi per accedere direttamente all'oggetto richiesta.

Esempio:

var Request = unirest.get('http://mockbin.com/request');

1
Un altro che ho scoperto che sembra piuttosto buono è github.com/request/request che sembra un po 'più popolare di quanto non lo sia almeno al momento della stesura di questo
Lochlan,

Posso attestare di richiedere. È un'ottima biblioteca. Trovo che la richiesta offra funzionalità di livello più basso, quindi è opportuno utilizzarla per applicazioni specifiche. Quando non mi interessa necessariamente le cose di basso livello, trovo che Unirest sia adeguato.
Levi Roberts,

Perché unirest sarebbe considerato leggero quando dipende dalla richiesta? La richiesta stessa ha 22 dipendenze, non vedo quanto sia leggero
raphadko il

@raphadko Sono sicuro che nel corso degli anni si sia verificata un'eccessiva funzionalità. Assicurati di controllare il timestamp di quando ho pubblicato la mia risposta;)
Levi Roberts,

17
var https = require('https');


/**
 * HOW TO Make an HTTP Call - POST
 */
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
    "message" : "The web of things is approaching, let do some tests to be ready!",
    "name" : "Test message posted with node.js",
    "caption" : "Some tests with node.js",
    "link" : "http://www.youscada.com",
    "description" : "this is a description",
    "picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
    "actions" : [ {
        "name" : "youSCADA",
        "link" : "http://www.youscada.com"
    } ]
});

// prepare the header
var postheaders = {
    'Content-Type' : 'application/json',
    'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};

// the post options
var optionspost = {
    host : 'graph.facebook.com',
    port : 443,
    path : '/youscada/feed?access_token=your_api_key',
    method : 'POST',
    headers : postheaders
};

console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');

// do the POST call
var reqPost = https.request(optionspost, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);

    res.on('data', function(d) {
        console.info('POST result:\n');
        process.stdout.write(d);
        console.info('\n\nPOST completed');
    });
});

// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
    console.error(e);
});

c'è un modo per visualizzare il corpo del post di richiesta sulla richiesta o sulla risposta?
jacoballenwood,

17

Esistono dozzine di librerie open source disponibili che è possibile utilizzare per effettuare una richiesta POST HTTP in Nodo.

1. Axios (consigliato)

const axios = require('axios');

const data = {
    name: 'John Doe',
    job: 'Content Writer'
};

axios.post('https://reqres.in/api/users', data)
    .then((res) => {
        console.log(`Status: ${res.status}`);
        console.log('Body: ', res.data);
    }).catch((err) => {
        console.error(err);
    });

2. Ago

const needle = require('needle');

const data = {
    name: 'John Doe',
    job: 'Content Writer'
};

needle('post', 'https://reqres.in/api/users', data, {json: true})
    .then((res) => {
        console.log(`Status: ${res.statusCode}`);
        console.log('Body: ', res.body);
    }).catch((err) => {
        console.error(err);
    });

3. Richiesta

const request = require('request');

const options = {
    url: 'https://reqres.in/api/users',
    json: true,
    body: {
        name: 'John Doe',
        job: 'Content Writer'
    }
};

request.post(options, (err, res, body) => {
    if (err) {
        return console.log(err);
    }
    console.log(`Status: ${res.statusCode}`);
    console.log(body);
});

4. Modulo HTTPS nativo

const https = require('https');

const data = JSON.stringify({
    name: 'John Doe',
    job: 'Content Writer'
});

const options = {
    hostname: 'reqres.in',
    path: '/api/users',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length
    }
};


const req = https.request(options, (res) => {
    let data = '';

    console.log('Status Code:', res.statusCode);

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

    res.on('end', () => {
        console.log('Body: ', JSON.parse(data));
    });

}).on("error", (err) => {
    console.log("Error: ", err.message);
});

req.write(data);
req.end();

Per i dettagli, consulta questo articolo .


14

Questo è il modo più semplice che uso per fare una richiesta: usando il modulo 'request'.

Comando per installare il modulo 'request':

$ npm install request

Codice di esempio:

var request = require('request')

var options = {
  method: 'post',
  body: postData, // Javascript object
  json: true, // Use,If you are sending JSON data
  url: url,
  headers: {
    // Specify headers, If any
  }
}

request(options, function (err, res, body) {
  if (err) {
    console.log('Error :', err)
    return
  }
  console.log(' Body :', body)

});

Puoi anche usare il modulo 'http' integrato di Node.js per effettuare la richiesta.


1
Questa libreria è stata deprecata.
Yuri Tkachenko,

12

Mi piace la semplicità di superagent ( https://github.com/visionmedia/superagent ). Stessa API sia sul nodo che sul browser.

;(async function() {
  var response = await superagent.post('http://127.0.0.1:8125/', {age: 2})
  console.log(response)
})

C'è anche node-fetch ( https://www.npmjs.com/package/node-fetch ), che ha un'API che corrisponde fetchai browser - tuttavia ciò richiede la codifica manuale della stringa di query, non gestisce automaticamente i tipi di contenuto, o così fa qualsiasi altro superagente di lavoro.


1
E in contrasto con ago, unirest e co, offre leggerezza (superagente: 16k, non più: 1M, ago: 530K)
Lars

9

Se stai cercando richieste HTTP basate su promesse, axios fa bene il suo lavoro.

  const axios = require('axios');

  axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'})
      .then((response) => console.log(response))
      .catch((error) => console.log(error));

O

await axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'})

6

Per
inviare richieste di riposo / JSON Possiamo semplicemente usare il pacchetto di richiesta e salvare i valori che dobbiamo inviare nella variabile Json.

Prima installa il pacchetto richiesto nella tua console con la richiesta di installazione di npm --save

var request = require('request');

    var options={
                'key':'28',
                'key1':'value',
                'key2':'value'
                }

    request({
             url:"http://dev.api.ean.com/ean-services/rs/hotel/v3/ping?                      
                 minorRev="+options.key+
                 "&cid="+options.key1+
                 "&apiKey="+options.key2,
             method:"POST",
             json:true},function(error,response,body){
                     console.log(body)
               }
    );

2
Non creare mai la tua stringa di query. Stai trascurando di codificare correttamente i tuoi valori. Node.js ha una libreria proprio per questo scopo: nodejs.org/api/querystring.html
Brad

Questa libreria è stata deprecata.
Yuri Tkachenko,

4

Ho trovato un video che spiega come raggiungere questo obiettivo: https://www.youtube.com/watch?v=nuw48-u3Yrg

Utilizza il modulo "http" predefinito insieme ai moduli "querystring" e "stringbuilder". L'applicazione accetta due numeri (utilizzando due caselle di testo) da una pagina Web e, al momento dell'invio, restituisce la somma di questi due (insieme alla persistenza dei valori nelle caselle di testo). Questo è il miglior esempio che ho potuto trovare altrove.

var http = require("http");
var qs = require("querystring");
var StringBuilder = require("stringbuilder");

var port = 9000;

function getCalcHtml(req, resp, data) {
    var sb = new StringBuilder({ newline: "\r\n" });
    sb.appendLine("<html>");
    sb.appendLine(" <body>");
    sb.appendLine("     <form method='post'>");
    sb.appendLine("         <table>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter First No: </td>");

    if (data && data.txtFirstNo) {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' value='{0}'/></td>", data.txtFirstNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter Second No: </td>");

    if (data && data.txtSecondNo) {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' value='{0}'/></td>", data.txtSecondNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td><input type='submit' value='Calculate' /></td>");
    sb.appendLine("             </tr>");

    if (data && data.txtFirstNo && data.txtSecondNo) {
        var sum = parseInt(data.txtFirstNo) + parseInt(data.txtSecondNo);
        sb.appendLine("             <tr>");
        sb.appendLine("                 <td>Sum: {0}</td>", sum);
        sb.appendLine("             </tr>");
    }

    sb.appendLine("         </table>");
    sb.appendLine("     </form>")
    sb.appendLine(" </body>");
    sb.appendLine("</html>");
    sb.build(function (err, result) {
        resp.write(result);
        resp.end();
    });
}

function getCalcForm(req, resp, data) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    getCalcHtml(req, resp, data);
}

function getHome(req, resp) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>Home</title></head><body>Want to some calculation? Click <a href='/calc'>here</a></body></html>");
    resp.end();
}

function get404(req, resp) {
    resp.writeHead(404, "Resource Not Found", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>404</title></head><body>404: Resource not found. Go to <a href='/'>Home</a></body></html>");
    resp.end();
}

function get405(req, resp) {
    resp.writeHead(405, "Method not supported", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>405</title></head><body>405: Method not supported</body></html>");
    resp.end();
}

http.createServer(function (req, resp) {
    switch (req.method) {
        case "GET":
            if (req.url === "/") {
                getHome(req, resp);
            }
            else if (req.url === "/calc") {
                getCalcForm(req, resp);
            }
            else {
                get404(req, resp);
            }
            break;
        case "POST":
            if (req.url === "/calc") {
                var reqBody = '';
                req.on('data', function (data) {
                    reqBody += data;
                    if (reqBody.length > 1e7) { //10MB
                        resp.writeHead(413, 'Request Entity Too Large', { 'Content-Type': 'text/html' });
                        resp.end('<!doctype html><html><head><title>413</title></head><body>413: Request Entity Too Large</body></html>');
                    }
                });
                req.on('end', function () {
                    var formData = qs.parse(reqBody);
                    getCalcForm(req, resp, formData);
                });
            }
            else {
                get404(req, resp);
            }
            break;
        default:
            get405(req, resp);
            break;
    }
}).listen(port);

4

Questa è la mia soluzione per POSTe GET.

Informazioni sul Postmetodo:

Se il corpo è un oggetto JSON, quindi è importante deserializzarlo con JSON.stringifye possibilmente impostare l' Content-Lenghtintestazione di conseguenza:

      var bodyString=JSON.stringify(body)
      var _headers = {
        'Content-Length': Buffer.byteLength(bodyString)
      };

prima di scriverlo alla richiesta:

request.write( bodyString );

Informazioni su entrambi Gete Postmetodi:

La timeoutsi può verificare in socketdisconnessione, quindi è necessario registrare il proprio gestore come:

request.on('socket', function (socket) {
        socket.setTimeout( self.timeout );
        socket.on('timeout', function() {
            request.abort();
            if(timeout) return timeout( new Error('request timed out') );
        });
    });

mentre il requestgestore lo è

       request.on('timeout', function () {
          // Timeout happend. Server received request, but not handled it
          // (i.e. doesn't send any response or it took to long).
          // You don't know what happend.
          // It will emit 'error' message as well (with ECONNRESET code).
          req.abort();
          if(timeout) return timeout( new Error('request timed out') );
        });

Consiglio vivamente di registrare entrambi i gestori.

Il corpo della risposta è suddiviso in blocchi, quindi è necessario concatenare blocchi al datagestore:

      var body = '';
      response.on('data', function(d) {
          body += d;
      });

Alla endil bodyconterrà tutto il corpo di risposta:

      response.on('end', function() {
        try {
            var jsonResponse=JSON.parse(body);
            if(success) return success( jsonResponse );
        } catch(ex) { // bad json
          if(error) return error(ex.toString());
        }
      });

È sicuro avvolgere con un try... catch theJSON.parse` poiché non si può essere sicuri che sia effettivamente un json ben formattato e non c'è modo di esserne sicuri al momento in cui si fa la richiesta.

Modulo: SimpleAPI

/**
 * Simple POST and GET
 * @author Loreto Parisi (loretoparisi at gmail dot com)
*/
(function() {

  var SimpleAPI;

  SimpleAPI = (function() {

    var qs = require('querystring');

    /**
     * API Object model
     * @author Loreto Parisi (loretoparisi at gmail dot com)
     */
    function SimpleAPI(host,port,timeout,ssl,debug,json) {

      this.host=host;
      this.port=port;
      this.timeout=timeout;
      /** true to use ssl - defaults to true */
      this.ssl=ssl || true;
      /** true to console log */
      this.debug=debug;
      /** true to parse response as json - defaults to true */
      this.json= (typeof(json)!='undefined')?json:true;
      this.requestUrl='';
      if(ssl) { // use ssl
          this.http = require('https');
      } else { // go unsafe, debug only please
          this.http = require('http');
      }
    }

    /**
     * HTTP GET
     * @author Loreto Parisi (loretoparisi at gmail dot com)
     */
    SimpleAPI.prototype.Get = function(path, headers, params, success, error, timeout) {

      var self=this;
      if(params) {
        var queryString=qs.stringify(params);
        if( queryString ) {
          path+="?"+queryString;
        }
      }
      var options = {
        headers : headers,
        hostname: this.host,
        path: path,
        method: 'GET'
      };
      if(this.port && this.port!='80') { // port only if ! 80
        options['port']=this.port;
      }
      if(self.debug) {
        console.log( "SimpleAPI.Get", headers, params, options );
      }
      var request=this.http.get(options, function(response) {

          if(self.debug) { // debug
            console.log( JSON.stringify(response.headers) );
          }

          // Continuously update stream with data
          var body = '';
          response.on('data', function(d) {
              body += d;
          });
          response.on('end', function() {
            try {
              if(self.json) {
                var jsonResponse=JSON.parse(body);
                if(success) return success( jsonResponse );
              }
              else {
                if(success) return success( body );
              }
            } catch(ex) { // bad json
              if(error) return error( ex.toString() );
            }
          });
        });
        request.on('socket', function (socket) {
            socket.setTimeout( self.timeout );
            socket.on('timeout', function() {
                request.abort();
                if(timeout) return timeout( new Error('request timed out') );
            });
        });
        request.on('error', function (e) {
          // General error, i.e.
          //  - ECONNRESET - server closed the socket unexpectedly
          //  - ECONNREFUSED - server did not listen
          //  - HPE_INVALID_VERSION
          //  - HPE_INVALID_STATUS
          //  - ... (other HPE_* codes) - server returned garbage
          console.log(e);
          if(error) return error(e);
        });
        request.on('timeout', function () {
          // Timeout happend. Server received request, but not handled it
          // (i.e. doesn't send any response or it took to long).
          // You don't know what happend.
          // It will emit 'error' message as well (with ECONNRESET code).
          req.abort();
          if(timeout) return timeout( new Error('request timed out') );
        });

        self.requestUrl = (this.ssl?'https':'http') + '://' + request._headers['host'] + request.path;
        if(self.debug) {
          console.log("SimpleAPI.Post",self.requestUrl);
        }
        request.end();
    } //RequestGet

    /**
     * HTTP POST
     * @author Loreto Parisi (loretoparisi at gmail dot com)
     */
    SimpleAPI.prototype.Post = function(path, headers, params, body, success, error, timeout) {
      var self=this;

      if(params) {
        var queryString=qs.stringify(params);
        if( queryString ) {
          path+="?"+queryString;
        }
      }
      var bodyString=JSON.stringify(body)
      var _headers = {
        'Content-Length': Buffer.byteLength(bodyString)
      };
      for (var attrname in headers) { _headers[attrname] = headers[attrname]; }

      var options = {
        headers : _headers,
        hostname: this.host,
        path: path,
        method: 'POST',
        qs : qs.stringify(params)
      };
      if(this.port && this.port!='80') { // port only if ! 80
        options['port']=this.port;
      }
      if(self.debug) {
        console.log( "SimpleAPI.Post\n%s\n%s", JSON.stringify(_headers,null,2), JSON.stringify(options,null,2) );
      }
      if(self.debug) {
        console.log("SimpleAPI.Post body\n%s", JSON.stringify(body,null,2) );
      }
      var request=this.http.request(options, function(response) {

          if(self.debug) { // debug
            console.log( JSON.stringify(response.headers) );
          }

          // Continuously update stream with data
          var body = '';
          response.on('data', function(d) {
              body += d;
          });
          response.on('end', function() {
            try {
                console.log("END", body);
                var jsonResponse=JSON.parse(body);
                if(success) return success( jsonResponse );
            } catch(ex) { // bad json
              if(error) return error(ex.toString());
            }
          });

        });

        request.on('socket', function (socket) {
            socket.setTimeout( self.timeout );
            socket.on('timeout', function() {
                request.abort();
                if(timeout) return timeout( new Error('request timed out') );
            });
        });
        request.on('error', function (e) {
          // General error, i.e.
          //  - ECONNRESET - server closed the socket unexpectedly
          //  - ECONNREFUSED - server did not listen
          //  - HPE_INVALID_VERSION
          //  - HPE_INVALID_STATUS
          //  - ... (other HPE_* codes) - server returned garbage
          console.log(e);
          if(error) return error(e);
        });
        request.on('timeout', function () {
          // Timeout happend. Server received request, but not handled it
          // (i.e. doesn't send any response or it took to long).
          // You don't know what happend.
          // It will emit 'error' message as well (with ECONNRESET code).
          req.abort();
          if(timeout) return timeout( new Error('request timed out') );
        });

        self.requestUrl = (this.ssl?'https':'http') + '://' + request._headers['host'] + request.path;
        if(self.debug) {
          console.log("SimpleAPI.Post",self.requestUrl);
        }

        request.write( bodyString );
        request.end();

    } //RequestPost

    return SimpleAPI;

  })();

  module.exports = SimpleAPI

}).call(this);

Uso:

// Parameters
// domain: example.com
// ssl:true, port:80
// timeout: 30 secs
// debug: true
// json response:true
var api = new SimpleAPI('posttestserver.com', 80, 1000 * 10, true, true, true); 

var headers = {
    'Content-Type' : 'application/json',
    'Accept' : 'application/json' 
};
var params = {
  "dir" : "post-test"
};
var method = 'post.php';

api.Post(method, headers, params, body
    , function(response) { // success
       console.log( response );
    }
    , function(error) { // error
      console.log( error.toString() );
    }
    , function(error) { // timeout
       console.log( new Error('timeout error') );
    });

4

Dopo aver lottato molto durante la creazione di un'utilità di basso livello per gestire il post e ottenere richieste per il mio progetto, ho deciso di pubblicare qui i miei sforzi. Molto sulla linea di risposta accettata, ecco uno snippet per fare richieste POST http e https per l'invio di dati JSON.

const http = require("http")
const https = require("https")

// Request handler function
let postJSON = (options, postData, callback) => {

    // Serializing JSON
    post_data = JSON.stringify(postData)

    let port = options.port == 443 ? https : http

    // Callback function for the request
    let req = port.request(options, (res) => {
        let output = ''
        res.setEncoding('utf8')

        // Listener to receive data
        res.on('data', (chunk) => {
            output += chunk
        });

        // Listener for intializing callback after receiving complete response
        res.on('end', () => {
            let obj = JSON.parse(output)
            callback(res.statusCode, obj)
        });
    });

   // Handle any errors occurred while making request
    req.on('error', (err) => {
        //res.send('error: ' + err.message)
    });

    // Request is made here, with data as string or buffer
    req.write(post_data)
    // Ending the request
    req.end()
};

let callPost = () => {

    let data = {
        'name': 'Jon',
        'message': 'hello, world'
    }

    let options = {
        host: 'domain.name',       // Your domain name
        port: 443,                 // 443 for https and 80 for http
        path: '/path/to/resource', // Path for the request
        method: 'POST',            
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(data)
        }
    }

    postJSON(options, data, (statusCode, result) => {
        // Handle response
        // Process the received data
    });

}

2
Non usi mai i post_data serializzati? la scrittura come oggetto js viene convertita in buffer per impostazione predefinita?
ThatBrianDude,

3
let request = require('request');
let jsonObj = {};
request({
    url: "https://myapii.com/sendJsonData",
    method: "POST",
    json: true,
    body: jsonObj
    }, function (error, resp, body){
       console.log(resp);
});

Oppure potresti usare questa libreria:

let axios = require("axios");
let jsonObj = {};

const myJsonAPI = axios.create({
   baseURL: 'https://myapii.com',
   timeout: 120*1000
});

let response = await myJsonAPI.post("sendJsonData",jsonobj).catch(e=>{
    res.json(e);
});
console.log(response);

requestla libreria è stata deprecata.
Yuri Tkachenko,

3

Axios è un client HTTP basato su promesse per il browser e Node.js. Axios semplifica l'invio di richieste HTTP asincrone agli endpoint REST ed esegue operazioni CRUD. Può essere utilizzato in JavaScript o con una libreria come Vue o React.

const axios = require('axios');

        var dataToPost = {
          email: "your email",
          password: "your password"
        };

        let axiosConfiguration = {
          headers: {
              'Content-Type': 'application/json;charset=UTF-8',
              "Access-Control-Allow-Origin": "*",
          }
        };

        axios.post('endpoint or url', dataToPost, axiosConfiguration)
        .then((res) => {
          console.log("Response: ", res);
        })
        .catch((err) => {
          console.log("error: ", err);
        })

2

Pubblicare un altro esempio axios di una richiesta axios.post che utilizza opzioni di configurazione aggiuntive e intestazioni personalizzate.

var postData = {
  email: "test@test.com",
  password: "password"
};

let axiosConfig = {
  headers: {
      'Content-Type': 'application/json;charset=UTF-8',
      "Access-Control-Allow-Origin": "*",
  }
};

axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
.then((res) => {
  console.log("RESPONSE RECEIVED: ", res);
})
.catch((err) => {
  console.log("AXIOS ERROR: ", err);
})


0

Utilizzando la dipendenza della richiesta .

Soluzione semplice:

 import request from 'request'
 var data = {
        "host":"127.1.1.1",
        "port":9008
    }

request.post( baseUrl + '/peers/connect',
        {
            json: data,  // your payload data placed here
            headers: {
                'X-Api-Key': 'dajzmj6gfuzmbfnhamsbuxivc', // if authentication needed
                'Content-Type': 'application/json' 
            }
        }, function (error, response, body) {
            if (error) {
                callback(error, null)
            } else {
                callback(error, response.body)
            }
        });

3
da dove requestviene?
CodyBugstein,

Questa libreria è stata deprecata.
Yuri Tkachenko,

0

Request-PromiseFornisce una risposta basata sulla promessa. codici di risposta http diversi da 2xx causeranno il rifiuto della promessa. Questo può essere sovrascritto impostando options.simple = false

var options = {
  method: 'POST',
  uri: 'http://api.posttestserver.com/post',
  body: {
  some: 'payload'
 },
  json: true // Automatically stringifies the body to JSON
};

rp(options)
.then(function (parsedBody) {
    // POST succeeded...
})
.catch(function (err) {
    // POST failed...
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.