1.3. 数据格式和 REST API
Data Grid 缓存以可通过 MediaType 定义的格式存储数据。
有关使用 Data Grid 的 MediaTypes 和编码数据的更多信息,请参阅 Cache Encoding 和 Marshalling。
以下示例为条目配置存储格式:
如果没有配置 MediaType,Data Grid 默认为 application/octet-stream 用于键和值。但是,如果缓存被索引,则数据网格默认为 application/x-protostream。
1.3.1. 支持的格式 复制链接链接已复制到粘贴板!
您可以以不同格式写入和读取数据,Data Grid 可以根据需要在这些格式之间进行转换。
以下"标准"格式是可交换的:
-
application/x-java-object -
application/octet-stream -
application/x-www-form-urlencoded -
text/plain
您还可以将前面的数据格式转换为以下格式:
-
application/xml -
application/json -
application/x-jboss-marshalling -
application/x-protostream -
application/x-java-serialized
通过数据网格,您可以在 application/x-protostream 和 application/json 之间转换。
对 REST API 的所有调用都可以提供标头,描述在读取时写入的内容或所需格式。Data Grid 支持为值应用的标准 HTTP/1.1 标头 "Content-Type" 和 "Accept",以及 "Key-Content-Type",对键类似。
1.3.2. 接受标头 复制链接链接已复制到粘贴板!
Data Grid REST 端点与 RFC-2616 Accept 标头兼容,并根据支持的转换协商正确的 MediaType。
例如,在读取数据时发送以下标头:
Accept: text/plain;q=0.7, application/json;q=0.8, */*;q=0.6
Accept: text/plain;q=0.7, application/json;q=0.8, */*;q=0.6
前面的标头会导致 Data Grid 首先返回 JSON 格式的内容(高优先级 0.8)。如果无法将存储格式转换为 JSON,Data Grid 将尝试下一个 text/plain 格式(具有最高优先级 0.7)。最后,Data Grid 会返回 * attention,它根据缓存配置选择合适的格式。
1.3.3. 带有特殊 Characters 的名称 复制链接链接已复制到粘贴板!
创建任何 REST 资源需要一个属于 URL 的名称,如果此名称包含 RFC 3986 spec 第 2.2 节 中定义的任何特殊字符,则需要使用 Percent 编码机制对其进行编码。
1.3.4. key-Content-Type Headers 复制链接链接已复制到粘贴板!
大多数 REST API 调用在 URL 中包含密钥。Data Grid 假设 Key 在处理这些调用时是 java.lang.String,但您可以对采用不同格式的密钥使用特定的标头 Key-Content-Type。
key-Content-Type 标头示例
- 将 byte[] Key 指定为 Base64 字符串:
API 调用:
`PUT /my-cache/AQIDBDM=`
`PUT /my-cache/AQIDBDM=`
headers:
key-Content-Type: application/octet-stream
- 以十六进制字符串形式指定 byte[] 密钥:
API 调用:
GET /my-cache/0x01CA03042F
headers:
Key-Content-Type: application/octet-stream; encoding=hex
Key-Content-Type: application/octet-stream; encoding=hex
- 指定双键:
API 调用:
POST /my-cache/3.141456
headers:
Key-Content-Type: application/x-java-object;type=java.lang.Double
Key-Content-Type: application/x-java-object;type=java.lang.Double
application/x-java-object 的 type 参数仅限于:
- 原语打包程序类型
- java.lang.String
-
字节,使
application/x-java-object;type=Bytes等同于application/octet-stream;encoding=hex。
1.3.5. JSON/Protostream Conversion 复制链接链接已复制到粘贴板!
当缓存被索引或专门配置为存储 _application/x-protostream' 时,您可以发送和接收自动转换为 Protobuf 的 JSON 文档。
您必须注册 Protobuf 模式才能使转换正常工作。
要通过 REST 注册 protobuf 模式,请在 ___protobuf_metadata 缓存中调用 POST 或 PUT,如下例所示:
curl -u user:password -X POST --data-binary @./schema.proto http://127.0.0.1:11222/rest/v2/caches/___protobuf_metadata/schema.proto
curl -u user:password -X POST --data-binary @./schema.proto http://127.0.0.1:11222/rest/v2/caches/___protobuf_metadata/schema.proto
编写 JSON 文档时,文档中有一个特殊字段 _type,以标识与文档对应的 Protobuf 消息。
Person.proto
message Person {
required string name = 1;
required int32 age = 2;
}
message Person {
required string name = 1;
required int32 age = 2;
}
Person.json
{
"_type": "Person",
"name": "user1",
"age": 32
}
{
"_type": "Person",
"name": "user1",
"age": 32
}