package url;

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 java.util.List;
import java.util.Map;

/**
 *                       
 * @Filename LongUrlToShort.java
 *
 * @Description 长URL生成短URL
 *
 * @Version 1.0
 *
 * @Author Lu Chuandong
 * 
 * @mail lucd1990@126.com
 * 
 * 原理: 
 * 1,url以post方法传递到了http://dwz.cn/create.php的url参数内;
 * 2,dwz.cn先检查是否符合转化的要求
 * 3,dwz.cn将url的参数提取为5位字符作为摘要,内部建立了长url和http://dwz.cn/摘要 的映射
 * 4,访问的是http://dwz.cn/摘要,网站获取对应的地址,然后重新跳转到输入地址
 * 5,生成短连接:
 *  {"tinyurl":"http:\/\/dwz.cn\/摘要","status":0,"longurl:"http://..."}---成功 . \/\/是//的js逃逸机制,以防变成正则表达式
 *  {"status":-1,"err_msg":"网址不能为空","longurl":""}---空
 *  {"status":-1,"err_msg":"您输入的网址不存在,请重新输入","longurl":"http://大赛分为"}---大赛分为
 *  {"status":-1,"err_msg":"您输入的网址可能有安全隐患,请重新输入","longurl":"http://大赛分为"}---http://大赛分为
 * 6,查询长连接:
 *  {status:0,longurl:http://weibo.com/lucd1990/profile}
 *  {status:-2,err_msg:您输入的短网址不存在, 请重新输入!,longurl:}
 * 7,自定义短连接:
 *  {"tinyurl":"http:\/\/dwz.cn\/java_comp","status":0,"longurl":"http://www.blogjava.net/jjshcc/archive/2011/04/12/348132.html","err_msg":""}
 *  {"status":-1,"err_msg":"对不起,自定义字符只能包含字母、数字和破折号。请重新输入","longurl":"http://www.blogjava.net/jjshcc/archive/2011/04/12/348132.html"}
 *  {"status":-1,"err_msg":"短网址过长,最长不要超过20个字符","longurl":""}
 *  {"err_msg":"对不起, 该网址已经存在","status":-1,"longurl":""}
 *  
 */
public class LongUrlToShort {

	//测试用的
	public static void main(String[] args) {
		System.out.println(createShortUrl("http://weibo.com/lucd1990/profile"));
		System.out.println(queryLongUrl("http://dwz.cn/vp3cL"));
		System.out.println(custShortUrl("java_comp", "http://www.blogjava.net/jjshcc/archive/2011/04/12/348132.html"));
	}

	/**
	 * 让dwz.cn生成长连接对应的短连接
	 * @param longUrl
	 * @return
	 */
	public static String createShortUrl(String longUrl){
		String json = sendPost("http://dwz.cn/create.php", "url=" + longUrl);
		String parms = json.replace("\"", "").replace("\\", "");
		System.out.println(json);
		if(parms.contains("status:0")){
			return parms.substring(parms.indexOf("http:"), parms.indexOf(",", parms.indexOf("http:")));
		}else
			return "error";
	}

	/**
	 * 自定义长连接与短连接的映射,并注册到dwz.cn
	 * @param tinyUrl
	 * @param longUrl
	 * @return
	 */
	public static boolean custShortUrl(String tinyUrl, String longUrl){
		String json = sendPost("http://dwz.cn/create.php", "url="+longUrl + "&alias=" + tinyUrl);
		String parms = json.replace("\"", "").replace("\\", "");
		System.out.println(json);
		if(parms.contains("status:0")){
			return true;
		}else
			return false;
	}
	
	/**
	 * 查询短连接对应的长连接
	 * @param tinyUrl
	 * @return
	 */
	public static String queryLongUrl(String tinyUrl){
		String json = sendPost("http://dwz.cn/query.php", "tinyurl=" + tinyUrl);
		json = json.replaceAll("\"", "");
		System.out.println(json);
		if(json.contains("status:0")){
			return json.substring(json.indexOf("http:"), json.indexOf("}"));
		}else
			return "error";
	}
	
	
	/**
	 * post传递参数
	 **/
	public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new 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) "
            									+ "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) "
            									+ "Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            out = new PrintWriter(conn.getOutputStream());
            out.print(param);
            out.flush();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
	
	/**
	 * get传递参数
	 **/
	public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            System.out.println(urlNameString);
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();
            Map<String, List<String>> map = connection.getHeaderFields();
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }
	
}
最近下载更多
luohaipeng  LV23 2019年12月4日
迟到的钟声  LV1 2019年10月8日
153393366@  LV9 2019年8月13日
低调人  LV38 2019年8月2日
断魂罗成  LV1 2019年6月26日
jhsalkjlk  LV1 2019年1月24日
小熊111111  LV1 2019年1月22日
359031282  LV2 2018年8月13日
zyl  LV34 2018年6月26日
wuyanjun  LV1 2018年5月3日
最近浏览更多
PHP才是最好的语  LV10 2020年9月9日
chen12341234  LV11 2020年7月24日
rebirth 2020年7月15日
暂无贡献等级
zzlinhanbin  LV1 2020年7月14日
Retuen  LV7 2019年12月18日
luohaipeng  LV23 2019年12月3日
青睐丶  LV6 2019年11月22日
迟到的钟声  LV1 2019年10月8日
153393366@  LV9 2019年8月13日
lion1984  LV2 2019年8月13日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友