列出一些数据的例子可能是:
$.ajax({ url: 'http://myserver.com/posts/index.json',dataType: 'jsonp',success: function(data) { for (var i=0,total=data.length; i<total; i++) { console.log(data.Post.title[i]); } } });
这很好,返回的数据可以在我的PhoneGap应用程序中使用.但是,我们说这个帖子列表需要你登录…
我该如何处理?因为不像通常的身份验证请求重定向到登录表单,在我的JSON世界中,这不会发生.事实上,发生的是实际的HTML登录表单被返回,然后导致错误,因为我的JavaScript期待JSON,而不是HTML.
是否有最佳实践来处理这个问题,例如如果身份验证请求,然后在PhoneGap应用程序中加载登录表单视图,而不是像应用程序那样从应用程序返回HTML登录表单?也许通过JSON发送auth请求?
例如,一个简单的JSONize方法看起来像:
public function index() { $this->set('posts',$this->paginate()); $this->set('_serialize',array('posts')); }
如前所述,我可以通过不将方法名称传递给$this-> Auth-> allow()来保护beforeFilter中的此方法.所以我假定我需要在beforeFilter中做一些聪明的事情来知道请求是否是JSON,如果是这样,那么检查方法是否需要授权,然后如果是这样,可以发回一个错误(而不是HTML格式作为Cake通常通过AuthComponent)在JSON或允许访问.
更新:2012年1月13日
在对这个问题进行了一些研究之后,我看了一下Forrst API,因为他们似乎已经有效地构建了我正在使用RESTful API来构建的内容.
例如,他们有一个电话:https://forrst.com/api/v2/post/comments?tiny_id=HUD这基本上是说显示对于HUD的微小id的帖子的评论.如果您没有通过身份验证,您将获得的返回值如下:
{"resp":{"error":"this method requires authentication"},"stat":"fail","in":0.0903,"authed":false,"authed_as":false,"env":"prod"}
现在有趣的部分是,如果我登录了Forstst,我仍然会收到该错误消息,因为它不是在看我的会话,而是期待一种令牌来验证实际的请求.例如?=的access_token 550e8400-e29b-41d4-a716-446655440000
所以我猜这个主要的问题是,我该如何将它建立在我的蛋糕应用程序中?计划如下:
在我的应用程序中,无论您是通过AJAX还是通过浏览器请求,都会将您重定向到登录页面. Forrst处理两者,ALWAYS在调用API时返回JSON错误,并且不会返回HTML!这是我在实现中要实现的.我已经向我的用户表添加了一个access_token列(出于安全考虑,任何人更新密码时都会更改).下一步是A)检查受保护方法的此访问令牌,并允许或拒绝是否正确,然后B)当不存在令牌或不正确并且发送正确的错误状态而不是HTML登录时,我需要某种处理形成.
解决方法
所以,你可以做的只是通过运行以下代码来检查它是否是一个XMLHttpRequest:
PostsController – index()
if ($this->RequestHandler->isAjax() == 1){ // This is an Ajax call $this->layout = 'json'; $this->set('data',array('data','to','parse')); } else { // This is the normal request # do the stuff you want to do here as usual }
但是,由于这将要求您登录,因为它不在$this-> Auth-> allow()列表中,除非您登录,否则将不会访问,所以您需要做的是创建一个新的处理第一个请求的AjaxController.简单地把上面的代码放在beforeFilter中,从那里做你的魔法.从那里你可以简单地检查一个人是否登录,以及该用户的当前状态.如果他已经登录,并且要返回数据.您可以使用requestAction(‘/ path / to / what / i / need))调用所需的模型或调用控制器函数,其中您可以在Ajax调用中发送的后置变量中声明所需的路径.
在ajax布局中,您可以告诉json_encode $data,然后将正确解析.
应用
现在在您的JavaScript中,您将获得一些数据.假设您使用以下键来构建返回的JSON字符串:状态和数据.
我们假设状态已经被设置为返回的JSON中的auth,你知道你需要进行身份验证,所以你可以显示一个登录表单,然后处理所有的东西.只需在应用程序中创建一个很好的登录视图,就可以控制它的各个方面,并希望使其更安全.
如果状态设置为成功,则可以相应地显示所有帖子.
我有另一个主题的答案,我将展示我们如何创建我们自己的API,也许可以通过某种方式帮助您:https://stackoverflow.com/a/11422866/1110760
警告JavaScript似乎在Phonegap应用程序中是安全的,但不是!任何人都可以从Android设备下载.apk文件,并在Android模拟器中打开它,然后可以查看所有JavaScript和HTML代码.所以要非常小心,您将直接编入JavaScript中的数据以及API的访问方式.
我知道我的答案有点模糊,所以如果你需要关于这个答案的其他信息,请问!