Архив метки: api

Как сделать простейшее API для своего проекта?

Бывает, что какой-то проект «вырастает из штанишек» и становится необходимым разработать сервис который будет отдавать часть своих данных, по запросу на сторонние сервера. Вот и меня возникла такая необходимость .Вот каркас, с чего начать.

В моем случае сервер защищен от «чужих» протоколом SSL и сертификатом .p12 с паролем. Соответственно для получения данных по API на сторонних ресурсах необходимы будут pem и key файлы от выданного пользователю сертификата.

Для некоторых может быть удобным получение «сессионного ключа» для авторизации и допуска к API.  В принципе доработать не сложно кому нужно. Приведенные ниже примеры — не рабочие, не хватает части файлов, размещено просто для того чтобы можно было понять принцип разработки.

На сервере в корне создадим файл api.php:

<?php

/* 
 * (с) 2011-2019 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

/* Этот файл - API для получения из NOC различных данных в формате json
 * вход: post/get с заполненым параметром command (массив)
 * выход: json с результатом
 */

$version="1.0.0";


define('WUO_ROOT', dirname(__FILE__));

// Загружаем первоначальные настройки. Если не получилось - выходим
$rez = @include_once(WUO_ROOT.'/config.php');
if ($rez == false) {die();}

header('Content-Type: application/json; charset=utf-8');


// Загружаем классы
include_once(WUO_ROOT.'/class/sql.php'); // Класс работы с БД
include_once(WUO_ROOT.'/class/config.php'); // Класс настроек
include_once(WUO_ROOT.'/inc/connect.php'); // Соединяемся с БД, получаем $mysql_base_id
include_once(WUO_ROOT.'/inc/config.php'); // Подгружаем настройки из БД, получаем заполненый класс $cfg
include_once(WUO_ROOT.'/inc/functions.php'); // Загружаем функции

$command=_GET("command");
if ($command==""){
    $command=_POST("command");
};
if ($command!=""){
	if (is_file(WUO_ROOT."/api/".$command.".php")) {
		include_once(WUO_ROOT."/api/".$command.".php");
	} else {
            $ret["result"]=false;
            $ret["message"]="Метод/команда не найдена";
            die(json_encode($ret));
	}    
} else {
  $ret["result"]=false;
  $ret["message"]="Метод/команда не задан";
  die(json_encode($ret));
};

?>

Как мы видим — суть его, поймать на входе команду, и выполнить файл из папки /api/, совпадающий с именем команды. Так мы избавляемся от головной боли с раширением количества команд API.

В папке /api/  создадим первую команду нашего API — файл version:

<?php

  $ret["result"]=true;
  $ret["message"]="$version";
  die(json_encode($ret));
  
  ?>

Теперь пример использования данного API (для удобства обернуто в класс):

<?php

class NocApi {    
    var $curl_opts = array(
        CURLOPT_URL=>"https://куц.укамцук.ru/api.php",
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_SSL_VERIFYPEER => false, // вход по SSL
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_FOLLOWLOCATION => false, // редиректы
        CURLOPT_MAXREDIRS => 10, // максимальное количество редиректов
        CURLOPT_CONNECTTIMEOUT=>5,
        CURLOPT_CONNECTTIMEOUT=>5,
        CURLOPT_VERBOSE=>true,
        CURLOPT_SSLCERT=>"/home/уцм/укм/cert/укмцу.crt",
        CURLOPT_SSLKEY=>"/home/уцкму/цукм/cert/цукм.key",
        CURLOPT_SSLKEYPASSWD=>"123",
        CURLOPT_POST=>true,
        CURLOPT_POSTFIELDS=>"command=version"
    );
    
    public function __construct(){
        if (! function_exists('curl_init')) {
            throw new Exception('CURL модуль для PHP не установлен!');
        }
    }
    public function Exec($runc=""){
        $curl = curl_init();        
        foreach ($this->curl_opts as $opt => $val){
            curl_setopt($curl, $opt, $val);        
        };
        if ($runc!=""){
          curl_setopt($curl, CURLOPT_POSTFIELDS, $runc);  
        };
        $data = curl_exec($curl);
        if (curl_errno($curl)) {
              $ret["result"]=false;
              $ret["message"]=curl_error($curl);
              die(json_encode($ret));            
        } else {
            return json_decode($data);
            curl_close($curl);
        };
    }
    
}

