RESTful 风格 API。Apache Http Client )来访问 SmartHub 的 API,或者使用Postman )来访问 SmartHub 的 API。https://xxx.smh.smarthing.com/v1/usershttps://api.smh.smarthing.comhttps://trial.api.smh.smarthing.com。JSON 格式。ISO 8601 格式返回: yyyy-MM-dd'T'HH:mm:ssZ401 Unauthorized:{
"type": "about:blank",
"title": "Invalid api key",
"status": 401
}403 Forbidden:{
"type": "about:blank",
"title": "Access forbidden",
"status": 403
}JSON 格式将返回 400 Bad Request 响应{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Body should be a JSON object"
}JSON 值类型将返回 400 Bad Request 响应{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Body should be a JSON object"
}422 Unprocessable Entity 响应{
"type": "about:blank",
"title": "Validation Failed",
"status": 422,
"errors": [
{
"resource": "customFieldVO",
"field": "custom1",
"code": "invalid"
}
]
}| 错误代码 | 描述 |
|---|---|
| missing | 资源不存在 |
| missing_field | 资源的必填字段未设置 |
| invalid | 字段格式无效,详情请见该资源的具体文档描述 |
| already_exists | 该资源已存在 |
message 字段描述错误,并且部分错误还提供一个 documentation_urlLocationURI。| 状态码 | 描述 |
|---|---|
301 | 永久重定向。原始的 URI 已经迁移到 Location 指定的新的 URI中,此资源以及将来对此资源的所有请求都应定向到新 URI。 |
302,307 | 临时重定向。请求应该使用 Location 中指定的 URI 并且将来可以继续使用。 |
| 动词 | 描述 |
|---|---|
HEAD | 获取资源的头信息,不包含资源内容 |
GET | 获取资源 |
POST | 创建资源 |
PUT | 替换资源或集合。对于 body 为空的请求,请确保头字段 Content-Length 值为 0。 |
DELETE | 删除资源 |
*_url 属性链接到其他资源。这些用于提供显式 URL ,以便 API 客户端不需要自己构建 URL,?page 参数指定更过的页。对于一些资源, 客户端也可以通过 ?size 参数指定每页的大小,最大设置为 100。页码参数 ?size从 1 开始计算,不传默认返回第 1 页。
强烈建议使用 Link Header提供的URL进行资源访问。
# 只有一页结果
Link: <https://xxx.smh.smarthing.com/points?page=0&size=20>;
rel="last",<https://xxx.smh.smarthing.com/points?page=0&size=20>;
rel="first"
X-Total-Count: 10
# 有多页结果
Link: <https://xxx.smh.smarthing.com/points?page=2&size=20>;
rel="next",<https://xxx.smh.smarthing.com/points?page=0&size=20>;
rel="prev",<https://xxx.smh.smarthing.com/points?page=5&size=20>;
rel="last",<https://xxx.smh.smarthing.com/points?page=0&size=20>;
rel="first"
X-Total-Count: 110rel 值定义如下:| 名称 | 描述 |
|---|---|
next | 下一页 |
last | 最后一页 |
first | 首页 |
prev | 前一页 |
| 头字段名称 | 描述 |
|---|---|
X-RateLimit-Limit | 每小时允许的最大请求数 |
X-RateLimit-Remaining | 当前速率限制窗口中剩余的请求数量 |
X-RateLimit-Reset | 当前速率限制窗口重置的时间(UTC秒) |
X-RateLimit-Limit: 1
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 3600
{
"type":"about:blank",
"title":"API rate limit exceeded",
"status":429
}http://example.com 网站访问 SmartHub API 的样例:UTC 时区做为创建时间或操作时间。https://xxx.smh.smarthing.com/v1/mo-sms。 推送的请求格式见 API 文档中的 Push 分类。每一种推送分类都需要配置特定的 URL。request body 中带上签名字段 signature,生 成规则如下:| 字段名称 | 类型 | 生成规则 |
|---|---|---|
| signature | String | HEX(SHA256(pushKey + datePush)) |
pushKey由账户在 SmartHub 平台上配置datePush 是请求体里的字段,这里转换为精确到秒的数字SHA256 表示使用 SHA256 进行 hash ,注意这里 hash 后的结果为字节数组HEX 表示对8bit字节数组逐个字节进行十六进制编码拼接public class Signature {
public static byte[] SHA256(byte[] data) throws java.security.NoSuchAlgorithmException {
return java.security.MessageDigest.getInstance("SHA-256").digest(data);
}
public static String HEX(byte[] octets) {
StringBuilder sb = new StringBuilder();
for(byte b: octets) {
if (b >= 0 && b < 16) sb.append("0");
sb.append(Integer.toHexString(b & 0xFF));
}
return sb.toString();
}
public static String makeSignature(String pushKey, long epocSeconds) throws Exception {
return HEX(SHA256((pushKey + epocSeconds).getBytes("UTF8")));
}
public static void main(String[] args) throws Exception {
System.out.println(makeSignature("UzE4MDkxNDA2MTE1M", 1725499848L));
// Output: 58210277eeea982589a3f2c5711ce5ac23a866298d77fcb5c30bb1e0aa9c345f
}
}{"giccid":"8944501503181377993","data_usage":1302,"start_time":1713888842473,"duration":0,"mcc":"460","mnc":"10","country_code":"CN","apn":"apn1","imsi":"460001234567890","sim_group":"groupA"}{"giccid":"8944500310194312699","event_time":1711889742473,"from_msisdn":"882360010341361","to_msisdn":"449086237252","imsi":"460001234567890","sim_group":"groupA"}