【问题标题】:Google App Engine sends too much data with JSONGoogle App Engine 使用 JSON 发送的数据过多
【发布时间】:2014-11-29 11:37:41
【问题描述】:

我使用数据存储区创建了一个非常简单的 API,其中包含 GAE 和 Cloud Endpoints。我制作了一个名为 Book 的实体,其中包含一些属性(其中大部分是字符串)并部署了应用程序。

我的 GET 和 POST 请求可以正常工作,但是我不明白为什么每次执行 GET 请求以检索数据存储区中的实体时,JSON 中都会多出一行,例如:

{
        "id": "5634482569460976",
        "date": "20141125",
        "author": "Charly",
        "kind": "bookendpoint#resourcesItem"
    }

我从未在我的实体中设置“种类”属性,这是从哪里来的? 除了在每个 json 响应的末尾,我还可以找到这两行:

"kind": "bookendpoint#resources",
"etag": "\"dIDB-NLukmBT86-tBYjgZpbt2_Y/FcVIa289PJU7Cjr-bG8b0oxmfrKQ\""

我也不知道那些“kind”和“etag”是从哪里来的。

您能告诉我这些是什么以及如何防止它们出现在 JSON 响应中吗?

【问题讨论】:

  • 你找到删除这些标签的方法了吗?

标签: android json google-app-engine


【解决方案1】:

这两个属性都是由 Cloud Endpoints 自动添加的。我不知道如何删除它,Google 似乎也没有记录添加它们的原因,但其中一些很容易猜到。

kind 字段

kind 向 Android 客户端指示如何序列化(从 JSON 文本转换为 Java 对象)数据。当多态性发挥作用时,这很有用。例如,假设您将从端点返回此类:

public class Library {
  public List<Item> items;
}

public interface Item{
  private String title;
}

public class Book extends Item {
}

public class Magazine extends Item {
}

然后假设您的 Android 客户端收到此 JSON 数据:

{
  "items": [
           {"title":"My book"},
           {"title":"My magazine"},
      ]
}

那么客户端怎么知道哪个是Book,哪个是Magazine?这些类在客户端可能具有完全不同的行为,因此了解这一点很重要。

但是,如果您添加 kind 字段,序列化程序将能够选择正确的 Item 实现:

{
  "kind": "bookendpoint#Library"
  "items": [
           {"title":"My book","kind": "bookendpoint#Book"},
           {"title":"My magazine","kind": "bookendpoint#Magazine"},
      ]
}

etag 字段

这个对我来说有点神秘。在 HTTP 协议中,ETag 是一种资源的哈希值,用于在客户端缓存资源,如果没有更改,则避免再次下载。

通常,服务器在提供资源时会提供一个 ETag,然后客户端会询问“给我该资源,除非 ETag XXX 仍然有效”。仍然涉及 HTTP 请求,但不需要下载,除非资源在服务器端发生了变化。

您可以在this Wikipedia page 上阅读更多关于 ETag 的信息。

ETag 对 Cloud Endpoints 非常有用。我猜 Cloud Endpoints 会计算它想要返回的响应的一些哈希值。如果此响应与 Cloud Endpoints 客户端提供的 etag 字段匹配,则不会返回任何数据,而是发送 HTTP 304 Not Modified 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2011-06-20
    • 2015-02-25
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多