За последние 24 часа нас посетили 17893 программиста и 1569 роботов. Сейчас ищут 1294 программиста ...

API JSON и кириллица

Тема в разделе "Laravel", создана пользователем Sergeyol, 30 сен 2020.

  1. Sergeyol

    Sergeyol Новичок

    С нами с:
    30 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    Всем доброго вечера!

    Версия Laravel: 7

    Не пинайте сильно за вопрос, ибо только начинаю знакомиться с Laravel. Самостоятельный поиск ответа в ПС дал несколько версий и примеров, но повторюсь, по ввиду малого опыта не удалось применить найденные знания для получения желаемого результата.

    Создал учебный проект по api из примера twilio[dot]com/blog/build-secure-api-php-laravel-passport. Локально на ноутбуке все моменты, рассматриваемые в статье получились. Postman при получении правильных запросов дает ожидаемые ответы. Но захотелось поработать с api из проекта на Delphi.

    Особых трудностей с Delphi не возникло, запросы отправляются, ответы приходят. Но кириллица в json приходит нечитаемая. Попытался экспериментировать с параметром JSON_UNESCAPED_UNICODE, как написано в многочисленных статьях, но по видимому не умею правильно применить параметр в response. Или не работает совсем, или работает и кириллические символы приходят нормально, но при этом ломается структура json-ответа.

    Вот как в статье написана функция индекс, отдающая все записи:
    Код (Text):
    1.  
    2. public function index()
    3. {
    4.     $ceos = CEO::all();
    5.     return response(['ceos' => CEOResource::collection($ceos), 'message' => 'Retrieved successfully'], 200);
    6. }
    Скриншот с первоначальным вариантом:
    [​IMG]

    Вот как получилось подправить ответ у меня, с поломкой структуры ответа:
    Код (Text):
    1.  
    2. public function index()
    3. {
    4.     $ceos = CEO::all();
    5.     return response(CEOResource::collection($ceos)->toJson(JSON_UNESCAPED_UNICODE), 200);
    6. }
    Скриншот с кириллицей, и поломанной структурой (не как в статье) ответа:
    [​IMG]

    Есть ли возможность получить кириллические символы в json-ответе, но не ломая структуру примера?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Вообще, кириллица не ломается, а кодируется. И типичные клиенты (коими, обычно, являются браузеры, а не десктопные приложения), прекрасно преобразуют коды обратно в читаемые символы.

    На вашем месте, я бы поискал библиотеку для делфи (кстати, ради интересу, на кой оно вам чёрт сдалось?), которая нормально понимает json

    но так-то ответ на ваш вопрос очевиден
    PHP:
    1. public function index()
    2. {
    3.     $ceos = CEO::all();
    4.     return response(json_encode(['ceos' => CEOResource::collection($ceos), 'message' => 'Retrieved successfully'], JSON_UNESCAPED_UNICODE), 200);
    5. }
    Или как-то так, чтоб всё-таки было больше вызовов ларавеля: https://stackoverflow.com/questions/54990092/use-json-unescaped-unicode-in-api-resource-laravel

    Но, повторюсь, по дефолту PHP (именно он, а не Laravel) ничего особенного с джсоном не делают, и правильный клиент должен правильно расшифровать такие джсоны, вернув кириллицу на место. Я ни разу не использовал этот флаг с ларавелем, и вообще за 8 лет коммерческой разработки может раз или два он мне зачем-то понадобился, для какого-то кривого сервиса, кажется.
     
    Sergeyol нравится это.
  3. Sergeyol

    Sergeyol Новичок

    С нами с:
    30 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    Ломается не кириллица, а структура ответа.

    Инерция, привычка, что-то для себя с академическими целями удобнее набрасывать на дельфи...

    И спасибо Вам огромное, получилось именно то, что нужно. Библиотеки для работы с json'om еще поищу, прототип и вся связка в целом заработала.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    PHP:
    1. return response( ['ceos' => CEOResource::collection($ceos) -> toJson(JSON_UNESCAPED_UNICODE), 'message' => 'Retrieved successfully'], 200);
    внимательно смотрим что меняем..
     
    Sergeyol нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    То, что я вижу по скрину, вы на дельфях изобретаете постман :))
     
    Sergeyol нравится это.
  6. Sergeyol

    Sergeyol Новичок

    С нами с:
    30 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    И Postman и Advanced REST Client уже изобретены, скачаны, установлены). А на скрине набросок, чтобы хоть как-то проверить работу системы. Потом на досуге поэкспериментирую над чем-то более приближенном к реальности.

    В php и Laravel я пока абсолютный ноль, начинаю понимать что без базовых знаний тут совсем плохо. Посматриваю сейчас на книги и курсы, что есть в доступе.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну так для начала выучите php как язык. После делфей должно занять недельку от силы.
    https://www.php.net/manual/ru/langref.php
    --- Добавлено ---
    У него много своих особенностей в плане ООП, которые активно используются в Laravel (весь Laravel построен на так называемой "Магии PHP")
     
    Sergeyol нравится это.