背景

打算做一个网站,因为考虑开发移动客户端,所以关于 api 的方式有下面两种想法,大家给点意见哪种好,或者还有别的更好的方法。

前提

网站前后端使用 Ajax + JSON 的方式数据交互,打算用 AngularJS

方式

想到的两种方式:

  1. 网站按正常方式开发,然后为客户端单独开发 REST 接口

    这样的问题:
网站既然用 Ajax + JSON 也得写 REST 接口,这样就等于写了两套接口,感觉会有重复的工作

  2. 网站和客户端使用一套接口

    这样好处:
接口就用一套

    这样的问题:
主要是用户验证有点没有想明白,正常网站的用户验证( Session Cookie )和客户端的用户验证( token ) 不一致,导致接口得处理不同的来源使用不同的验证方式,第一种方式倒是没有这个问题。
其实这个问题倒是想到一种解决方法,初步想的是把 token 存到本地,不清楚这样是不是最佳实现方式。

讨论

V2EX跟大家讨论后,确定倾向于第二种方法:全部用一套接口。

那么有几个问题需要解决:

  1. token 存在什么地方合适呢? Cookie ? LocalStorage ?还是 SessionStorage ?仅仅是一个 token 的话,我更倾向于存在 Cookie 中,如果涉及到记住密码什么的是不是就得存到 LocalStorage 中了。大家怎么做的?

  2. 每次请求一个 API 的时候, token 是添加到 HEADER 中还是当一个参数呢,那种更好? 我想了下貌似没什么区别。

  3. 应该会发生跨域的问题吧,假如 API 用子域名的话比如: http://api.test.com/user ,这时在 http://www.test.com/user 页面访问的时候就会有跨域问题吧,怎么破?用 jsonp ?那样就都是 get 方法了,怎么破?

问题解决如下:

  1. token 存在什么地方貌似都没有太大所谓,如果需要记住密码什么的,最好是 Cookie 或 LocalStorage。

  2. token 封装到 Request HEADER 中去,算是比较好的处理方法。

  3. 跨域的解决办法就要靠CORS了,貌似GibHub API 就是用的这个。

总结

整个思路如下:

  • 写一套通用的 RESTful 接口

  • 其他端都当做客户端去开发,包括 网站、APP、桌面应用 等等

  • 用 token 做用户验证,可以搭建 OAuth Server

  • 客户端把 token 写入到 Request HEADER 中去请求接口

  • 网站跨域的问题采用 CORS 解决。