Node.js에서 원격 REST 호출을 수행하는 방법은 무엇입니까? 어떤 CURL?


189

CURL 호출 을하기 위해 자식 프로세스를 사용하는 것 이외의 Node.js 에서는 원격 서버 REST API 에 대한 CURL 호출을 수행 하고 반환 데이터를 얻는 방법이 있습니까?

또한 원격 REST 호출에 요청 헤더를 설정하고 GET (또는 POST)에서도 쿼리 문자열 을 설정해야합니다 .

나는 이것을 발견한다 : http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

그러나 쿼리 문자열을 POST하는 방법은 표시되지 않습니다.


답변:


212

보다 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
그래서 POST 일지라도 쿼리 문자열에 데이터를 추가합니까?
murvinlai

3
@murvinlai 확실하지 않습니다. 문서, 소스, HTTP 사양을 읽으십시오. 해당 지역의 전문가가 아닙니다.
Raynos

15
참고로 호스트 항목에 http 또는 https를 입력하지 마십시오 (예 : var options = {host : graph.facebook.com ....} not {host : http : graph.facebook.com}). 그것은 몇 사이클 동안 나를 넘어 뜨렸다. (아래 참조). 이것들은 모두 훌륭한 답변입니다. 둘 다 감사합니다.
이진 2

9
응답이 길면 res.on ( 'data', ..)을 사용하는 것만으로는 충분하지 않다는 것을 알 수 있습니까? 올바른 방법은 res.on ( 'end'..)을 사용하여 모든 데이터를 언제 받았는지 알 수 있다고 생각합니다. 그런 다음 처리 할 수 ​​있습니다.
Xerri

4
이것은 매우 오래된 답변입니다. 오늘날 노드 js를 작성하는 사람들에게는 반드시 npmjs.com/package/node-fetch 또는 Fetch 표준을 기반으로하는 다른 페치 API 기반 패키지를 사용해야 합니다. 아래 답변을 참조하십시오.
항해

95

어떻게 사용에 대한 요청 - 단순화 된 HTTP 클라이언트를 .

2020 년 2 월 편집 : 요청이 더 이상 사용되지 않으므로 더 이상 사용하지 않아야합니다.

다음은 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는 POST를 원했습니다.

request.post('http://service.com/upload', {form:{key:'value'}})

1
google.com에서 잘 작동하지만 페이스 북의 그래프 API를 요청할 때 "RequestError : Error : socket hang up"을 반환합니다. 감사합니다!
Dynamic Remo

이 모듈에는 많은 문제가 있습니다!
Pratik Singhal

이 방법으로 REST API를 사용하면서 요청 매개 변수를 전달하려면 어떻게해야합니까?
vdenotaris

2
2020 년 2 월 11 일부로 요청이 완전히 거부되었습니다. 웹 사이트 github.com/request/request#deprecated
Sadiel

초보자가 사용해야 할 지침이 있습니까? 이것을 사용하는 많은 예제를 통해 필터링하고 있습니다.
Steve3p0

36

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

1
d의 값에 어떻게 액세스합니까 ??? d = { "data": [{ "id": 1111, "name": "peter"}]}입니다. 이름 값을 얻는 방법?
peter

2
var thed = JSON.parse (d);를 사용하여 값을 가져 왔습니다. console.log ( "id는 :"+ thed.data [0] .id); 그러나 언젠가는 "예기치 않은 입력 끝"을 얻었습니다
peter

33

내가 사용하는 노드 페치 (웹 개발자 경우)는 친숙한를 사용하기 때문에 () API를 가져 . fetch ()는 브라우저에서 임의의 HTTP 요청을하는 새로운 방법입니다.

예, 이것이 노드 js 질문이라는 것을 알고 있지만 개발자가 암기하고 이해해야하는 API 수를 줄이고 Javascript 코드의 재사용 성을 향상시키고 싶지 않습니까? Fetch는 표준 이므로 어떻게 수렴합니까?

fetch ()의 또 다른 좋은 점은 javascript Promise를 반환 하므로 다음과 같이 비동기 코드를 작성할 수 있다는 것입니다.

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는 XMLHTTPRequest를 대체 합니다. 다음은 몇 가지의 더 많은 정보는 .


node-fetchAPI 를 작성할 때의 문제점 은 작동 만 전체 URL이되고 상대 URL에서는 작동하지 않는다는 것입니다.
Sebastian

11

웹 서비스 호출을 위해 restler 를 사용 하고 있으며 매력처럼 작동하며 매우 깔끔합니다.


5

액시 오스

Node.js에서 Axios를 사용한 예제 (axios_example.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);

프로젝트 디렉토리에서 다음을 수행하십시오.

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

그런 다음 브라우저를 사용하여 Node.js REST API를 테스트 할 수 있습니다. http://localhost:5000/search?queryStr=xxxxxxxxx

마찬가지로 다음과 같은 게시물을 게시 할 수 있습니다.

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

수퍼 에이전트

마찬가지로 SuperAgent를 사용할 수 있습니다.

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

기본 인증을 수행하려는 경우 :

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

참조 :


5

최신 Async / Await 기능을 사용하려면

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

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

//암호

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

다른 예-요청 모듈을 설치해야합니다.

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

cURL을 찾지 못했기 때문에 node-libcurl 주위에 래퍼를 작성 했으며 https://www.npmjs.com/package/vps-rest-client 에서 찾을 수 있습니다 .

POST를 만드는 방법은 다음과 같습니다.

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

Node.js 4.4 이상을 사용하는 경우 reqclient를 살펴보면 호출하고 cURL 스타일로 요청을 기록 할 수 있으므로 애플리케이션 외부의 호출을 쉽게 확인하고 재현 할 수 있습니다.

간단한 콜백을 전달하는 대신 Promise 객체를 반환 하므로 결과를보다 "패션" 방식으로 처리하고 결과를 쉽게 연결 하며 표준 방식으로 오류를 처리 할 수 ​​있습니다. 또한 각 요청마다 기본 URL, 시간 초과, 컨텐츠 유형 형식, 기본 헤더, URL의 매개 변수 및 쿼리 바인딩 및 기본 캐시 기능과 같은 많은 상용구 구성을 제거합니다.

다음은 초기화, 호출 및 스타일로 작업을 기록하는 방법의 예 입니다.

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

콘솔에 로그인합니다 ...

[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

응답이 반환되면 ...

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

다음은 promise 객체로 응답을 처리하는 방법의 예입니다.

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

물론 다음과 같이 설치할 수 있습니다 npm install reqclient..



1

경고 : 2020 년 2 월 11 일부터 요청 이 완전히 지원되지 않습니다.

양식 데이터로 구현하는 경우 자세한 정보 ( 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);
});

0

슈퍼 에이전트가 정말 유용하다는 것을 알았습니다. 예를 들어 매우 간단합니다.

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.