# 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 Methodhttp请求的方法,常用的方法有GET/POST/PUT/DELETE等。
请求headers(Request Headers)http请求中的头信息。
headerhttp请求中的头信息中的一个键值对,如Accept:text/plain
pathhttp请求路径,指域名/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= ```