最佳实践以及如何在 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 资产在哪里,最佳实践是明智的?