Wie mache ich einen Remote-REST-Aufruf in Node.js? irgendein CURL?

189

Gibt es in Node.js neben der Verwendung des untergeordneten Prozesses zum Ausführen eines CURL- Aufrufs eine Möglichkeit, einen CURL-Aufruf an die REST- API des Remoteservers durchzuführen und die Rückgabedaten abzurufen?

Ich muss auch den Anforderungsheader für den Remote- REST- Aufruf einrichten und auch die Zeichenfolge in GET (oder POST) abfragen.

Ich finde dieses: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

Es wird jedoch keine Möglichkeit zur POST-Abfragezeichenfolge angezeigt.

Murvinlai
quelle
Ich schrieb diese github.com/jonataswalker/vps-rest-client
Jonatas Walker

Antworten:

211

Ansehen http.request

var options = {
  host: url,
  port: 80,
  path: '/resource?id=foo&bar=baz',
  method: 'POST'
};

http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
}).end();
Raynos
quelle
3
Also, auch wenn es POST ist, füge ich auch Daten in die Abfragezeichenfolge ein?
Murvinlai
3
@ Murvinlai nicht sicher. Lesen Sie die Dokumente, die Quelle und die HTTP-Spezifikation. Kein Experte für diese Region.
Raynos
14
Beachten Sie, dass Sie in Ihrem Hosteintrag weder http noch https einfügen, z. B. var options = {host: graph.facebook.com ....} und nicht {host: http: graph.facebook.com}. Das hat mich für ein paar Zyklen gestolpert. (Siehe unten). Dies sind beide großartige Antworten. Vielen Dank an euch beide.
Binarygiant
9
Kann ich nur darauf hinweisen, dass die Verwendung von res.on ('data', ..) bei langer Antwort nicht ausreicht? Ich glaube, der richtige Weg ist, auch res.on ('end' ..) zu haben, um zu wissen, wann Sie alle Daten erhalten haben. Dann können Sie verarbeiten.
Xerri
3
Dies ist eine sehr alte Antwort - für diejenigen, die heute Knoten js schreiben, würden Sie sicherlich npmjs.com/package/node-fetch oder ein anderes auf der Fetch-API basierendes Paket verwenden, das auf dem Fetch-Standard basiert. Siehe meine Antwort unten.
Saille
95

Wie wäre es mit Request - Simplified HTTP Client .

Bearbeiten Februar 2020: Die Anfrage ist veraltet, sodass Sie sie wahrscheinlich nicht mehr verwenden sollten.

Hier ist ein GET:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
     }
})

OP wollte auch einen POST:

request.post('http://service.com/upload', {form:{key:'value'}})
Matt Frear
quelle
1
Funktioniert gut mit google.com, gibt aber "RequestError: Fehler: Socket auflegen" zurück, wenn die Grafik-API von Facebook angefordert wird. Bitte führen, danke!
Dynamic Remo
Dieses Modul enthält viele Probleme!
Pratik Singhal
Wie kann ich einen Anforderungsparameter übergeben, während ich auf diese Weise eine REST-API verwende?
Vdenotaris
1
Ab dem 11. Februar 2020 ist die Anfrage vollständig veraltet. Sie können es auf der Website github.com/request/request#deprecated
Sadiel
Irgendwelche Anleitungen, was Neulinge verwenden sollten? Ich filtere durch viele Beispiele, die dies verwenden.
Steve3p0
36

Schauen Sie sich http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/ an.

var https = require('https');

/**
 * HOW TO Make an HTTP Call - GET
 */
// options for GET
var optionsget = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsget);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsget, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


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

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});

/**
 * 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);
});

/**
 * Get Message - GET
 */
// options for GET
var optionsgetmsg = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada/feed?access_token=you_api_key', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsgetmsg);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsgetmsg, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


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

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});
Giulio Roggero
quelle
1
Wie greife ich von d auf die Werte zu ??? d = {"data": [{"id": 1111, "name": "peter"}]}. Wie bekomme ich einen Namenswert?
Peter
2
es gelang, Werte mit var thed = JSON.parse (d) zu erhalten; console.log ("die ID ist:" + thed.data [0] .id); Aber irgendwann bekomme ich "Unerwartetes Ende der Eingabe"
Peter
33

Ich verwende Node-Fetch, weil es die bekannte (wenn Sie ein Webentwickler sind) fetch () API verwendet . fetch () ist die neue Methode, um beliebige HTTP-Anforderungen vom Browser aus zu stellen.

Ja, ich weiß, dass dies eine Frage des Knotens ist, aber möchten wir nicht die Anzahl der API-Entwickler reduzieren, die sich unseren Javascript-Code merken und verstehen müssen, und die Wiederverwendbarkeit verbessern? Fetch ist ein Standard. Wie wäre es also, wenn wir uns dem annähern?

Das andere schöne an fetch () ist, dass es ein Javascript- Versprechen zurückgibt , sodass Sie asynchronen Code wie folgt schreiben können:

let fetch = require('node-fetch');

fetch('http://localhost', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{}'
}).then(response => {
  return response.json();
}).catch(err => {console.log(err);});

Fetch ersetzt XMLHTTPRequest . Hier noch ein paar Infos .

Saille
quelle
Problem node-fetchbeim Schreiben von APIs ist, dass nur die vollständige URL funktioniert und nicht mit relativen URLs.
Sebastian
11

Ich habe Restler verwendet, um Webservices aufzurufen, funktioniert wie Charme und ist ziemlich ordentlich.

swapnil_mishra
quelle
5

Axios

Ein Beispiel (axios_example.js) mit Axios in Node.js:

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'the_username',
            password: 'the_password'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

Stellen Sie sicher, dass Sie in Ihrem Projektverzeichnis Folgendes tun:

npm init
npm install express
npm install axios
node axios_example.js

Anschließend können Sie die REST-API von Node.js mit Ihrem Browser unter folgender Adresse testen: http://localhost:5000/search?queryStr=xxxxxxxxx

Ebenso können Sie Beiträge verfassen, z.

axios({
  method: 'post',
  url: 'https://your.service.org/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

SuperAgent

Ebenso können Sie SuperAgent verwenden.

superagent.get('https://your.service.org?query=xxxx')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

Und wenn Sie eine grundlegende Authentifizierung durchführen möchten:

superagent.get('https://your.service.org?query=xxxx')
.auth('the_username', 'the_password')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

Ref:

Yuci
quelle
5

So verwenden Sie die neuesten Async / Await-Funktionen

https://www.npmjs.com/package/request-promise-native

npm install --save request
npm install --save request-promise-native

//Code

async function getData (){
    try{
          var rp = require ('request-promise-native');
          var options = {
          uri:'https://reqres.in/api/users/2',
          json:true
        };

        var response = await rp(options);
        return response;
    }catch(error){
        throw error;
    }        
}

try{
    console.log(getData());
}catch(error){
    console.log(error);
}
Codespiegel
quelle
4

ein weiteres Beispiel - dafür müssen Sie das Anforderungsmodul installieren

var request = require('request');
function get_trustyou(trust_you_id, callback) {
    var options = {
        uri : 'https://api.trustyou.com/hotels/'+trust_you_id+'/seal.json',
        method : 'GET'
    }; 
    var res = '';
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            res = body;
        }
        else {
            res = 'Not Found';
        }
        callback(res);
    });
}

get_trustyou("674fa44c-1fbd-4275-aa72-a20f262372cd", function(resp){
    console.log(resp);
});
Hardik Ranpariya
quelle
4
var http = require('http');
var url = process.argv[2];

http.get(url, function(response) {
  var finalData = "";

  response.on("data", function (data) {
    finalData += data.toString();
  });

  response.on("end", function() {
    console.log(finalData.length);
    console.log(finalData.toString());
  });

});
Seb
quelle
3

Ich habe mit cURL keine gefunden, also habe ich einen Wrapper um node-libcurl geschrieben und kann unter https://www.npmjs.com/package/vps-rest-client gefunden werden .

Einen POST zu machen ist wie folgt:

var host = 'https://api.budgetvm.com/v2/dns/record';
var key = 'some___key';
var domain_id = 'some___id';

var rest = require('vps-rest-client');
var client = rest.createClient(key, {
  verbose: false
});

var post = {
  domain: domain_id,
  record: 'test.example.net',
  type: 'A',
  content: '111.111.111.111'
};

client.post(host, post).then(function(resp) {
  console.info(resp);

  if (resp.success === true) {
    // some action
  }
  client.close();
}).catch((err) => console.info(err));
Jonatas Walker
quelle
2

Wenn Sie über Node.js 4.4+ verfügen, sehen Sie sich reqclient an. Dort können Sie Anrufe tätigen und die Anforderungen im cURL- Stil protokollieren , sodass Sie die Anrufe außerhalb der Anwendung problemlos überprüfen und reproduzieren können.

Returns Versprechen Objekte anstelle von Pass einfach Rückrufe, so dass Sie das Ergebnis in einem mehr verarbeiten kann „Mode“ Art und Weise, die Kette das Ergebnis leicht und Griff Fehler in üblicher Weise. Entfernt außerdem viele Boilerplate-Konfigurationen für jede Anforderung: Basis-URL, Zeitüberschreitung, Inhaltstypformat, Standardheader, Parameter und Abfragebindung in der URL sowie grundlegende Cache-Funktionen.

Dies ist ein Beispiel dafür, wie Sie es initialisieren, einen Anruf tätigen und den Vorgang im Curl- Stil protokollieren :

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
    baseUrl:"http://baseurl.com/api/", debugRequest:true, debugResponse:true});
client.post("client/orders", {"client": 1234, "ref_id": "A987"},{"x-token": "AFF01XX"});

Dadurch wird die Konsole angemeldet ...

[Requesting client/orders]-> -X POST http://baseurl.com/api/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json

Und wenn die Antwort zurückgegeben wird ...

[Response   client/orders]<- Status 200 - {"orderId": 1320934}

Dies ist ein Beispiel für die Behandlung der Antwort mit dem Versprechen-Objekt:

client.get("reports/clients")
  .then(function(response) {
    // Do something with the result
  }).catch(console.error);  // In case of error ...

Natürlich kann es installiert werden mit : npm install reqclient.

Mariano Ruiz
quelle
1

Sie können curlrequest verwenden, um einfach festzulegen , wann die Anforderung ausgeführt werden soll. Sie können sogar Überschriften in den Optionen festlegen, um einen Browseraufruf zu " fälschen ".

luizpanariello
quelle
0

Ich fand Superagent wirklich nützlich, es ist zum Beispiel sehr einfach

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
David Innocent
quelle
0

Warnung: Ab dem 11. Februar 2020 ist die Anfrage vollständig veraltet.

Wenn Sie mit Formulardaten implementieren, erhalten Sie weitere Informationen ( https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js ):

var fs = require('fs');
var request = require('request');
request.post({
  url: 'https://slack.com/api/files.upload',
  formData: {
    file: fs.createReadStream('sample.zip'),
    token: '### access token ###',
    filetype: 'zip',
    filename: 'samplefilename',
    channels: 'sample',
    title: 'sampletitle',
  },
}, function (error, response, body) {
  console.log(body);
});
Lwf804
quelle