Résolu Bug JsonApi, php, dédié

Solowing57

Architecte en herbe
4 Août 2013
167
11
75
26
Bonjour à tous,

D'abord, je m'excuse si ce n'est pas la bonne catégorie...

Alors, voilà mon problème, je développe un site fait main pour mon serveur Minecraft, et je fais une connexion JsonApi à la main aussi... Le problème est le suivant, c'est que coté serveur Minecraft tout à l'air de bien se passer, et coté Web aussi (aucun error.log de php) MAIS sur ma page web ou la connexion JsonApi doit s'effectuer (ICI) la requête PHP ne m'affiche absolument rien, aucune erreur, aucun chiffres (Array) rien...

Alors, vous me direz "Cherche sur Google" ou bien "Y'a plein de tutos" ou "Des centaines de topics on déja été ouvert ici" mais mon cas est un peux particulier...

Donc, je cherche quelqu'un qui s'y connait (même un tout petit peux) et qui puisse m'aider

Quelques infos sur mon environnement de travail :

Serveur Minecraft :
  • - Version : 1.8 (Spigot 1.8)
  • - Version de JsonApi : JSONAPI v5.6.0 for 1.8 Pre-Release
  • - Plugins requis installé : Vault, ProtocolLib (Fonctionnel à 100%)
Sinon, voici le script que j'utilise :
jsonapi.class.php :
PHP:
<?php
 
/**
* A PHP class for access Minecraft servers that have Bukkit with the {@link http://github.com/alecgorge/JSONAPI JSONAPI} plugin installed.
*
* This class handles everything from key creation to URL creation to actually returning the decoded JSON as an associative array.
*
* @author Alec Gorge <[email protected]>
* @version Alpha 5
* @link http://github.com/alecgorge/JSONAPI
* @package JSONAPI
* @since Alpha 5
*/
class JSONAPI {
    private $host;
    private $port;
    private $username;
    private $password;
    const URL_FORMAT = 'http://%s:%d/api/2/call?json=%s';
    private $timeout;
 
    /**
    * Creates a new JSONAPI instance.
    */
    public function __construct ($host, $port, $uname, $pword, $salt = '', $timeout = 10) {
        $this->host = $host;
        $this->port = $port;
        $this->username = $uname;
        $this->password = $pword;
        $this->salt = $salt;
        $this->timeout = $timeout;
    }
   
    /**
    * Generates the proper SHA256 based key from the given method suitable for use as the key GET parameter in a JSONAPI API call.
    *
    * @param string $method The name of the JSONAPI API method to generate the key for.
    * @return string The SHA256 key suitable for use as the key GET parameter in a JSONAPI API call.
    */
    public function createKey($method) {
        if(is_array($method)) {
            $method = json_encode($method);
        }
        return hash('sha256', $this->username . $method . $this->password);
    }
   
    /**
    * Generates the proper URL for a standard API call the given method and arguments.
    *
    * @param string $method The name of the JSONAPI API method to generate the URL for.
    * @param array $args An array of arguments that are to be passed in the URL.
    * @return string A proper standard JSONAPI API call URL. Example: "http://localhost:20059/api/call?method=methodName&args=jsonEncodedArgsArray&key=validKey".
    */
    public function makeURL($method, array $args) {
        return sprintf(self::URL_FORMAT, $this->host, $this->port, rawurlencode(json_encode($this->constructCall($method, $args))));
    }
   
    /**
    * Generates the proper URL for a multiple API call the given method and arguments.
    *
    * @param array $methods An array of strings, where each string is the name of the JSONAPI API method to generate the URL for.
    * @param array $args An array of arrays, where each array contains the arguments that are to be passed in the URL.
    * @return string A proper multiple JSONAPI API call URL. Example: "http://localhost:20059/api/call-multiple?method=[methodName,methodName2]&args=jsonEncodedArrayOfArgsArrays&key=validKey".
    */
    public function makeURLMultiple(array $methods, array $args) {
        return sprintf(self::URL_FORMAT, $this->host, $this->port, rawurlencode(json_encode($this->constructCalls($methods, $args))));
    }
   
    /**
    * Calls the single given JSONAPI API method with the given args.
    *
    * @param string $method The name of the JSONAPI API method to call.
    * @param array $args An array of arguments that are to be passed.
    * @return array An associative array representing the JSON that was returned.
    */
    public function call($method, array $args = array()) {
        if(is_array($method)) {
            return $this->callMultiple($method, $args);
        }
       
        $url = $this->makeURL($method, $args);
 
        return json_decode($this->curl($url), true);
    }
   
    private function curl($url) {
        if(extension_loaded('cURL')) {
            $c = curl_init($url);
            curl_setopt($c, CURLOPT_PORT, $this->port);
            curl_setopt($c, CURLOPT_HEADER, false);
            curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($c, CURLOPT_TIMEOUT, $this->timeout);       
            $result = curl_exec($c);
            curl_close($c);
            return $result;
        }else{
            $opts = array('http' =>
                array(
                    'timeout' => $this->timeout
                    )
                );
            return file_get_contents($url, false, stream_context_create($opts));
        }
    }
 
    private function constructCall($method, array $args) {
        $json = array();
        $json['name'] = $method;
        $json['arguments'] = $args;
        $json['key'] = $this->createKey($method);
        $json['username'] = $this->username;
        return $json;
    }
 
    private function constructCalls(array $methods, array $args) {
        $calls = array();
        foreach ($methods as $key => $method) {
            $calls[] = $this->constructCall($method, $args[$key]);
        }
        return $calls;
    }
   
