最佳实践以及如何在 Symfony2 中找到从 iOS AFNetworking 获取 POST 数据并在 GET 中返回 JSON?

Posted

技术标签:

【中文标题】最佳实践以及如何在 Symfony2 中找到从 iOS AFNetworking 获取 POST 数据并在 GET 中返回 JSON?【英文标题】:Best Practices and how to find get POST data from iOS AFNetworking in Symfony2 and return JSON in GET? 【发布时间】:2013-12-12 01:24:28 【问题描述】:

我正在构建一个移动应用程序 (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:当我 NSlog(回显它)时,GET 返回一个没有数据的空 JSON 响应,只有键。我的代码如下所示:

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 的早期版本中,我通过在 JSON 中发送参数构造了要在 index.php 中执行的实际代码,所以如果我想要登录,我发送了类似 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');,
    );

您的 post 操作基本上看起来没问题,但是当 json 不包含实体 USER 的每个字段时,反序列化将失败。您可以使用注释配置实体以进行序列化/反序列化。

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

我不确定我是否理解您的最后一个问题,但我认为您必须在应用程序中硬编码路径。


Symfony2 非常棒,在编写 API 时绝对有用。但是如果你不想处理序列化/反序列化,你可以试试http://laravel.com/。它基于 symfony 构建,您可以动态生成 api。

【讨论】:

以上是关于最佳实践以及如何在 Symfony2 中找到从 iOS AFNetworking 获取 POST 数据并在 GET 中返回 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 共享的 CSS 和 JS 资产在哪里,最佳实践是明智的?

getForm() symfony2.8 后更改表单对象默认参数的最佳实践

.Net异步编程异步编程场景以及最佳实践

数据驱动测试-从方法探研到最佳实践

Symfony 2 - 使用资产

Git 在团队中的最佳实践--如何正确使用Git Flow