在很多时候我们都需要使用到短链接,比较常见的是在生成微信二维码的时候,长的url不能生成二维码,必须使用短链接。所以短链接的生成就尤其重要,废话不多说,下面直接介绍三种生成短链接的工具类
一、使用百度的短链接服务生成短链接 (可能不太稳定,时而能获取二维码 时而不能获取)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class ShortNetAddressUtil { private static Logger log = LoggerFactory.getLogger(ShortNetAddressUtil.class); public static int TIMEOUT = 30 * 1000; public static String ENCODING = "UTF-8"; /** * 根据传入的url,通过访问百度短链接的接口, 将其转换成短的URL * * @param originURL * @return */ public static String getShortURL(String originURL) { String tinyUrl = null; try { // 指定百度短链接的接口 URL url = new URL("http://dwz.cn/create.php"); // 建立连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置连接的参数 // 使用连接进行输出 connection.setDoOutput(true); // 使用连接进行输入 connection.setDoInput(true); // 不使用缓存 connection.setUseCaches(false); // 设置连接超时时间为30秒 connection.setConnectTimeout(TIMEOUT); // 设置请求模式为POST connection.setRequestMethod("POST"); // 设置POST信息,这里为传入的原始URL String postData = URLEncoder.encode(originURL.toString(), "utf-8"); // 输出原始的url connection.getOutputStream().write(("url=" + postData).getBytes()); // 连接百度短视频接口 connection.connect(); // 获取返回的字符串 String responseStr = getResponseStr(connection); log.info("response string: " + responseStr); // 在字符串里获取tinyurl,即短链接 tinyUrl = getValueByKey(responseStr, "tinyurl"); log.info("tinyurl: " + tinyUrl); // 关闭链接 connection.disconnect(); } catch (IOException e) { log.error("getshortURL error:" + e.toString()); } return tinyUrl; } /** * 通过HttpConnection 获取返回的字符串 * * @param connection * @return * @throws IOException */ private static String getResponseStr(HttpURLConnection connection) throws IOException { StringBuffer result = new StringBuffer(); // 从连接中获取http状态码 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 如果返回的状态码是OK的,那么取出连接的输入流 InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, ENCODING)); String inputLine = ""; while ((inputLine = reader.readLine()) != null) { // 将消息逐行读入结果中 result.append(inputLine); } } // 将结果转换成String并返回 return String.valueOf(result); } /** * JSON 依据传入的key获取value * * @param replyText * @param key * @return */ private static String getValueByKey(String replyText, String key) { ObjectMapper mapper = new ObjectMapper(); // 定义json节点 JsonNode node; String targetValue = null; try { // 把调用返回的消息串转换成json对象 node = mapper.readTree(replyText); // 依据key从json对象里获取对应的值 targetValue = node.get(key).asText(); } catch (JsonProcessingException e) { log.error("getValueByKey error:" + e.toString()); e.printStackTrace(); } catch (IOException e) { log.error("getValueByKey error:" + e.toString()); } return targetValue; } /** * 百度短链接接口 * * @param args */ public static void main(String[] args) { getShortURL("https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login"); } }
二、仍然是百度的短链接服务,不过是另一种方式。
(这种方式获取二维码较稳定,不过在扫码的时候有可能会出现scope不能为空的错误信息)
这种方式需要加入两个jar包
<dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.45version> dependency> <dependency> <groupId>com.squareup.okhttp3groupId> <artifactId>okhttpartifactId> <version>3.9.1version> dependency>
import java.io.IOException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class ShortNetAddressUtil { public static String getShortURL(String longUrl) { try { String result = callHttp("http://suo.im/api.php?format=json&url=" + longUrl); JSONObject jsonResult = JSON.parseObject(result); return jsonResult.getString("url"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } private static String callHttp(String requestUrl) throws IOException { OkHttpClient httpClient = new OkHttpClient(); // 创建OkHttpClient对象 Request request = new Request.Builder().url(requestUrl)// 请求接口。如果需要传参拼接到接口后面。 .build();// 创建Request 对象 Response response = null; response = httpClient.newCall(request).execute();// 得到Response 对象 return response.body().string(); } /** * 百度短链接接口 * * @param args */ public static void main(String[] args) { System.out.println(getShortURL("https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login")); } }
三、使用新浪的短服务生成短链接 (个人觉得目前这种方式最稳定)
同样需要使用到两个jar包
<dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.45version> dependency> <dependency> <groupId>com.squareup.okhttp3groupId> <artifactId>okhttpartifactId> <version>3.9.1version> dependency>
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * 使用新浪的短链接服务生成短链接 */ public class ShortNetAddressUtil{ static String actionUrl = "http://api.t.sina.com.cn/short_url/shorten.json"; static String APPKEY = "2815391962,31641035,3271760578,3925598208"; public static void main(String[] args) { String longUrl = "https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login"; System.out.println(getShortURL(longUrl)); } public static String getShortURL(String longUrl){ longUrl = java.net.URLEncoder.encode(longUrl); String appkey = APPKEY; String[] sourceArray = appkey.split(","); for(String key:sourceArray){ String shortUrl = sinaShortUrl(key,longUrl); if(shortUrl != null){ return shortUrl; } } return null; } public static String sinaShortUrl(String source, String longUrl){ String result = sendPost(actionUrl, "url_long="+longUrl+"&source="+source); if(result==null || "".equals(result)){ return ""; } JSONArray jsonArr = JSON.parseArray(result); JSONObject json = JSON.parseObject(jsonArr.get(0).toString()); String ret = json.get("url_short").toString(); return ret; } /** * 向指定 URL 发送POST方法的请求 * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送 POST 请求出现异常!"+e); e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; } }
以上就是短链接的生成的工具类的三种编写方式,各个公司的短链接服务有时候稳定有时候不稳定,比如前段时间百度的短链接服务就不是很稳定。所以大家可以在实际应用过程中挑选三种不同的方法来进行选择。