くろおーかみ*てっく

しがないくろおーかみの勉強記

100DaysOfCode #18: Vue.js <script>直接組み込み(8) watchと公開されているWeb APIでGETを試したいときの注意

やったこと

今日の進捗のコードはコチラ。

github.com

Vue.jsの知見を聴きに勉強会に参加しました。

y-mix.hateblo.jp

Web APIを試したい!…アクセスキーが不要なAPIを試そうとするとCORSの制限に引っかかる

ウォッチャのサンプルで「テキストボックスの入力が終わって少ししたらAPIに問い合わせる」というモノを作りたいときに
とりあえず 問い合わせにAPIキーがいらないWeb APIを使いたいのです。

このAPI一覧など参考になります。

paiza.hatenablog.com

そのうちのWikipediaの記事を検索して取得するAPIを試そうとすると、 CORSの制限でGETすらできない模様。

 https://ja.wikipedia.org/w/api.php?format=json&action=query&prop=revisions&titles= { Keyword } &rvprop=content&rvparse&callback=jsonData

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

代わりにデータを取得する中継サーバーを作る

これを解決するには、問い合わせを受ける側から適切な Access-Control-Allow-Origin のHTTPヘッダーを付けてクライアントに返す必要があり、

[クライアント: Vue.jsのサンプル] - [HTTPヘッダー(CORS)を付けるサーバー] - [WikipediaのAPI]

という形で中継する必要がある。

データを取ってくるときは、一旦中継するサーバーに問い合わせをして

[クライアント: Vue.jsのサンプル] -> [HTTPヘッダー(CORS)を付けるサーバー]

HTTPヘッダーを付けるサーバー - WikipediaAPI間はCORSの制限を受けない方法でデータを取得する。

  • PHPなら file_get_contents()
  • Node.js なら http.get() ?(未検証)
[HTTPヘッダー(CORS)を付けるサーバー] <-> [WikipediaのAPI]

最後に、中継したサーバーからクライアントのVue.jsに返すときに Access-Control-Allow-Origin ヘッダーを付ける。

[クライアント: Vue.jsのサンプル] <- [HTTPヘッダー(CORS)を付けるサーバー]

この中継サーバーを立てる方法をPHPで解決した例はコチラの記事で…

qiita.com

今やらないの?

サンプルのレベルでやるならNodeのexpress.jsでヘッダーを付けたAPIを作ってそれでやり取りするのかなぁ…と思ったけど、
今の <script> 直接読み込みなプロジェクトの構成が大きく変わるのと、Vue.jsの本題から外れてしまうので後ほど。

#でもVue.jsのドキュメントとは違うことをやりたかった…