API

День добрый. Есть такой плагин, живущий только на гитхабе, под названием API. Попытался использовать его и обнаружил, что лично у меня он выдаёт ответы в кодировке koi7, а хотелось бы utf-8. Подскажите, пожалуйста, может кто помнит где и что подкрутить.

16 комментариев

avatar
неплохо бы ссылку на плагин.
avatar
avatar
Может дело в настройках сервера? Например если апач, то прописать в файл .htaccess в корне плагина AddDefaultCharset UTF-8
P.S.: вы уже перешли на 2.0? )
avatar
1. Не помогло.
2. Нет и это в принципе невозможно пока, слишком многое умрёт.
avatar
Посмотрел плагин. Все файлы в кодировке UTF-8.
1. Попробуйте в файле application/plugins/api/classes/actions/ActionMain.class.php В функции Init указать следующий код:
header('Content-Type: text/html; charset=utf-8');

По идее кодировка явно указана в файле index.php в корне сайта.
2. Если первый вариант не помог, скорее всего надо колдовать с настройками сервера.

Пришлите ссылку на сайт.
avatar
Спасибо, но не помогло. По идее json создаётся где-то в недрах движка средствами php, вероятно следует поискать где-то там. Пока не могу найти, проблема только с json всё остальное работает в нормальной кодировке. Вот пример, запрос списка блогов.
avatar
С ответом сервера все в порядке.
$s='{"response":{"collection":{"29":{"blog_title":"\u0421\u0442\u0438\u0445\u0438 (\u0432\u043d\u0435 \u0436\u0430\u043d\u0440\u043e\u0432)"},"30":{"blog_title":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0437\u0430 (\u0432\u043d\u0435 \u0436\u0430\u043d\u0440\u043e\u0432)"},"217":{"blog_title":"\u041b\u044e\u0431\u043e\u0432\u043d\u0430\u044f \u043b\u0438\u0440\u0438\u043a\u0430"},"3":{"blog_title":"\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430"},"221":{"blog_title":"\u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0430\u044f \u043b\u0438\u0440\u0438\u043a\u0430"},"218":{"blog_title":"\u0413\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0430\u044f \u043b\u0438\u0440\u0438\u043a\u0430"},"225":{"blog_title":"\"\u0412\u0435\u0441\u0451\u043b\u0430\u044f\"  \u043f\u043e\u044d\u0437\u0438\u044f"},"219":{"blog_title":"\u041f\u0435\u0439\u0437\u0430\u0436\u043d\u0430\u044f \u043b\u0438\u0440\u0438\u043a\u0430"},"177":{"blog_title":"\u041c\u0443\u0437\u044b\u043a\u0430 (\u0431\u0435\u0437 \u0436\u0430\u043d\u0440\u043e\u0432, \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b)"},"229":{"blog_title":"\u041c\u0430\u043b\u044b\u0435 \u043f\u0440\u043e\u0437\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u044b"}},"count":"33"},"sMsgTitle":"","sMsg":"","bStateError":false}';
print_r(json_decode($s));
exit;


Выдает
stdClass Object ( [response] => stdClass Object ( [collection] => stdClass Object ( [29] => stdClass Object ( [blog_title] => Стихи (вне жанров) ) [30] => stdClass Object ( [blog_title] => Современная проза (вне жанров) ) [217] => stdClass Object ( [blog_title] => Любовная лирика ) [3] => stdClass Object ( [blog_title] => Новости сайта ) [221] => stdClass Object ( [blog_title] => Философская лирика ) [218] => stdClass Object ( [blog_title] => Гражданская лирика ) [225] => stdClass Object ( [blog_title] => "Весёлая" поэзия ) [219] => stdClass Object ( [blog_title] => Пейзажная лирика ) [177] => stdClass Object ( [blog_title] => Музыка (без жанров, общий раздел) ) [229] => stdClass Object ( [blog_title] => Малые прозаические формы ) ) [count] => 33 ) [sMsgTitle] => [sMsg] => [bStateError] => )


Смотрите код получателя.
avatar
Лиса например на лету перекодирует, а хром нет. В результате в клиенте просто пишу функцию по перебору и перекодированию посимвольно.)
avatar
www.php.net/manual/ru/function.json-encode.php
Можно попробовать поэкспериментировать с параметрами функции json-encode
echo "Юникод: ",     json_encode($a, JSON_UNESCAPED_UNICODE), "\n";


Здесь сама функция находится framework/classes/modules/viewer/Viewer.class.php:386
if ($sType == 'json') {
            if ($this->bResponseSpecificHeader and !headers_sent()) {
                header('Content-type: application/json');
            }
            echo json_encode($this->aVarsAjax);
        } 
avatar
Во. Спасибо. Тут должно взлететь. ))
avatar
Спасибо, предыдущие советы помогли и в первую очередь конечно, о чудо )), дело в клиенте которым я получал информацию. Но сейчас натолкнулся на такое. Если не трудно, раз вы уж просмотрели этот плагин, подскажите где могут быть проблема в следующем?
Итак в файле Main.class.php есть функция для логина. LoginApiUser(). И в частности та часть кода, которая создаёт новую сессию:
			  
                $oSession = Engine::GetEntity('PluginApi_ModuleMain_EntitySession'); 
                $oSession->setUserId($oUser->getId());
                $oSession->setHash(func_generator(32));
                $oSession->add();
                $oSession->setUser($oUser);
                return $oSession;

Когда я использую этот код, то получаю sql ошибку о том. что такой таблицы prefix_api_session не существует.
Попытался получить сущность сессии так: $oSession = $oUser->getSession();
Это срабатывает, но не работает метод add(). Вероятно он и создаёт новую сессию? В принципе после комментирования add(). плагин возвращает хеш, но скормить его назад в других методах api не удаётся. Не знаете, как обойти это дело и в чём проблема?
avatar
Ага, я так понял, что такая таблица сессий только в версии 2.0 создаётся? Стандартную таблицу не стоит использовать вместо этой?
avatar
Думаю лучше всего создать таблицу prefix_api_session. Продублируйте ее из текущей таблицу prefix_session. Проверьте наличие и типы полей user_id и hash.
Попытался получить сущность сессии так: $oSession = $oUser->getSession();
Это срабатывает, но не работает метод add().
Если вы берете уже созданную сущность, то нужно использовать методы Save или Update. Add — пытается создать новую сессию, которая уже по идее создана.
avatar
Спасибо.
avatar
Вы юзаете этот плагин под 2.0 или под 1.0.3?
Если под 1.0.3 возможно имеет смысл использовать плагин до его обновления на 2.0 — вот ветка до обновления.
P.S.: если не секрет, поделитесь чем вам этот плагин полезен, какие задачи решает?
avatar
Под единицу. Спасибо за ветку, что-то не заметил. Кстати, в первой версии функционала-то чуть больше. К примеру возможно чтение комментариев.
И по пользе. Во-первых, я играюсь с приложением для сайта — это пока чисто для себя. Как пример, я могу быстро выкачать все топики сайта в приложение (правда, не очень представляю масштаб этого дела, не исключаю, что это тупо невозможно). Ну а в дальнейшем приложение для пользователей планирую, если руки дойдут. Другой вопрос, что сейчас плагин только на чтение заточен, но мне кажется, что не будет сильно запарно и на публикации его переписать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.