取得方法を調べる
JSでのサーバからのデータ取得方法はいくつか種類がかあるみたい.ざっと調べただけで以下
- XHR
XMLHttpRequest
: 昔ながらの方法でローレベルを書く感じ -
fetch
API : 比較的新しい.Chromeでいうとversion 42かららしい - Ajaxライブラリを使う :
jQuery
,superagent
,axios
などあげるとキリがない感じ
Vueの推奨は?
公式サイトでは、**まあ、なんでもいいけどaxios
**でどう?っていう感じの書き方 .vue-resource
のリタイアに関する記事で2016年なので少しふるいかもだが.
What Should I Use Then?
You are free to pick whatever you prefer (even just $.ajax), but as a default recommendation — particularly for new users — we suggest taking a look at Axios. It’s currently one of the most popular HTTP client library and covers almost everything vue-resource provides with a very similar API. In addition, it is universal, supports cancellation, and has TypeScript definitions.
それぞれ触ってみる
コマンドラインでさっとやりたかったのでnode
つかう(あとで逆にめんどくさいことに気づく)
XHR
事前にaxios
パッケージたしておく.
const axios = require('axios');
let url = 'https://api-staging.megaport.com/v2/locations'
axios.get(url)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
fetch
事前にnode-fetch
パッケージたしておく.fetch
の返り値はPromise
オブジェクト
var fetch = require("node-fetch");
let url = 'your-api-end-point-here';
fetch(url).then((response) => {
//console.log(response.status);
console.log(response);
}).catch(() => {
console.log("error caught!");
});
Hack Your Design! によるとこっちのawait
を使う書き方がよりモダンとのこと
var fetch = require("node-fetch");
let url = 'your-api-end-point-here';
(async() => {
try {
const response = await fetch(url);
//console.log(response.status);
console.log(response);
} catch (e) {
console.log("error!")
}
})();
axios
const axios = require('axios');
let url = 'your-api-end-point-here'
axios.get(url)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
node
でやらなくても,Chrome DevTools
のconsole
に上記をはりつければ動くし,そのほうがnode
の準備いらないので簡単だったのかぁ
ハマったところ
fetch
はPromise
を返してくるのだが,この場合にどうやってdata
にアクセスするのかがよくわからず小ハマり.ひとまずresponse
をJSONにしてみる.
fetch(url).then((response) => {
console.log(response.json()); // to JSON
}).catch(() => {
console.log("error!");
});
ここでPromise
の返す値をVueでdata
配列にほりこもうとすると以下のようにおこられる.
[Vue warn]: Invalid prop: type check failed for prop "data". Expected Array, got Promise.
Promise
の中身を確認すると以下のようになっていてdata
は[[PromiseValue]]
の下に配列としてある.ドット表記ではアクセスできない.
アクセス方法はstack overfowで見つけた.then
を使う.
fetch(url)
.then(response => response.json())
.then(data => console.log(data)) // then で data にアクセス
.catch(error => console.error(error))
参考にしたサイト
- Hack Your Design! - JavaScriptのXHRの送り方いろいろ: XMLHttpRequest, fetch, async/await
- Qiita - お疲れさまXMLHttpRequest、こんにちはfetch
- ReferenceError: fetch is not defined
- stack overflow - What does PromiseValue mean in javascript console and how to do I get it
次回
サーバからの値とれたので,でいよいよVue
の中でつかっていくでぇ
シリーズ
- Vue.jsでSPA - [1] Element UIでベースの画面をつくる
- Vue.jsでSPA - [2] Element UIで各ペインの画面をつくる
- Vue.jsでSPA - [3] vue-routerでルーティング
- Vue.jsでSPA - [4] コンポーネントにしてみる
- Vue.jsでSPA - [5] リアクティブになってる?
- Vue.jsでSPA - [6] サーバからのデータ取得
- Vue.jsでSPA - [7] Vueからサーバデータ取得
- Vue.jsでSPA - [8] バックエンドとうまくやっていこうとして試したこと
- Vue.jsでSPA - [9] 今更ながらCORSとそのエラーの回避方法
- Vue.jsでSPA - [10] Safari..お前か...3rd party cookie
- Vue.jsでSPA - [11] Element UIでログイン画面
- Vue.jsでSPA - [12] ログイン:シングルペインからツーペインへ画面遷移
- Vue.jsでSPA - [13] モバイル向けに OnsenUI に手をだす
- Vue.jsでSPA - [14] Vue.jsとOnsenUIを使ったオレオレなショッピングカートチュートリアル
- Vue.jsでSPA - [15] 世界中の人とミーティング時間を決める時に便利なやつ
- Vue.jsでSPA - [16] へー、FirebaseでWebアプリのログインってこうやるのか