短链接生成器,数据推广追踪分析
服务定价
普通客户
免费
|
VIP客户
¥2000 /年
|
定制客户
请联系我们
|
|
有效期 | 30分钟 |
不限制
服务有效,链接有效
|
不限制
服务有效,链接有效
|
接口调用 | 不支持 | 支持 并发上限:50条/秒 |
支持 |
创建短链上限 | 默认100万条(超出联系客服增加) 并发上限:5条/秒 |
默认100万条(超出联系客服增加) 并发上限:50条/秒 |
无上限 |
点击上限 | 无上限 并发上限:1000条/秒 |
无上限 并发上限:1000条/秒 |
无上限 |
统计访问次数 | 支持 | 支持 | 支持 |
接口文档
签名方式
MD5(key + timestamp + secret) 然后转小写
创建接口
请求 URL:https://dzjh.cc/v1/short-link/create
请求 method:POST
Content-Type: application/json;charset=UTF-8
请求编码:UTF-8
请求头
KEY | 类型 | 说明 |
key | String | 必填:分配的客户端ID |
timestamp | String | 必填:时间戳:13 位到毫秒,例如:1650982443340 |
sign | String | 必填:签名 |
请求参数
参数 | 类型 | 说明 |
url | String | 必填:目标 URL |
desc | String | 必填:目标URL说明 |
test | boolean | 非必填:是否测试链接,true 表示测试链接,测试链接只有 30 分钟有效期 |
示例代码(java)
public ResDatacreate(String url, String desc){ JSONObject param = new JSONObject(); param.put("url",url); param.put("desc",desc); return this.post("/v1/short-link/create",param,ShortLinkCreateDto.class); } private ResData post(String url,JSONObject param){ long timestamp = System.currentTimeMillis(); Map headers = new HashMap<>(); headers.put("key",config.getKey()); headers.put("timestamp",String.valueOf(timestamp)); headers.put("sign", MD5Utils.md5(config.getKey()+timestamp+config.getSecret())); headers.put("Content-Type","application/json;charset=UTF-8"); String finalUrl = config.getDomain() + url; String ret = this.post(finalUrl,param == null ? "" : param.toJSONString(),"UTF-8",headers); log.info("短链接 post url={},req={},ret={}",finalUrl,param,ret); if(StringUtils.isBlank(ret)){ return ResData.error("接口返回空白"); } JSONObject retJson = Utils.toJson(ret); if(retJson == null){ return ResData.error("接口返回错误"); } if(!"0".equals(retJson.getString("code"))){ return ResData.error(retJson.getString("msg")); } return ResData.success(retJson); } public String post(String url,String body,String charset,Map headers){ HttpPost post = new HttpPost(url); CloseableHttpResponse response = null; try { if(headers != null && headers.size() > 0){ for(Map.Entry item : headers.entrySet()){ post.setHeader(new BasicHeader(item.getKey(),item.getValue())); } } post.setEntity(new StringEntity(body,charset)); response = httpClient.execute(post); String result = EntityUtils.toString(response.getEntity(),charset); if(StringUtils.isBlank(result)){ log.error("http 返回消息未空,url={},body={},charset={}",url,body,charset); return ""; } return result; }catch (Exception e){ log.error("http 请求错误,url={},body={},charset={}",url,body,charset,e); }finally { try { if(response != null) { response.close(); } }catch (Exception ignored){} } return ""; } public class MD5Utils { private final static char [] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static String md5(String txt){ try { return md5(txt.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } return ""; } public static String md5(byte [] source){ //用来将字节转换成 16 进制表示的字符 String result; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(source); byte[] tmp = md.digest(); //用16进制数表示需要32位 char[] str = new char[32]; for(int i=0,j=0; i < 16; i++){ //j表示转换结果中对应的字符位置 //从第一个字节开始,对 MD5 的每一个字节 //转换成 16 进制字符 byte b = tmp[i]; //取字节中高 4 位的数字转换 //无符号右移运算符>>> ,它总是在左边补0 //0x代表它后面的是十六进制的数字. f转换成十进制就是15 str[j++] = hexDigits[b>>>4 & 0xf]; // 取字节中低 4 位的数字转换 str[j++] = hexDigits[b&0xf]; } result = new String(str);//结果转换成字符串用于返回 } catch (Exception e) { result = ""; } return result; } }