Хобрук: Ваш путь к мастерству в программировании

Лучшие практики и как получить данные POST из iOS AFNetworking в Symfony2 и вернуть JSON в GET?

Я создаю мобильное приложение (iOS) и серверную часть Symfony2 REST. В Symfony2 мои маршруты работают правильно, и я проверил их с помощью AJAX и httpie, все операции CRUD и т. д. в порядке. Теперь я пытаюсь получить доступ к маршрутам из приложения. Пока что я могу получить доступ к маршрутам, и когда я смотрю в Symfony2 Profiler, я вижу записи в последних 10 записях, чтобы убедиться, что я обращаюсь к серверу с моими запросами POST и GET. Теперь у меня есть 2 вопроса, и я был бы рад, если бы люди могли указать мне направление для ** Best Practices ** о том, как действовать дальше.

Проблема 1: Хотя я отправляю данные, которые я вижу в разделе «Запрос», когда я пытаюсь создать запись, создаются только записи NULL, что означает, что данные теряются. Это мой контроллер для создания пользователей, например:

public function postUserAction(Request $request)
{
    $content = $this->get('request')->getContent();
    $serializer = $this->get('jms_serializer');
    $entity = $serializer->deserialize($content, 'Name\BundleName\Entity\User', 'json');

        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

    return array(
        'entity' => $entity,
    );
}

Когда я смотрю в журнал, единственное, что выделяется, это: Запрос файлов cookie (без файлов cookie), Запрос контента: «Запрос контента недоступен (он был получен как ресурс)». Это говорит мне, что данные отсутствуют, как я могу получить эти данные и использовать их? Или что еще может быть?

Проблема 2: GET возвращает пустой ответ JSON без данных, только ключи, когда я NSlog (выведите его). Мой код выглядит так:

public function getUsersAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('NameBundle:User')->findAll();

    return array(
        'entities' => $entities,
    );
}

Из журнала он имеет набор файлов cookie запроса: PHPSESSID => «1udududjjs83883jdlb4ho0j4», но снова в содержимом запроса говорится: «Содержимое запроса недоступно (оно было получено как ресурс)». Как я могу заставить его возвращать данные с помощью JSON? Это хорошо работает в браузерных тестах AJAX и httpie.

Проблема 3: Используя AFNetworking, у меня есть символическая константа, которую я установил как APIHost (IP-адрес), а APIPath — это папка. Теперь в моей более ранней версии с использованием собственного PHP я создал фактический код для выполнения в index.php, отправив параметр в JSON, поэтому, если мне нужен логин, я отправил что-то вроде todo:login, но с Symfony2, я не уверен или знать даже лучшие практики для этого случая. В идеале я хотел бы указать запрос на стороне сервера в запросе JSON, а затем найти правильный маршрут в Symfony2, но как это сделать, и если да, можете ли вы привести пример? Обходной путь заключается в том, чтобы указывать жестко закодированные пути в AFNetworking каждый раз, когда мне нужно сделать запрос, который, как мне кажется, тесно связывает код, и мне нужно вносить изменения во многих местах каждый раз, когда что-то меняется на стороне сервера. Спасибо и извините за долгий вопрос!


Ответы:


1

Вы ожидаете, что jmsserializer сотворит для вас волшебство. Но этого не будет, вам нужно сначала настроить его. Из вашего кода я вижу, что вы неправильно используете jmsserializer.

В getUsersAction() вы должны вернуть сериализованный ответ, но вы возвращаете массив объектов. Это будет правильный путь:

public function getUsersAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('NameBundle:User')->findAll();
    $serializer = $container->get('jms_serializer');

    return array(
        'users' => $jsonContent = $serializer->serialize($entities, 'json');,
    );
}

Ваше почтовое действие в основном выглядит нормально, однако, когда json не содержит всех полей объекта USER, десериализация завершится ошибкой. Вы можете настроить сущность для сериализации/десериализации с помощью аннотаций.

http://jmsyst.com/libs/serializer/master/reference/annotations

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


Symfony2 великолепен и абсолютно полезен при написании API. Но если вы не хотите иметь дело с сериализацией/десериализацией, вы можете попробовать http://laravel.com/ . Он построен на Symfony, и вы можете генерировать API на лету.

12.12.2013
Новые материалы

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..