내 애플리케이션에 로그인 한 사용자의 페이스 북 프로필 사진을 가져 오려고합니다. 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
다음은 request
JSON을 자동으로 구문 분석 하는 작업 예제입니다 .
'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
– 단지 변경 https
에 http
당신이 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 요청의 경우 request
module 을 사용하는 것이 좋습니다 . 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 라이브러리 는 이것을 많이 단순화합니다. 사용하려면 unirest
npm 패키지 를 설치해야 합니다. 그러면 코드는 다음과 같이 보일 수 있습니다.
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)
}
})