$noc=new NocApi();
$res=$noc->Exec("command=version");
var_dump($res);

Результат выполнения:

object(stdClass)#2 (2) { ["result"]=> bool(true) ["message"]=> string(5) "1.0.0" }

Работаем с Router OS через API

Задача: организовать блокировку абонентов по «балансу», установка скорости интернета абонента, защита от «ручных IP». Биллинг: Lanbilling, Железка: Router OS

  1. Блокировка по «балансу»
Читать далее Работаем с Router OS через API

Реализация рисования на картах с использованием API Яндекс.Карт.

Задача: необходимо реализовать рисование на картах, с возможностью сохранения нарисованного во внешнюю базу.

Снимок экрана из 2015-07-01 10:34:22

Решение: будем использовать API Яндекс.Карт.

Логика: отображаем карту в зависимости от выбранного подразделения, и слоя. При выборе подразделения или слоя, подгружаем из вне ранее нарисованные обьекты. При нажатии кнопки «Сохранить» — сохраняем их во внешнюю базу.

Демо (безо возможности сохранения обьектов)

Далее код: Читать далее Реализация рисования на картах с использованием API Яндекс.Карт.

API yandex карт и капризы с типами переменных JavaScript

При работе с API Yandex карт столкнулся наконец с еще одним недостатком JavaScript, а точнее отсутствие явного задания типа переменной. Например, долго искал ошибки в этом коде:

  lastcoors=JSON.parse(e);   // парсим JSON в массив
                              ldt=lastcoors.rows[0].cell[0];
                              lid=lastcoors.rows[0].cell[1];
                              limei=lastcoors.rows[0].cell[2];
                              lx=lastcoors.rows[0].cell[3];
                              ly=lastcoors.rows[0].cell[4];
                              lz=lastcoors.rows[0].cell[5];                             
                              myPlacemark = new ymaps.Placemark([lx, ly], {                                  
                                balloonContentHeader: "Балун метки",
                                balloonContentBody: "Содержимое <em>балуна</em> метки",
                                balloonContentFooter: "Подвал",
                                hintContent: "Хинт метки"
                                });                              
                                
                              myMap.geoObjects.add(myPlacemark);
                              myMap.panTo([lx, ly], {delay: 1500});

Метка ставится правильно, а перемещение идет невесть куда. Оказалось, что при разборе JSON, переменные lx и ly почему-то становятся строками, и если функции PlaceMark все равно с чем оперировать, с числом или строкой, то PlanTo непременно работает только с числом.

Решение: в JavaScritpt строка становится числом если участвует в математической операции.

Например:

n=1; //явное число
lx=lx*n; // lx тоже становится числом.

Итого получаем рабочий код:

  lastcoors=JSON.parse(e);   // парсим JSON в массив
                              n=1;
                              ldt=lastcoors.rows[0].cell[0];
                              lid=lastcoors.rows[0].cell[1];
                              limei=lastcoors.rows[0].cell[2];
                              lx=lastcoors.rows[0].cell[3]*n;
                              ly=lastcoors.rows[0].cell[4]*n;
                              lz=lastcoors.rows[0].cell[5]*n;                             
                              myPlacemark = new ymaps.Placemark([lx, ly], {                                  
                                balloonContentHeader: "Балун метки",
                                balloonContentBody: "Содержимое <em>балуна</em> метки",
                                balloonContentFooter: "Подвал",
                                hintContent: "Хинт метки"
                                });                              
                                
                              myMap.geoObjects.add(myPlacemark);
                              //alert(lx);alert(ly);
                              myMap.panTo([lx, ly], {delay: 1500});

Свои карты в Яндекс-Картах.

По мотивам вот этой статьи. Не захотелось тратить время на разработку своего движка,т.к. вдумчиво почитав документацию к API.Yandex пришел к выводу, что весь функционал необходимый для моих нужд, уже есть и написан. Один правда большой недостаток — для работы необходимо будет постоянное подключение к интернет, не нашел пока способа вытащить скрипты от яндекса в оффлайн. Итак, пошаговое руководство:
Читать далее Свои карты в Яндекс-Картах.