[javascript] Node.js로 JSON API 호출

내 애플리케이션에 로그인 한 사용자의 페이스 북 프로필 사진을 가져 오려고합니다. Facebook의 API http://graph.facebook.com/517267866/?fields=picture는 올바른 URL을 JSON 개체로 반환 한다고 설명 합니다.

내 코드에서 그림의 URL을 가져오고 싶습니다. 다음을 시도했지만 여기에 뭔가가 누락되었습니다.

 var url = 'http://graph.facebook.com/517267866/?fields=picture';

 http.get(url, function(res) {
      var fbResponse = JSON.parse(res)
      console.log("Got response: " + fbResponse.picture);
    }).on('error', function(e) {
      console.log("Got error: " + e.message);
 });

이 코드를 실행하면 다음과 같은 결과가 나타납니다.

undefined:1

^
SyntaxError: Unexpected token o
    at Object.parse (native)



답변

콜백 의 res인수 http.get()본문이 아니라 http.ClientResponse 객체입니다. 본체를 조립해야합니다.

var url = 'http://graph.facebook.com/517267866/?fields=picture';

http.get(url, function(res){
    var body = '';

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

    res.on('end', function(){
        var fbResponse = JSON.parse(body);
        console.log("Got a response: ", fbResponse.picture);
    });
}).on('error', function(e){
      console.log("Got an error: ", e);
});


답변

다른 답변의 문제 :

  • 위험한 JSON.parse
  • 응답 코드 검사 없음

여기에있는 모든 답변 JSON.parse()안전하지 않은 방식으로 사용 됩니다 . 당신은 항상 모든 통화를 두어야 JSON.parse()A의 try/catch블록 특히 당신이 여기처럼 JSON은 외부 소스에서 나오는 구문 분석 할 때.

request다른 답변에서 여기에 언급되지 않은 JSON을 자동으로 구문 분석하는 데 사용할 수 있습니다 . request모듈을 사용하는 답변이 이미 있지만 JSON.parse()JSON을 수동으로 구문 분석 하는 데 사용 합니다. 이는 항상try {} catch {} 잘못된 JSON의 오류를 처리하기 위해 블록 내에서 실행 되어야합니다. 그렇지 않으면 전체 앱이 충돌합니다. 그리고 잘못된 JSON이 발생합니다. 저를 믿으십시오.

사용하는 다른 답변 은 발생할 수있는 예외를 확인하지 않고 응용 프로그램을 충돌시키는 http것도 사용 JSON.parse()합니다.

아래에서는 안전하게 처리하는 몇 가지 방법을 보여 드리겠습니다.

모든 예제는 공용 GitHub API를 사용하므로 누구나 안전하게 해당 코드를 시도 할 수 있습니다.

예제 request

다음은 requestJSON을 자동으로 구문 분석 하는 작업 예제입니다 .

'use strict';
var request = require('request');

var url = 'https://api.github.com/users/rsp';

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {
      // data is already parsed as JSON:
      console.log(data.html_url);
    }
});

http및 예제try/catch

이 용도는 https– 단지 변경 httpshttp당신이 HTTP 연결을 원하는 경우 :

'use strict';
var https = require('https');

var options = {
    host: 'api.github.com',
    path: '/users/rsp',
    headers: {'User-Agent': 'request'}
};

https.get(options, function (res) {
    var json = '';
    res.on('data', function (chunk) {
        json += chunk;
    });
    res.on('end', function () {
        if (res.statusCode === 200) {
            try {
                var data = JSON.parse(json);
                // data is available here:
                console.log(data.html_url);
            } catch (e) {
                console.log('Error parsing JSON!');
            }
        } else {
            console.log('Status:', res.statusCode);
        }
    });
}).on('error', function (err) {
      console.log('Error:', err);
});

http및 예제tryjson

이 예제는 위와 비슷하지만 tryjson모듈을 사용합니다 . (면책 조항 : 저는 해당 모듈의 작성자입니다.)

'use strict';
var https = require('https');
var tryjson = require('tryjson');

var options = {
    host: 'api.github.com',
    path: '/users/rsp',
    headers: {'User-Agent': 'request'}
};

https.get(options, function (res) {
    var json = '';

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

    res.on('end', function () {
        if (res.statusCode === 200) {
            var data = tryjson.parse(json);
            console.log(data ? data.html_url : 'Error parsing JSON!');
        } else {
            console.log('Status:', res.statusCode);
        }
    });
}).on('error', function (err) {
      console.log('Error:', err);
});

요약

사용하는 예가 request가장 간단합니다. 그러나 어떤 이유로 사용하고 싶지 않다면 항상 응답 코드를 확인하고 JSON을 안전하게 구문 분석해야합니다.


답변

이와 같은 간단한 HTTP 요청의 경우 requestmodule 을 사용하는 것이 좋습니다 . npm ( npm install request) 을 사용하여 설치해야합니다. 그러면 코드는 다음과 같습니다.

const request = require('request')
     ,url = 'http://graph.facebook.com/517267866/?fields=picture'

request(url, (error, response, body)=> {
  if (!error && response.statusCode === 200) {
    const fbResponse = JSON.parse(body)
    console.log("Got a response: ", fbResponse.picture)
  } else {
    console.log("Got an error: ", error, ", status code: ", response.statusCode)
  }
})


답변

사용 하기 매우 간단하게 get-json 을 사용하고 있습니다.

$ npm install get-json --save

수입 get-json

var getJSON = require('get-json')

GET요청 을 수행하려면 다음과 같이하십시오.

getJSON('http://api.listenparadise.org', function(error, response){
    console.log(response);
})


답변

또 다른 해결책은 사용자 axios입니다 .

npm install axios

코드는 다음과 같습니다.

const url = `${this.env.someMicroservice.address}/v1/my-end-point`;

const { data } = await axios.get<MyInterface>(url, {
  auth: {
    username: this.env.auth.user,
    password: this.env.auth.pass
  }
});

return data;


답변

Unirest 라이브러리 는 이것을 많이 단순화합니다. 사용하려면 unirestnpm 패키지 를 설치해야 합니다. 그러면 코드는 다음과 같이 보일 수 있습니다.

unirest.get("http://graph.facebook.com/517267866/?fields=picture")
  .send()
  .end(response=> {
    if (response.ok) {
      console.log("Got a response: ", response.body.picture)
    } else {
      console.log("Got an error: ", response.error)
    }
  })


답변