0

给定一个使用推送状态和 RESTful 后端的单页应用程序,我们可以想象访问/resourceName(ie /users) 处的资源列表。所以 /users 会创建一个格式化的用户列表

现在的问题是,这个资源 JSON 或 XML 提要也应该映射到/resourceName,所以如果启动表单我的应用程序入口点/那么一切都很好,当导航到/usersJS 路由器时可以触发获取 JSON 数据的 Ajax 调用。现在的问题是,如果 URL 直接指向,/users那么我将登陆 JSON 提要而不是实际列表。我可以将所有调用路由到一个主入口点,然后让 JS 路由器完成工作,但如果我这样做,AJAX 调用来获取 JSON 会刹车。

我记得不久前人们添加.json到他们的 json 请求,甚至是 GET 参数?format=json,然后让控制器采取不同的行动。我觉得这有点 hacky.. 还有其他方法可以解决这个问题吗?

就此而言,我正在使用 laravel4 后端和主干JS

4

4 回答 4

1

您使用什么方法来获得不同的响应取决于您希望如何去做。由于您询问的是一个固执己见的话题(没有一个正确答案),因此您可以探索以下一些选项。

首先,这是Apigee 关于 API 设计的好读物,它涵盖了我将在这里写的内容。请参阅第 20 页“支持多种格式”

  1. Rails 方式:在请求的末尾附加 .json、.xml 或其他扩展名,并在 Laravel 中处理该代码(您可能希望使用“before”过滤器来检查请求或 Laravel 的优秀路由参数,这允许使用正则表达式来定义路由)。
  2. 您可以检查请求中的“接受”标头,并将您的 ajax 调用中的标头设置为“application/json”而不是默认的“application/html”,以通知您的应用程序在其响应中使用哪种格式。同样,之前或之后的过滤器可能会派上用场来检查请求并根据需要定义响应
  3. 创建一个查询字符串 `?format=json" 或类似的。与第 1 点相同的注释。

Laravel 没有内置的方法来为你改变响应。但是,您可以相当容易地检测到所询问的内容并选择要返回的格式。但是,您确实需要考虑如何实现这一点。

我想到了一些选项:

  1. 使用“之前”或“之后”过滤器来检查请求“想要”格式的内容,并对响应进行一些转换以使其工作
  2. 扩展请求和响应类以“自动化”这一点(请求类检测格式,响应类将响应转换为正确格式)

希望有帮助

于 2013-08-26T19:45:08.060 回答
1

我认为.json请求结束是最好的方法。api.mydomain.com另一种方法可能是为api请求创建一个单独的端点www.mydomain.com

于 2013-08-26T15:41:55.523 回答
0

我最终按照@Aaron Saunders 的建议使用了不同的端点。在 laravel 4 中,使用组路由很容易实现:

应用程序.php:

'domain' => 'whatever.dev',

路线.php:

define('APP_DOMAIN', 'app.' . Config::get('app.domain'));
define('API_DOMAIN', 'api.' . Config::get('app.domain'));

Route::group(array('domain' => API_DOMAIN), function()
{
    // API ROUTES
});


Route::group(array('domain' => APP_DOMAIN), function()
{
    // VIEW ROUTES
});

美丽的!

于 2013-08-27T02:52:21.627 回答
0
  1. 说你想要哪种表示是有效的。例如 JSON、XML 或二进制,取决于您想要什么以及您开发了哪些序列化程序。

  2. 您的框架应该支持默认表示的设置,或者如果您提供一些映射URL->method您应该能够说出您要返回的表示 - 默认情况下或在代表您请求的某个对象中采用。

于 2013-08-26T06:50:42.633 回答