長鏈接轉短鏈接

一、使用場景

二維碼近幾年超流行,有時項目中會使用到二維碼,比如掃碼登錄後臺。需要將字符串生成二維碼,如果字符串太長,生成的二維碼將會很難識別。此時就需要使用長鏈接轉短鏈接。本文介紹使用微信長鏈接轉短鏈接接口與新浪微博長鏈接轉短鏈接接口。

二、代碼實現

因為長鏈接轉短鏈接屬於通用功能,所以外部項目會調用此功能,故以下代碼是支持跨域調用的。

這裡使用了jquery.jsonp-2.4.0.min.js,也可以使用ajax直接實現。

首先jsp引入jquery.jsonp-2.4.0.min.js,

大家不用糾結其他業務代碼,只關注如何轉換就可以。

1、JSP頁面如何調用


<code>//接收到二維碼鏈接,生成二維碼
//長鏈接轉短鏈接後生成二維碼
$.jsonp({
url: getShortUrl,
data: {longUrl: qrCodeLinkUrl},
callbackParameter: "callback",
success: function (data, textStatus, xOptions) {
console.log(data.shortUrl);
$('#code').qrcode(data.shortUrl);
//獲取網頁中的canvas對象
var myCanvas = document.getElementsByTagName('canvas')[0];
//將轉換後的img標籤插入到html中
$("#imgQrCode").attr("src", myCanvas.toDataURL("image/png"));
},
error: function (xOptions, textStatus) {
console.log("jsonp.error" + textStatus + ",rel=" + xOptions.data.longUrl)
$('#code').qrcode(qrCodeLinkUrl);
//獲取網頁中的canvas對象
var myCanvas = document.getElementsByTagName('canvas')[0];

//將轉換後的img標籤插入到html中
$("#imgQrCode").attr("src", myCanvas.toDataURL("image/png"));
}
});/<code>

2、控制器接收請求

<code>                   /**
* 長鏈接轉短鏈接
*/
@ResponseBody
@RequestMapping(value = "/getShortUrl4Jsonp", method = {RequestMethod.GET, RequestMethod.POST})
public String getShortUrl4Jsonp(HttpServletRequest request, @RequestParam(value = "longUrl", required = true) String longUrl, String callback) {
logger.info("-----------長鏈接轉短鏈接開始-----------");
Long startTime = System.currentTimeMillis();
logger.info("開始時間:" + startTime);
//微信長鏈接轉短鏈接接口每日調用上限1000,故先使用新浪微博獲取
String shortUrl = commonService.getShortUrlByWeiboApi(longUrl);
//使用新浪微博轉短鏈接失敗後,使用微信長鏈接轉短鏈接
if (StringUtil.isEmpty(shortUrl)) {
\t //獲取Spring.xml中配置的mpId
\t String mpId = ((WcGlobalVar) applicationContext.getBean("wcGlobalVar")).getInitKey();
\t try {
\t Mp mp = mpService.getMp(mpId);
\t String accessToken = mpService.getMpAccessToken(mp);
\t shortUrl = commonService.getShortUrl(accessToken, longUrl);
\t Map<string> jsonMap = new LinkedHashMap<>();
\t jsonMap.put("shortUrl", shortUrl);
\t jsonMap.put("longUrl", longUrl);
\t String jsonp = callback + "(" + JSON.toJSON(jsonMap) + ")";
}
Long endTime = System.currentTimeMillis();
logger.info("結束時間:" + endTime);
logger.info("耗時:" + (endTime - startTime));
logger.info("-----------長鏈接轉短鏈接結束-----------");
return jsonp;

} catch (Exception e) {
e.printStackTrace();

return "";
}
}
 /<string>/<code>

3、新浪微博長鏈接轉短鏈接實現

