使用PHP从外部API / URL获取信息

时间:2015-10-23 12:32:29

标签: php

我有URL http://api.minetools.eu/ping/play.desnia.net/25565,它输出我服务器的统计信息。

例如:

var

我希望获得在线玩家数量的价值,以便在我的网站上显示为:在线玩家:在线金额

有人可以帮忙吗?

我试着这样做:

{
  "description": "A Minecraft Server",
  "favicon": null,
  "latency": 64.646,
  "players": {
    "max": 20,
    "online": 0,
    "sample": []
  },
  "version": {
    "name": "Spigot 1.8.8",
    "protocol": 47
  }
}

但它没有用。

4 个答案:

答案 0 :(得分:18)

1)请勿使用file_get_contents() (如果可以提供帮助)

这是因为您需要enable fopen_wrappers才能启用file_get_contents()来处理外部来源。有时这是关闭的(取决于您的主机;如共享主机),因此您的应用程序将会中断。

一般来说,一个好的选择是curl()

2)使用curl()执行GET请求

这很简单。使用curl()针对某些标头发出GET个请求。

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://api.minetools.eu/ping/play.desnia.net/25565",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

3)使用回复

回复发回JSON object。我们可以使用json_decode()将它放入可用的对象或数组中。

$response = json_decode($response, true); //because of true, it's in an array
echo 'Online: '. $response['players']['online'];

答案 1 :(得分:5)

您的服务器正在返回JSON字符串。 因此,您应该使用 json_decode()函数将其转换为普通的PHP对象。 此后,您可以访问该对象的任何变量。

所以,这样的事情会有所帮助

<?php
$content =     file_get_contents("http://api.minetools.eu/ping/play.desnia.net/25565");

$result  = json_decode($content);

print_r( $result->players->online );
?>

json_decode的更多细节可以在这里阅读 - http://php.net/manual/en/function.json-decode.php

答案 2 :(得分:1)

您的网络服务(网址:http://api.minetools.eu/ping/play.desnia.net/25565)会返回JSON

这是一种标准格式,PHP(至少从5.2开始)支持本机解码 - 你将从中获得某种形式的PHP结构。

您的代码当前不起作用(您的语法在echo上没有意义 - 即使它是有效的,您也将原始JSON数据的字符串副本视为数组 - 这不会你需要首先让PHP 解释(解码)JSON数据:

http://php.net/manual/en/function.json-decode.php

<?php
$statisticsJson = file_get_contents("http://api.minetools.eu/ping/play.desnia.net/25565");
$statisticsObj = json_decode($statisticsJson);

如果发生错误,您的$statisticsObj将为NULL - 您可以使用其他标准PHP函数获取该错误:

http://php.net/manual/en/function.json-last-error.php

假设它不是NULL,您可以使用var_dump($statisticsObj)检查对象的结构 - 然后更改代码以将其打印出来。

简而言之,如:

<?php
$statisticsJson = file_get_contents("http://api.minetools.eu/ping/play.desnia.net/25565");
$statisticsObj = json_decode($statisticsJson);
if ($statisticsObj !== null) {
   echo $statisticsObj->players->online;
} else {
   echo "Unknown";
}

您还应该检查file_get_contents()返回的内容 - 各种返回值可以返回(这会导致json_decode())错误。请参阅文档以了解可能性:

http://php.net/manual/en/function.file-get-contents.php

我还将整个事物包装在函数或类方法中,以保持代码整洁。一个简单的“几乎完整”的解决方案可能如下所示:

<?php
function getServerStatistics($url) {
    $statisticsJson = file_get_contents($url);
    if ($statisticsJson === false) {
       return false;
    }

    $statisticsObj = json_decode($statisticsJson);
    if ($statisticsObj !== null) {
       return false;
    }

    return $statisticsObj;
}

// ...

$stats = getServerStatistics($url);
if ($stats !== false) {
    print $stats->players->online;
}

如果您想更好地处理服务器/ HTTP错误等,我会考虑使用curl_*() - http://php.net/manual/en/book.curl.php

理想情况下,您也应该确认从您的Web服务返回的结构是您在盲目做出假设之前所期望的。你可以用property_exists()

之类的东西来做到这一点

快乐的黑客攻击!

答案 3 :(得分:0)

由于它返回一个数组,你应该使用print_r或var_dump而不是echo。或者它可能会给你一个错误。