Исходник простого генератора XMLRPC-запросов.

Пришлось писать самому, то ли я плохо искал, то ли еще чего, но варианта удовлетворяющего меня я не нашел. Выкладываю в паблик, копирайты ради приличия сохраняйте =).. пусть мои непрофессиональные закавыки будут видны всем =)

Есть конечно официальный код (находится здесь), но он мне показался сильно большим, а мне нужен был маленький кусочек, копаться там стало лень.

Быстродействие моего кода и оф.кода не сравнивал.

Собственно сам код (не более 3кб, вместе с комментариями):

/*
 * XMLRPC query builder , singletone class
 * 2011, Written by Wizard
 * http://awlee.ru
 */

class xmlrpc {
  private static $_instance = null;

  private function __construct() {} // restrict constructor
  private function __clone() {}     // restrict clone

  public static function get_instance() {
    if (self::$_instance == null)
      self::$_instance = new self();
    return self::$_instance;
  }

  // check for associative array
  private function _is_hash($a) {
    if (is_array($a))
      foreach ($a as $k=>$v)
        if (!is_numeric($k))
          return true;
    return false;
  }

  // own type detector
  private function _get_type($v) {
    if ($this->_is_hash($v))    return "struct";
    if (is_array($v))           return "array";
    if (is_bool($v))            return "boolean";
    if (is_float($v))           return "double";
    if (is_numeric($v))         return "int";
    if (is_string($v))          return "string";

    return strtolower(gettype($v));
  }

  // basic xmlrpc value wrapper
  private function _item($name=null,$value,$type = null) {
    $have_type = !is_null($type);
    $v = ($have_type?"<$type>":"").$value.($have_type?"</$type>":"");
    if (is_null($name))
      return "<value>".$v."</value>";

    if ($name == "")
      return "<param><value>".$v."</value></param>";

    return "<member><name>$name</name><value>".$v."</value></member>";
  }

  // core xmlrpc function
  // array is:
  //   array(
  //    array(value, type),
  //    array(value, type),
  //    array(value, type),
  //     ...
  //   )
  private function _array($arr, $is_root=false) {
    if (!is_array($arr))
      return "";

    $r = "";
    $is_hash = $this->_is_hash($arr); // parent array is hash
    foreach ($arr as $k=>$v) {
      $t = $this->_get_type($v);
      if (  is_array($v)
         && (count($v)==2)
         && (!$this->_is_hash($v))
         && (!is_array($v[1]))) {
        $t = $v[1]; // type
        $v = $v[0]; // value
      }

      switch ($t) {
        case "array":
          $r .= $this->_item(
                  $is_hash?$k:($is_root?"":null),
                  "<data>".
                    $this->_array($v).
                    "<data>",
                  "array"
                );
          break;
        case "struct":
          $r .= $this->_item(
                  $is_hash?$k:($is_root?"":null),
                  $this->_array($v),
                  "struct"
                );
          break;
        default:
          $r .= $this->_item(
                  $is_hash?$k:($is_root?"":null),
                  ($t=="boolean")?($v?1:0):$v,
                  $t
                );
      }
    }
    return $r;
  }

  // build full xml-query
  public function build_query($method, $params=null) {
    $r  = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
    $r .= "<methodCall>";
    $r .= "<methodName>$method</methodName>";
    $r .= "<params>".$this->_array($params, true)."</params>";
    $r .= "</methodCall>";
    return $r;
  }
};

и пример использования:

include("xmlrpc.php");

$b = xmlrpc::get_instance();
echo $b->build_query("method_without_params");
echo "\n\n";
echo $b->build_query("method_with_params",
      array(
        array(true, "boolean"),
        array(true, "boolean"),
        array("hello world", "string"),
        array("100500", "int"),

        array(
          array(
            array(12,"int"),
            array(144,"int")
          ),
          "array"
        ), // struct array

        array(
          array(
            "a"=>array(2,"int"),
            "b"=>array(3,"int")
          ),
          "struct"
        ) // struct param

      ) // params array
); // build_query

Надеюсь что это решение будет полезно еще кому-нибудь, кроме меня :).

П.С. Сей блог есть костыль для мозга :)

Запись опубликована в рубрике Программирование с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий