javagoogle-url-shortener

Java, shorten URL using goo.gl API?


i'm trying to do this in Java without using an external library. I can't use an external library to do this because I'm not using Maven with this project.

The method i'm using is:

public static String shorten(String longUrl) {
    if (longUrl == null) {
        return longUrl;
    }

    StringBuilder sb = null;
    String line = null;
    String urlStr = longUrl;

    try {
        URL url = new URL("https://www.googleapis.com/urlshortener/v1/url");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("User-Agent", "toolbar");

        OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
        writer.write("url=" + URLEncoder.encode(urlStr, "UTF-8"));
        writer.close();

        BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        sb = new StringBuilder();
        while ((line = rd.readLine()) != null) {
            sb.append(line + '\n');
        }

        String json = sb.toString();
        return json.substring(json.indexOf("http"), json.indexOf("\"", json.indexOf("http")));
    } catch (MalformedURLException e) {
        e.printStackTrace();
        return longUrl;
    } catch (IOException e) {
        e.printStackTrace();
        return longUrl;
    }
}

and the error i'm getting is:

[23:30:44 WARN]: java.io.IOException: Server returned HTTP response code: 400 for URL: https://www.googleapis.com/urlshortener/v1/url
[23:30:44 WARN]:    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1838)
[23:30:44 WARN]:    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
[23:30:44 WARN]:    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

Are there some simple Java URL shortening alternatives that don't require an external jar if this method won't work? Thanks for the help!

Edit

The url for the api was wrong. updated it with new error as well.


Solution

  • Try this code to redirect your link to the final destination. It uses Apache HTTP Client library though. This is the only way I could successfully redirect to every valid link possible. Other methods had low accuracy for me.

    private static String linkCorrector(String link) throws ClientProtocolException, IOException{
            HttpClient client = new DefaultHttpClient();
            HttpParams params = client.getParams();
            HttpClientParams.setRedirecting(params, false);
            HttpGet method = new HttpGet(link);
            HttpResponse resp = client.execute(method);
            String location = null;
            Header h = resp.getLastHeader("Location");
            if(h == null || h.getValue() == null){
                location = "";
            }
            else{
                location = resp.getLastHeader("Location").getValue();
            }
            return location;
        }