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.


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();

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'}})

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

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 .


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


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:


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

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

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());
  });

});

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));

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.



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')

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);
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.