报文结构
报文包括终端客户端发送到ZOLOZ服务器的请求报文,以及ZOLOZ服务器发送到终端客户端的响应报文。本文介绍请求报文和响应报文的结构。
请求报文的结构
ZOLOZ采用的是标准的HTTP request请求格式,请求由以下几部分组成:
- Request-URI:应用请求的资源。
- Request Method:请求方法。
- Request Header:请求头。
- Request Body:请求正文。
HTTP请求结构如下图所示:
Request-URI
Request-URI指应用请求的资源,字段值格式为/api/{version}/{restfulPath}
。
version
:接口版本,例如v1。restfulPath
:接口路径。
Request Method
Request Method指请求方法,请求方法仅支持POST
。
Request Header
Request Header指请求头,包含了请求和客户端的附加信息,ZOLOZ网关协议包括以下header字段。
header字段 | 是否必须 | 描述 |
Request-Time | 必须 | 请求时间。该字段值为字符串,例如
|
Content-Type | 必须 | 发送给ZOLOZ服务器的请求正文的格式类型。ZOLOZ网关协议仅支持以下两种内容格式:
有关Content-Type字段的更多信息,请参见RFC 7231。 |
Client-Id | 必须 | 分配给终端客户端的客户端标识符,该字段值为16位字符串。此ID在创建账号时由ZOLOZ服务器生成,且每个终端客户端的ID具有唯一性。 |
Signature | 必须 | 报文签名相关信息。该字段值为列表,由以下两个键值对组成,用英文逗号隔开。
有关签名请求和验证签名的更多信息,请参见报文签名和签名验证。 |
Encrypt | 可选 | 报文加密信息。该字段值为列表,由以下两个键值对组成,用英文逗号隔开。
有关加密和解密请求的更多信息,请参见报文加密和报文解密。 |
以下是一个有效的signature header字段示例:
signature: algorithm=RSA256, signature=IpmAgtDqkjOz5sEEVlEq8OkdShXMJyXaK+6gtX/idB3+Hlhqnzdf90redIiJkawUlrY+icf1NhzSISiULGIAih72y/QRg/LlyWIWRE+GHx+k7Wl1wEYazvXRDQWF2TIia7SyyIhtjqIXj4BZ+409X72SOnx21qOU5eKxkgJQ8ZEVg5BFzXe0E//ISxJURBkVC1Q8v+7mnuT+YzgKvD1aMo16sYZih9ueTlj4xDPC8nKEoT+WJGjbdV7Ww/PXP419bGii9e7agLdxudGjD2B9d/IeUj8/w75u6V7PtdS8jCpyZQ0a28PcpvMD7yQ5f0odh7/6xGL6jECx3Y2YiuYCkw==
以下是一个有效的encrypt header字段示例:
encrypt: algorithm=RSA_AES, symmetricKey=FxE+siNhE2eQsnbui/6llu6TG9CaXFmT8gb2Z5bsvf2WGlAnoXoBrcB1bYodBnRs/CzSeEewFc4HOIqHejTepHehy86M9DUdefjYC783+LGBstQTPlLGsqcsYxPJTMCGYfTD6DSSXwqtKSiqD6q6C96zkp3/Q2ScmCAJprqtcA5SUj+cRmIdtG1OStSdHrQ+SstT74pwMbv1qlHbTeitZMTt5GNFXnhT1B3htS1sFb0BQ2OA+V2BtPW/izEP5ebrkfNQWmQKd6gc/i0j/DGBw4DQaxNfNvy2JHAljL5mP/ES9X0DJS6/MkimfDwXsSsTANWsjFfIoTodRn223HQC0w==
Request Body
Request Body指请求正文,用于携带请求报文内容,包含API的输入参数。未加密请求和加密请求的内容格式不同。具体如下:
- 未加密请求的报文内容为JSON格式的字符串,Content-Type header字段必须设置为
application/json
。 - 加密请求的报文内容是采用Base64编码加密数据的字符串,Content-Type header字段必须设置为
text/plain
。
有关内容结构的更多信息,请参见各API接口文档。
完整的HTTP request示例
- 未加密请求示例
POST /api/v1/zoloz/authentication/test HTTP/1.1
Content-Type: application/json; charset=UTF-8
Client-Id: 2089012345678900
Request-Time: 2020-01-01T12:00:00+0800
Signature: algorithm=RSA256, signature=KEhXthj4bJ801Hqw8kaLvEKc0Rii8KsNUazw7kZgjxyGSPuOZ48058UVJUkkR21iD9JkHBGRrWiHPae8ZRPuBagh2H3qu7fxY5GxVDWayJUhUYkr9m
{
"title": "hello",
"description": "just for demonstration."
}
- 加密的请求示例
POST /api/v1/zoloz/authentication/test HTTP/1.1
Content-Type: text/plain; charset=UTF-8
Client-Id: 2089012345678900
Request-Time: 2020-01-01T12:00:00+0800
Signature: algorithm=RSA256, signature=KEhXthj4bJ801Hqw8kaLvEKc0Rii8KsNUazw7kZgjxyGSPuOZ48058UVJUkkR21iD9JkHBGRrWiHPae8ZRPuBagh2H3qu7fxY5GxVDWayJUhUYkr9m
Encrypt: algorithm=RSA_AES, symmetricKey=FxE+siNhE2eQsnbui/6llu6TG9CaXFmT8gb2Z5bsvf2WGlAnoXoBrcB1bYodBnRs/CzSeEewFc4HOIqHejTepHehy86M9DUdefjYC783+LGBstQTPlLGsqcsYxPJTMCGYfTD6DSSXwqtKSiqD6q6C96zkp3/Q2ScmCAJprqtcA5SUj+cRmIdtG1OStSdHrQ+SstT74pwMbv1qlHbTeitZMTt5GNFXnhT1B3htS1sFb0BQ2OA+V2BtPW/izEP5ebrkfNQWmQKd6gc/i0j/DGBw4DQaxNfNvy2JHAljL5mP/ES9X0DJS6/MkimfDwXsSsTANWsjFfIoTodRn223HQC0w==
r8w8wbc8Nv6sC2meJzArtGjDkbiAzg55UaDiq7TId1a7uzcv18qpOxVkXvqa3q/6TPemDDItZ79oHMzDJyvAngYqfpZZaedArWPCDeddqUl62zU5VwaB1NVhNmjHLNQ6bA1LxpsnMGnb6n8iWAEU4MtJ3TpXerMY6RToSBbI/IBA4MJFbXds0z6XLqQh9XNrLL/J0FUSV0XGFiBRxVMvUP2ytzEKh9HE6fqX/ZqTqadtp89PRTJZM87Rkb3oPdJAlaM7JUaIznGrtKe45UwjtrdYk86QhOmpWXj4L2g0Gww=
响应报文的结构
ZOLOZ采用的是标准的HTTP response响应格式,响应由以下几部分组成:
- HTTP status:请求的处理状态。
- Response Header:响应头。
- Response Body:响应正文。
HTTP响应结构如下图所示:
HTTP status
HTTP status指请求的处理状态,ZOLOZ网关协议使用的是标准的HTTP response代码。更多信息,请参见RFC 7231。
Response Header
Response Header指响应头,包括以下header字段。
header字段 | 描述 |
Trace-Id | 为每个API调用生成的唯一ID。 |
Response-Time | 响应时间。该字段值为字符串,例如
|
Content-Type | 返回给商户的响应正文的格式类型。仅支持以下两种内容格式:
有关Content-Type字段更多信息,请参见RFC7231。 |
Signature | 报文签名相关信息。该字段值为列表,由以下两个键值对组成,用英文逗号隔开。
有关签名响应和验证签名的更多信息,请参见报文签名和签名验证。 |
Encrypt | 报文加密信息。该字段值为列表,由以下两个键值对组成,用英文逗号隔开。
有关加密和解密响应的更多信息,请参见报文加密和报文解密。 |
以下是一个有效的signature header字段示例:
signature: algorithm=RSA256, signature=QexLgtKpdjOz5sEEVlEq8OkdShXMJyXaK+6gtX/idB3+Hlhqnzdf90redIiJkawUlrY+icf1NhzSISiULGIAih72y/QRg/LlyWIWRE+GHx+k7Wl1wEYazvXRDQWF2TIia7SyyIhtjqIXj4BZ+409X72SOnx21qOU5eKxkgJQ8ZEVg5BFzXe0E//ISxJURBkVC1Q8v+7mnuT+YzgKvD1aMo16sYZih9ueTlj4xDPC8nKEoT+WJGjbdV7Ww/PXP419bGii9e7agLdxudGjD2B9d/IeUj8/w75u6V7PtdS8jCpyZQ0a28PcpvMD7yQ5f0odh7/6xGL6jECx3Y2YiuYCky++
以下是一个有效的encrypt header字段示例:
encrypt: algorithm=RSA_AES, symmetricKey=HnI+keXgI9eQsnbui/6llu6TG9CaXFmT8gb2Z5bsvf2WGlAnoXoBrcB1bYodBnRs/CzSeEewFc4HOIqHejTepHehy86M9DUdefjYC783+LGBstQTPlLGsqcsYxPJTMCGYfTD6DSSXwqtKSiqD6q6C96zkp3/Q2ScmCAJprqtcA5SUj+cRmIdtG1OStSdHrQ+SstT74pwMbv1qlHbTeitZMTt5GNFXnhT1B3htS1sFb0BQ2OA+V2BtPW/izEP5ebrkfNQWmQKd6gc/i0j/DGBw4DQaxNfNvy2JHAljL5mP/ES9X0DJS6/MkimfDwXsSsTANWsjFfIoTodRn223HQC00++
Response Body
Response Body指响应正文,用于携带响应报文内容,包含API的输出参数。未加密响应和加密响应的内容格式不同。具体如下:
- 未加密响应的报文内容为JSON格式的字符串,Content-Type header字段必须设置为
application/json
。 - 加密响应的报文内容是采用Base64编码加密数据的字符串,Content-Type header字段必须设置为
text/plain
。
有关内容结构的更多信息,请参见各API接口文档。
完整的HTTP response示例
- 未加密响应示例
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Response-Time: 2019-11-19T21:56:15+0800
Signature: algorithm=RSA256, signature=SGnqy/sC1sbrfK+jAl0ATJwtqUg4jUhkqpPheEYPgnM+20P69NsdrL8BB/ml5ehfFVzsst1bzwEYpDNZvqqNSBo2BPVg78pjJEk0GGNIu7NQ/pyRncYy3pIIXvr91lIvINysHcw8AgUEXRLtjMf1ktQN2OsA3+OFKB6Cf7BrKNnxjeF1lSjzbTk2ua+z1unGHUOeA9GBloSL3rL8ngC/Zqn24/eHWyKJrMFnq1jv+IhOVCqeY4knVFcPgp/bFBs4gyTdE1G1fCK5xmzk9Co8dK0wr6KcC872evBGz7SCMYZCn6Y8O5uRqS9I6F26yKKdqw8PZv2rlwJFsX21l7wRSQ==
{
"title": "hello",
"description": "just for demonstration."
"result": {
"resultCode":"SUCCESS",
"resultStatus":"S",
"resultMessage":"success"
}
}
- 加密的响应示例
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Response-Time: 2019-02-23T01:45:57+0000
Signature: algorithm=RSA256, signature=imNNW52LHemfAiUFqek4QQg3ZkdHBGEUOs2SBx0OxPGBIBC0bmpu0%2BviBH%2Bh9w86VTooveJmKQSBVIf0i7hQWXqyd5Qibz49d4k9AhIhTjBKQF1VZTlJUrlphWvisSa9zn5wl3P74v9Z4CDVvHfL3wZzfwg8ujo13nSYjYdsswhSZwkGUgkSCDjq2ObtsPMHG6ZRuzrTjW6tCrqTe6EY4HyHg1mWnsAj12i1b%2FnKNayP%2FCpAe%2BT0%2Fn66NeLGjR9hjTYJ8XKKNoZ5vW%2BVYjWiDt8XWSb3KEO2Zh5Cofswe85sVPnk2S%2BvbN0nlPNU0zlJJJK6ifoSyl%2FSKI6Siu05xw%3D%3D
Encrypt: algorithm=RSA_AES, symmetricKey=eXhw3n3fdpfruNv2kh9cJQ4NzqhNhjKjCynAu6Kn92p0WPY77d8DHJV5Y4QE9fShsW%2FYZIVhCtiZSC2bBS%2F1m9HnCwhKiWzKWTwo44J692DU%2B24Yty%2FHTalqD7QWoOOd0HCskrKFHgf4INE9PMskGnZbp4B7yuLmaUEtuo8FIFNB4e%2FCIL1DhBMdsgcYL%2FiWLylNbpXztE8kMVjoEeOsz%2FbBr3Z22A4%2BQveAIDEc5sr9cjkzCB2gJsjNt4bZUWiZfP8BPLV0QEEh9mhmqzprNao2x9DsuShFcjyc3db%2BZcbMOuI8NxI0V%2FwTDi23%2BloH6Q1Mg0QgWFORlJG9da8s7Q%3D%3D
0JR682PMFgoc2ttribGxpl3f/7rNvjwpmoaAvahki1RxWUSO6mKxyQf87OUgQxQULGabLL4Q5vjFx8XvW/ugvpFexfqLojDeMgNMTyJpkT8=