別サーバからjsonデータ(ランキングデータ)を取得して、サイトに表示させたいというご要望があり、一部躓いたのでメモしておきます。

jsonpを使用しても取得することができなかった(私のやり方が誤っていた可能性もあり)、またクライアントサーバに変更が加えられなかったため、phpの「file_get_contents」を利用して取得することにしましたので、その手法です。

phpの準備

まず、別サーバにあるjsonファイルは下記のようになっています。

[
  {
    "name": "AAA",
    "score": 1000
  },
  {
    "name": "BBB",
    "score": 900
  },
  {
    "name": "CCC",
    "score": 800
  },
]

これを下記のようにphpの「file_get_contents」で取得し、例として getRankingJson.php という名前で保存します。

■ getRankingJson.php

<?php
  $context = stream_context_create(
    [
      'http' => [
        'ignore_errors' => true
      ]
    ]
  );
  $jsonFile = file_get_contents('https://△△△△.△△/ranking.json', false, $context);
  echo $jsonFile;
?>

ブラウザからこのファイルにアクセスして、別サーバにあるjsonファイルと同じようにjsonが表示されていることが確認できればOKです。

https://△△△△.△△/ranking.json

この部分はjsonファイルのURLに置き換えてください。

 

ajaxで取得する

今回はjQueryを使っているので、jQueryは読み込ませる前提で、下記のようにしました。

■ app.js

$(function () {
  let data = [];

  // 別ドメインのjsonが取得できないためphp(file_get_contents)で取得 
  let jsonRankingUrl = '/app/getRankingJson.php'; // ランキングデータ取得用URL 

  // ランキングデータ取得
  $.ajax({
    type: 'GET',
    url: jsonRankingUrl,
    dataType: 'json'
  }).then(
    function (json) {
      for (let i = 0; i < json.length; i++) {
        data.push({
          name: json[i].name,
          score: json[i].score,
        });

        let rankingNum = i + 1;

        let rankingHtml = '<li>';
        rankingConts = '<p>'+ rankingNum + '位</p><p>' + data[i].name + '</p><p>' + data[i].score + '</p>';
        rankingHtml = rankingHtml + rankingConts + '</li>';
        $('ol').append(rankingHtml);
      }
    },
    function () {
      alert('ランキングデータの取得に失敗しました。');
    }
  );
});

DOMの箇所は適宜変更は必要ですが、この方法で問題なくサイト側で取得したデータが表示されます。

 

まとめ

今回はphpでjsonファイルを取得する方法で行いましたが、
jsonpやクライアント側のサーバを触れる状態なのであればheader情報を変更して対応できればこのようなことはしなくてもいいのですが、、、今後header情報を変更して対応した等あればまたメモしておきます。