Google App Engine使用JSON发送过多数据

时间:2014-11-29 11:37:41

标签: android json google-app-engine

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

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

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

我从未在我的实体中设置“kind”属性,它来自何处? 除了在每个json响应结束时,我可以找到这两行:

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

我不知道那些“善良”和“etag”来自哪里。

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

1 个答案:

答案 0 :(得分:5)

Cloud Endpoints会自动添加这两个属性。我不知道如何删除它,谷歌似乎没有记录为什么添加它们,但有些很容易猜到。

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响应。