Jak wykonać zdalne wywołanie REST w Node.js? jakikolwiek CURL?

189

Czy w Node.js , poza wykorzystaniem procesu potomnego do wywołania CURL , istnieje sposób na wywołanie CURL do interfejsu API REST serwera zdalnego i uzyskanie danych zwrotnych?

Muszę również skonfigurować nagłówek żądania do zdalnego wywołania REST , a także ciąg zapytania również w GET (lub POST).

Znajduję to: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

ale nie pokazuje żadnego sposobu na ciąg zapytania POST.

murvinlai
źródło
Napisałem to github.com/jonataswalker/vps-rest-client
Jonatas Walker

Odpowiedzi:

212

Patrzeć na 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
źródło
3
Więc nawet jeśli jest to POST, dołączam także dane do ciągu zapytania?
murvinlai,
3
@murvinlai nie jestem pewien. Idź przeczytaj dokumentację, źródło, specyfikację HTTP. Nie jest ekspertem w tym regionie.
Raynos,
15
Należy zauważyć, że nie wpisujesz http lub https we wpisie hosta, np. Var options = {host: graph.facebook.com ....} nie {host: http: graph.facebook.com}. To mnie potknęło na kilka cykli. (Patrz poniżej). To są świetne odpowiedzi. Dziękuję wam obojgu.
binarygiant
9
Mogę tylko zaznaczyć, że jeśli odpowiedź jest długa, użycie res.on („data”,…) nie wystarczy. Uważam, że poprawnym sposobem jest również res.on („koniec” ..), aby wiedzieć, kiedy otrzymałeś wszystkie dane. Następnie możesz przetworzyć.
Xerri
4
To jest bardzo stara odpowiedź - dla tych, którzy dziś piszą węzeł js, z pewnością użyłbyś npmjs.com/package/node-fetch lub innego pakietu opartego na API pobierania, który jest oparty na standardzie Fetch. Zobacz moją odpowiedź poniżej.
żeglowanie
95

Co powiesz na korzystanie z żądania - uproszczonego klienta HTTP .

Edytuj luty 2020: Wniosek został wycofany, więc prawdopodobnie nie powinieneś go więcej używać.

Oto 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 chciał również POST:

request.post('http://service.com/upload', {form:{key:'value'}})
Matt Frear
źródło
1
Działa dobrze z google.com, ale zwraca „RequestError: Error: socket hang up” podczas żądania graficznego interfejsu API Facebooka. Proszę poprowadzić, dzięki!
Dynamic Remo
Ten moduł zawiera wiele problemów!
Pratik Singhal
Jak mogę przekazać parametr żądania podczas korzystania z interfejsu API REST w ten sposób?
vdenotaris
2
Z dniem 11 lutego 2020 r. Wniosek jest w PEŁNI WYRÓŻNIONY. Możesz to zobaczyć na stronie github.com/request/request#deprecated
Sadiel
Wszelkie wskazówki na temat tego, jakich nowicjuszy powinni używać? Filtruję według wielu przykładów, które tego używają.
Steve3p0
36

Spójrz na http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/

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
źródło
1
Jak uzyskać dostęp do wartości z d ??? d = {„data”: [{„id”: 1111, „name”: „peter”}]}. jak uzyskać wartość nazwy?
Peter
2
udało się uzyskać wartości za pomocą var thed = JSON.parse (d); console.log („id to:” + thed.data [0] .id); Ale jakiś czas dostaję „Nieoczekiwany koniec wprowadzania”
Peter
33

Korzystam z funkcji pobierania węzłów, ponieważ używa ona znanego (jeśli jesteś programistą ) interfejsu API fetch () . fetch () to nowy sposób na wysyłanie dowolnych żądań HTTP z przeglądarki.

Tak, wiem, że jest to pytanie dotyczące węzła, ale czy nie chcemy zmniejszyć liczby programistów API, którzy muszą zapamiętywać i rozumieć, oraz poprawić możliwość ponownego wykorzystania naszego kodu javascript? Pobieranie jest standardem, więc co powiesz na to?

Inną zaletą fetch () jest to, że zwraca obietnicę javascript , dzięki czemu można napisać kod asynchroniczny w następujący sposób:

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 zastępuje XMLHTTPRequest . Oto kilka informacji .

żagiel
źródło
Problem z node-fetchpisaniem interfejsów API polega na tym, że działa tylko pełny adres URL i nie będzie działać z względnymi adresami URL.
Sebastian,
5

Axios

Przykład (axios_example.js) przy użyciu Axios w 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);

Upewnij się, że w katalogu projektu wykonujesz:

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

Następnie możesz przetestować interfejs API REST Node.js za pomocą przeglądarki pod adresem: http://localhost:5000/search?queryStr=xxxxxxxxx

Podobnie możesz robić posty, takie jak:

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

SuperAgent

Podobnie możesz użyć SuperAgent.

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

A jeśli chcesz wykonać podstawowe uwierzytelnianie:

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
źródło
5

Aby korzystać z najnowszych funkcji Async / Await

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

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

//kod

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);
}
kodemirror
źródło
4

jeszcze jeden przykład - musisz do tego zainstalować moduł żądania

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
źródło
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
źródło
3

Nie znalazłem żadnego z cURL, więc napisałem wrapper wokół node-libcurl i można go znaleźć na stronie https://www.npmjs.com/package/vps-rest-client .

Aby wykonać test POST, należy:

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
źródło
2

Jeśli masz Node.js 4.4+, spójrz na reqclient , pozwala on wykonywać połączenia i rejestrować żądania w stylu cURL , dzięki czemu możesz łatwo sprawdzać i odtwarzać połączenia poza aplikacją.

Zwraca Obietnica obiektów zamiast wprost prostych wywołań zwrotnych, dzięki czemu można obsługiwać wynik w bardziej „mody” sposób, łańcuch łatwo wynik i błędy uchwytem w sposób standardowy. Usuwa również wiele konfiguracji podstawek na każde żądanie: podstawowy adres URL, limit czasu, format typu zawartości, domyślne nagłówki, parametry i powiązanie zapytania w adresie URL oraz podstawowe funkcje pamięci podręcznej.

Oto przykład, jak go zainicjować, wykonać połączenie i zarejestrować operację w stylu curl :

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

Spowoduje to zalogowanie się do konsoli ...

[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

A kiedy odpowiedź zostanie zwrócona ...

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

Oto przykład obsługi odpowiedzi za pomocą obiektu promise:

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

Oczywiście, może być zainstalowany: npm install reqclient.

Mariano Ruiz
źródło
1

Możesz użyć curlrequest, aby łatwo ustawić czas żądania, który chcesz zrobić ... możesz nawet ustawić nagłówki w opcjach „ fałszywego ” wywołania przeglądarki.

luizpanariello
źródło
1

Ostrzeżenie: od 11 lutego 2020 r. Żądanie jest całkowicie przestarzałe.

Jeśli implementujesz za pomocą danych formularza, aby uzyskać więcej informacji ( 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
źródło
0

Uznałem, że superagent jest naprawdę przydatny, na przykład jest bardzo prosty

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
David Innocent
źródło