我使用数据存储区使用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响应中吗?
答案 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
响应。