# wendang
**Repository Path**: 524748907/wendang
## Basic Information
- **Project Name**: wendang
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-18
- **Last Updated**: 2026-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 接口规则
|
传输方式 | 为保证交易安全性,采用HTTPS传输
|
| ---------------------------------------- | ---------------------------------------- |
| URL格式 | HTTP URL格式的一般形式为:https://${hostname}:${port}/artemis${uri},
hostname:平台的IP地址或域名。
port:平台的web访问端口。
uri:API的uri,详见API的接口定义。
举例:https://ip:port/artemis/api/xxxxx |
| 提交方式 | 采用POST方法提交 |
| 数据格式 | 提交和返回数据都为JSON格式 |
| 字符编码 | 统一采用UTF-8字符编码 |
| 安全认证 | 提供了基于AK/SK的安全认证方案。只有认证通过,才能正常访问每一个API。 |
| 权限控制 | 每一个API都需要被授权。调用未被授权的API会提示错误。 |
| 证书要求 | 暂不需要 |
| 调用成功
判断逻辑 | 详见本章节【返回值规则】 |
返回值规则
------------
对于API接口调用返回的结果统一采用json格式,内容字段采用驼峰式方法命名,返回的接口内容格式如下:
```
{
"code":"业务错误码",
"msg":"返回的错误信息,方便对接和调试,不能有堆栈信息",
"data":{数据}
}
```
code:业务错误码。调用成功时,返回code为“0”,当调用失败时,code为十六进制字符串错误码。查看每个API的错误码定义来判断错误类型。
msg:返回的错误信息,方便对接和调试,不能有堆栈信息
data:数据内容
返回的数据格式一般有如下几种:
a) 只返回单条数据。示例1
```
{
"code":"0",
"msg":"返回的错误信息,方便对接和调试,不能有堆栈信息",
"data":{
"userId": xxxxxx,
"name": "xxxxxx",
…
}
}
```
b) 返回多条数据。示例2
```
{
"code":"0",
"msg":"返回的错误信息,方便对接和调试,不能有堆栈信息",
"data":{
"total":5, //总条数
"pageSize":20, //当前分页记录数
"pageNo": 1, //当前页
"list": [{ //分页内容
"userId": xxxxxx,
"name": "xxxxxx",
…
},{
"userId": xxxxxx,
"name": "xxxxxx",
…
}]
}
}
```
c) 没有分页信息的列表查询格式。示例3:
```
{
"code":"0",
"msg":"返回的错误信息,方便对接和调试,不能有堆栈信息",
"data":{
"total":5,
"list": [{
"userId": xxxxxx,
"name": "xxxxxx",
…
},{
"userId": xxxxxx,
"name": "xxxxxx",
…
}]
}
}
```
d) 若为图片数据,则直接返回二进制数据流。
e) 若状态码不为0,表示异常,则返回错误信息。示例4:
```
{
"code ":"0x0190020f", //业务错误码
"msg":"返回的错误信息,方便对接和调试,不能有堆栈信息",
"data":"" //预留字段,可以为空
}
```
## 调用认证
------------
### 安全认证签名介绍
本平台的接口调用安全认证方案,使用普遍被各大开放平台使用的ak/sk安全认证方案。调用 API 时,如果API需要安全认证,首先需要获取API的授权,得到AppKey和AppSecret;其次,拼接签名字符串,将计算后的签名放在请求的 Header 传入,网关会通过对称计算签名来验证请求者的身份。
安全认证签名的原理和实现方式有一定的技术复杂度,为此,我们提供了SDK,封装了调用开放平台的API的方法,屏蔽了接口的安全认证限制带来的调用复杂性。调用者可下载直接使用,详见[开放网站](https://open.hikvision.com/download)->下载->Infovision Pvia。
#### 一、名词解释
| Http Method | http请求的方法,常用的方法有GET/POST/PUT/DELETE等。 |
| 请求headers(Request Headers) | http请求中的头信息。 |
| header | http请求中的头信息中的一个键值对,如Accept:text/plain |
| path | http请求路径,指域名/IP(端口号)之后的部分,如请求地址为"www.example.com/artemis/api",则path指"/artemis/api"。 |
| query | 指请求地址中的参数,如请求地址为"www.example.com/artemis/api?a=b&c=d",query为a:b,c:d。 |
| bodyForm | 指POST请求中body中以键值对存在的参数。 |
| AppKey/AppSecret | 一对AppKey/AppSecret用于标识一个调用方,AppSecret作为密钥参与签名计算。 |
| 签名字符串 | 指待签名计算的字符串 |
| 签名 | 指签名计算的结果,为字符串 |
#### 二、签名流程
签名字符串由Http Method、headers、Url(指path+query+bodyForm)组成。以AppSecret为密钥,使用HmacSHA256算法对签名字符串生成消息摘要,对消息摘要使用BASE64算法生成签名(签名过程中的编码方式全为UTF-8)。
##### 签名字符串组成及顺序
```
HTTP METHOD + "\n" +
Accept + "\n" + //建议显示设置 Accept Header,部分 Http 客户端当 Accept 为空时会给 Accept
设置默认值:*/*,导致签名校验失败。
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
Headers +
Url
```
HTTPMethod为全大写,如 "POST"。如果请求headers中不存在Accept、Content-MD5、Content-Type、Date 则不需要添加换行符”\n”。
##### 签名字符串示例
```
POST \n
*/* \n
dGhpcyBpcyBhIGV4YW1wbGU= \n
text/plain;charset=UTF-8 \n
Thu, 24 Nov 2016 03:12:25 GMT \n
a-header:value \n
b-header:value \n
x-ca-key:1231243298 \n
x-ca-timestamp:1479956865000 \n
/artemis/api/example?a-bodyform=value&a-query=value&b-query=value
```
------
**Http Method**
放入签名字符串中的Http Method为大写字母,如“GET”、"POST"、“DELETE”等。
**Accept、Content-MD5、Content-Type、Date**
Content-MD5是指Body的MD5值,只有当Body非Form表单时才计算MD5。计算方式:使用MD5计算body的信息摘要,对信息摘要使用BASE64算法生成Content-MD5字符串,示例:
```
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
```
当请求的body非form表单时,建议调用方对body计算MD5参与签名,将Content-MD5放入请求headers中,value可以为任意值,服务端不会取Content-MD5的value进行校验,而是根据body中的数据计算MD5进行校验。
这四个header比较特殊,如果这四个header在请求的headers中,则需要按照签名字符串示例的顺序将这四个header的value放入签名字符串中,并在value之后添加换行符"\n",如果请求headers中不存在,则不需要添加换行符"\n"。如果headers中存在且value为空白字符串,则只需要在签名字符串中对应位置添加换行符"\n"。
**示例,请求headers部分参数如下(Accept的value为空字符串、headers中没有Content-Type):**
```
Content-MD5:anything
Date:Thu, 24 Nov 2016 03:12:25 GMT
```
**示例,签名字符串部分如下:**
```
POST \n
\n
dGhpcyBpcyBhIGV4YW1wbGU= \n
Thu, 24 Nov 2016 03:12:25 GMT \n
```
##### 系统级header
```
* 【必选】X-Ca-Key:appKey。
* 【必选】X-Ca-Signature:签名。
* 【必选】X-Ca-Signature-Headers:参与headers签名计算的header的key转换为小写字母,按照字典排序后多个key之间使用英文逗号分割,组成字符串。
* 【可选】X-Ca-Timestamp:API 调用者传递时间戳,值为当前时间的毫秒数,即从1970年1月1日起至今的时间转换为毫秒。
* 【可选】X-Ca-Nonce:API 调用者生成的 UUID,结合时间戳防重放。
```
**Headers**
Headers 是指参与 Headers 签名计算的 Header 的 Key、Value 拼接的字符串,建议对 X-Ca 开头以及自定义 Header 计算签名。注意如下参数不参与Headers签名计算:
```
X-Ca-Signature
X-Ca-Signature-Headers
Accept
Content-MD5
Content-Type
Date
Content-Length
Server
Connection
Host
Transfer-Encoding
X-Application-Context
Content-Encoding
```
**Headers 组织方法**
先将参与 Headers 签名计算的 Header 的 Key 转换为小写字母,然后按照字典排序后使用如下方式拼接。如果某个 Header 的 value 为空,则使用HeaderKey+“:”+“\n”参与签名,需要保留 Key 和英文冒号。需要去除value字符串头尾的空字符串,如 key="a-key",value=" abc ",则参与签名时的字符串为"a-key:abc"。注意,参与headers签名计算的header的key在签名字符串中必须转换为小写字母。
```
String headers =
key1 + ":" + HeaderValue1 + "\n"\+
key2 + ":" + HeaderValue2 + "\n"\+
...
keyN + ":" + HeaderValueN + "\n"
```
将参与 Headers 签名中 Header 的 Key 转换为小写字母,按照字典排序后多个 key 之间使用英文逗号分割,组合成字符串,放到 Request 的 Header 中,Key 为:X-Ca-Signature-Headers。
##### URL格式
Url 指 Path + Query + BodyForm 中 Form 参数,组织方法:对 Query+BodyForm 参数按照字典对 Key 进行排序后按照如下方法拼接,如果 Query 或 BodyForm 参数为空,则 Url = Path,不需要添加”?”,如果某个参数的 Value 为空只保留 Key 参与签名,等号不需要再加入签名。
```
String url =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
```
注意这里 Query 或 BodyForm 参数的 Value 可能有多个,多个的时候只取第一个 Value 参与签名计算。
##### 计算签名
以AppSecret为密钥,使用HmacSHA256算法对签名字符串生成消息摘要,对消息摘要使用BASE64算法生成签名(签名过程中的编码方式全为UTF-8)。
**java示例:**
```
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8"); //secret 为 APP 的密钥。
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));
```
##### 传递签名
将计算的签名结果放到 Request 的 Header 中,Key为:X-Ca-Signature。
#### 三、完整示例
```
请求地址:http://www.example.com/artemis/api/example?qa=a&qb=B
Http Method:POST
```
**Headers:**
```
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:0
Content-Type:text/plain;charset=UTF-8
Cookie:JSESSIONID=D9C4A515CACAC31211D1612039D062B7
header-A:A
header-B:b
X-Ca-Key:29666671
X-Ca-Signature:XeBEg2Ifh+FOfeProHLMYz8luWkJ00Exx7N7tJuats8=
X-Ca-Signature-Headers:header-a,header-b,x-ca-key,x-ca-timestamp
X-Ca-Timestamp:1479968678000
X-Requested-With:XMLHttpRequest
```
**Query:**
```
qa:a
qb:B
```
**BodyForm:**
```
a-body:a
x-body:x
```
**签名字符串:**
```
POST\n
*/*\n
text/plain;charset=UTF-8\n
header-a:A\n
header-b:b\n
x-ca-key:29666671\n
x-ca-timestamp:1479968678000\n
/artemis/api/example?a-body=a&qa=a&qb=B&x-body=x
```
**签名(非真实计算):**
```
XeBEg2Ifh+FOfeProHLMYz8luWkJ00Exx7N7tJuats8=
```