    /**
    * Calls the given JSONAPI API methods with the given args.
    *
    * @param array $methods An array strings, where each string is the name of a JSONAPI API method to call.
    * @param array $args An array of arrays of arguments that are to be passed.
    * @throws Exception When the length of the $methods array and the $args array are different, an exception is thrown.
    * @return array An array of associative arrays representing the JSON that was returned.
    */
    public function callMultiple(array $methods, array $args = array()) {
        if(count($methods) !== count($args)) {
            throw new Exception(sprintf('The length of the arrays %s and %s are different! You need an array of arguments for each method!', $methods, $args));
        }
       
        $url = $this->makeURLMultiple($methods, $args);
 
        return json_decode($this->curl($url), true);
    }
    /**
    * The default function called if no one matched for JSONAPI.
    *
    * @param string $method The name of the JSONAPI API method to call.
    * @param array $params An array of arguments that are to be passed.
    * @return array An associative array representing the JSON that was returned.
    */
    function __call($method, $params) {
        if(is_array($params)) {
            return $this->call($method, $params);
        } else {
            return $this->call($method, array($params));   
        }
    }
 
    /**
    * @return string
    */
    public function getHost() {
        return $this->host;
    }
   
    /**
    * @param string $newhost
    * @return JSONAPI This object, for method chaining
    */
    public function setHost($host) {
        $this->host = $host;
   
        return $this;
    }
 
    /**
    * @return integer
    */
    public function getPort() {
        return $this->port;
    }
   
    /**
    * @param integer $newport
    * @return JSONAPI This object, for method chaining
    */
    public function setPort($port) {
        $port = (int) $port;
        if ($port < 1 || $port > 65535) {
            throw new Exception('The port must be between 1 and 65535, you supplied ' . $port);
        }
        $this->port = $port;
   
        return $this;
    }
 
    /**
    * @return string
    */
    public function getUsername() {
        return $this->username;
    }
   
    /**
    * @param string $newusername
    * @return JSONAPI This object, for method chaining
    */
    public function setUsername($username) {
        $this->username = $username;
   
        return $this;
    }
 
    /**
    * @return string
    */
    public function getPassword() {
        return $this->password;
    }
   
    /**
    * @param string $newpassword
    * @return JSONAPI This object, for method chaining
    */
    public function setPassword($username) {
        $this->password = $password;
   
        return $this;
    }
 
    /**
    * @return integer
    */
    public function getTimeout() {
        return $this->timeout;
    }
   
    /**
    * @param integer $newtimeout
    * @return JSONAPI This object, for method chaining
    */
    public function setTimeout($timeout) {
        $this->timeout = (int) $timeout;
   
        return $this;
    }
}

Et le script "d'execution" (pour récupérer le nombre de joueurs) que j'utilise :
PHP:
<?php
require_once('include/config/jsonapi.class.php'); // get this file at: https://github.com/alecgorge/jsonapi/raw/master/sdk/php/JSONAPI.php
$ip = "localhost"; // Ip du serveur
$port = 20059; //port du plugin (par défaut : 20059)
$utilisateur = "admin"; //nom d'utilisateur
$motdepasse ="changeme"; //mot de passe
$salt ="salt";
$api = new JSONAPI($ip, $port, $utilisateur, $motdepasse, $salt);// on affiche le nombre de joueur
?>
    <main class="main-content">
        <div class="container">
<?php echo($api->call("getPlayerCount")); ?>
</div>
</main>
?>

PS : Je sais bien que c'est un forum spécial Minecraft, et que beaucoup de personne aideront surtout pour des configs. de plugins etc... mais j'ai posté exactement le même topic sur OpenClassrooms (SiteDuZéro) mais aucune réponse...

Voilà, j'espère avoir donner assez d'informations, si quelqu'un peux m'aider, je lui en serait ENORMEMENT reconnaissant...

Voilà voilà, j'ai finis mon roman :D Merci de votre aide !
 
Je suis pas sur qu'il soit possible d'utiliser localhost comme IP. Essaie avec l'ip v4.
Au passage tu devrais activer l'affichage des erreurs php ça permettrait d'avoir quelques précisions.
 
Merci de ta réponse.... Malheureusement... ça ne marche pas :( Toujours rien au niveaux du site, rien ne s'affiche, en revanche dans la console :
LIEN DE L'IMAGE
 
L'affichage des erreurs php sont active, mais, je n'ai aucune erreur, désolé du double post, je viens de voir la deuxième réponse

[EDIT] Sa n'a rien a voir avec l'ip, en localhost les rêquêtes aboutissent bien sur le serveur, c'est le site (script php) qui ne m'affiche rien...
 
L'ip de ton serveur MC c'est 62.210.45.226:20059 ? Ça a pas l'air de fonctionner...

(si c'est juste pour afficher le nombre de joueurs en ligne tu peux aussi passer par une query sans utiliser de plugin)
 
Ahah !! Merci Botsamep, j'avais effectivement, fais une sacré erreur (bête qui plus est) j'avais mis localhost (qui est donc l'ip du serveur web), bon, la le script marche, mais la page me retourne un "Array" quelqu'un a une idée de commande m'afficher le nombre de joueur ? (Transformer "Array" en "2") par exemple...

Aussi, je sais que je peux utiliser une Query pour voir le nombre de joueurs, mais j'ai testé une "commande" simple, pour pouvoir tester, afin de savoir si il était possible de mettre ma boutique en ligne sur pied :)
 
Je croyais que tu avais ton serveur sur la meme machine que ton site :D
Le Array est un tableau à 2 dimensions. Si tu veut avoir le nombre de joueur tu fais par exemple ceci :
Code:
$serveur_online = $serveur_jsonapi->call("players.online.count");
echo ($serveur_online["0"]["success"]);