JSON API设计:在多个地方包含相同的资源

时间:2017-08-31 01:57:46

标签: json api-design rails-api

假设我正在开发一个用作API的Rails后端。我有一个Book模型has_many Reviews。每个Reviews has_many Photosbelongs_to一个User。为了了解我的目的,想象酒店评论网站,其中有来自酒店用户的图片在一个图库中。但是,除了画廊,您还可以找到用户的个人评论,其中包含几张图片。目前我的JSON响应看起来像这样:

{
 book: {
  id: 1,
  star_rating: 5
  original_images: []
 },
 reviews: [
  {
   id: 1,
   title: "great book",
   photos: [
    {
     url: "http://foobar.gov",
     caption: "hi"
    },
    {
     url: "www.hello.world",
     caption: "hi"
    }
   ],
   user: {
    name: "Fred"
   }
  },
  {
   id: 2,
   ..etc
  }

我的困境:在我的应用程序的前端,我希望能够遍历评论并显示评论数据+评论照片,所以做一些像review.userreview.title和循环中的review.photos非常棒,可以使用我当前的数据结构。另一方面,当我想展示一个画廊时,如果我在original_images的结构的同一级别有一个数组,它将包含所有的URL,这对我来说会更容易。但是,如果我要这样做,当我想要显示特定评论的照片时,我必须在一个巨型大小的数组中进行搜索并选择属于的图像特别审查。

我的问题:我应该将照片包含在多个地方吗?他们现在在哪里,但也作为original_images的兄弟姐妹在一个大阵列中?

1 个答案:

答案 0 :(得分:0)

因此,您似乎希望解决有关评论照片的两个问题:

  1. 显示特定资源的所有评论照片(在您的情况下为酒店)。
  2. 仅显示资源的各个评论照片。
  3. 我认为当页面加载到酒店时,您需要准备好所有评论照片。当您想要显示单个评论的照片时,我认为用户会点击评论并转到新页面或出现某种模式。

    您的API目前正在向您发送所需的所有数据。现在您只需要在客户端进行数据处理以满足您的需求。因此,当页面加载时,您将遍历响应并创建两个数组:reviewsallReviewImages。然后,您将通过allReviewImages数组获取酒店的所有评论图像,然后通过reviews数组显示所有评论及其相关图像。

    要在单独的页面或模式中显示单个评论的图像,您可以在浏览reviews数组时创建必要的逻辑/链接:<div data-imagelink="{reviews.photos[id]}"></div>

    我不知道你的客户端是用什么编码的,但你从上面的例子中得到了想法。

    您正在从API响应中获取所需的数据,您只需要在客户端进行一些争论,您就应该能够做到所需的一切!