<code>/**
* 新浪微博API長鏈接轉短鏈接
*\t#新浪微博長鏈接轉短鏈接請求地址
\t\t *\tweibo.longToShortBaseUrl = http://api.weibo.com/2/short_url/shorten.json?source=APP_KEY&url_long=URL_LONG
\t\t *\t#iPad新浪客戶端App Key:2849184197 iphone新浪微博客戶端 App Key:5786724301 Google.Nexus浪客戶端App Key:1206405345 周博通微博管家App Key:202088835
\t\t *\tweibo.appKey = 2849184197
*
*/
public String getShortUrlByWeiboApi(String longUrl) {
String longToShortUrl = WcConfig.getInstance().getValue("weibo.longToShortBaseUrl")
.replace("APP_KEY", WcConfig.getInstance().getValue("weibo.appKey"))
.replace("URL_LONG", longUrl);
String shortUrl = null;
try {
logger.info("getShortUrlByWeiboApi ---- 長鏈接地址:" + longUrl);
String respJsonStr = HttpUtil.reqJsonGet(longToShortUrl);
logger.info("getShortUrlByWeiboApi ---- 長鏈接地址響應" + respJsonStr);
JSONObject respJson = JSONObject.parseObject(respJsonStr);
JSONArray jsonArray = respJson.getJSONArray("urls");
JSONObject respJO = jsonArray.getJSONObject(0);
/*url_short\tstring\t短鏈接 url_long\tstring\t原始長鏈接 type\tint\t鏈接的類型,0:普通網頁、1:視頻、2:音樂、3:活動、5、投票 */
String result = respJO.getString("result");
String type = respJO.getString("type");
logger.info("getShortUrlByWeiboApi ---- 長鏈接地址響應結果 result ----" + result + "-----" + type + "----url_long---" + respJO.getString("url_long") + "----url_short---" + respJO.getString("url_short"));
if (StringUtil.equals("true", result)) {
shortUrl = respJO.getString("url_short");
} else {
shortUrl = "";
}
} catch (Exception e) {
e.printStackTrace();

shortUrl = "";
}
return shortUrl;
}/<code>
<code>/**
* 微信長鏈接換短鏈接
* URL_SHORTURL = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=ACCESS_TOKEN";
* @param accessToken
* @param longUrl
* @return
*/
public String getShortUrl(String accessToken, String longUrl) {
String shortUrl = "";
String getShortUrl = WcGlobalVar.URL_SHORTURL.replace("ACCESS_TOKEN", accessToken);

String reqJson = "{\"action\":\"long2short\",\"long_url\":\"" + longUrl + "\"}";
logger.debug("返回json是:" + reqJson);
//微信接口不支持http請求,調用接口使用https
HttpUtils httpUtils = new HttpUtils();
JSONObject respJson = httpUtils.doPostSSL(getShortUrl, reqJson);
logger.debug("返回json是:" + respJson);
if (respJson != null) {
int errorCode = respJson.getInteger("errcode");
String errorMessage = respJson.getString("errmsg");
if (errorCode == 0) {
shortUrl = respJson.getString("short_url");
} else {
logger.debug("長鏈接換短鏈接失敗:錯誤代碼:" + errorCode + ",錯誤原因:" + errorMessage);
shortUrl = "";
}
}
return shortUrl;
}/<code>

5、http請求方法,請優先使用項目本身的HttpUtil工具類

<code>public static String reqJsonGet(String url) throws MpExcepiton {
log.debug("---do get http---");
CloseableHttpClient httpClient = createSSLClientDefault();
HttpGet get = new HttpGet(url);

CloseableHttpResponse response;
try {
response = httpClient.execute(get);
HttpEntity entity = response.getEntity();
String respStr = EntityUtils.toString(entity, "UTF-8");
EntityUtils.consume(entity);
log.debug("do get, respStr="+respStr);
if(null != respStr && !"".equals(respStr)){
JSONObject jret = (JSONObject) JSONObject.parse(respStr);
if(jret.containsKey("errcode")){
if(jret.get("errcode").equals("40029") || jret.get("errcode").equals("40001")){
throw new MpExcepiton(MpExcepiton.TokenInvalidHit,"httputil 訪問微信資源");
}
}
}
return respStr;
} catch (IOException e) {
e.printStackTrace();
} finally {
get.releaseConnection();
}
return "";
}
/**
* 發送 SSL POST 請求(HTTPS),JSON形式
*
* @param url API接口URL
* @param paramJson 請求數據
* @return
*/
public synchronized JSONObject doPostSSL(String url, String paramJson) {
log.debug("---doPostSSL---");
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
HttpPost httpPost = new HttpPost(url);
CloseableHttpResponse response = null;
String httpStr = null;

try {
httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(paramJson, "UTF-8");//解決中文亂碼問題
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
log.debug("---即將httpClient.execute---URL------" + url + "-----------paramJson---------" + paramJson);
response = httpClient.execute(httpPost);
log.debug("Return status code =" + response.getStatusLine().getStatusCode());
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

throw new RemoteServiceException(url, response.getStatusLine().getStatusCode(), null);
}
HttpEntity entity = response.getEntity();
if (entity == null) {
return null;
}
httpStr = EntityUtils.toString(entity, "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
}
}
return JSONObject.parseObject(httpStr);
}
/<code>


分享到:


相關文章: