[android] url shorter by goo.gl

설명은  https://developers.google.com/url-shortener/v1/getting_started 이고, 참고한 소스는 http://wireshock.com/easy-goo-gl-url-shortener-class-for-java/ 이다.

 

처음엔 구글에서 지원하는 기능으로 만들었었다.

그런데 이클립스에서는

{"longUrl":"http://www.amazon.com"}

으로 만들어서 서버로 보내는데, apk로 만들어서 테스트를 하게되면

{"a":"http://www.amazon.com"}

으로 만든다.

구글에서 제공하는 기본 라이브러리와 저 참조 페이지의 소스를 이용한건데 이랬다.

그래서 바꿨다.

 

private void makeShortUrl()
{
   String url = "http://www.amazon.com/gp/product/B002HE537W/ref=s9_wish_gw_d14_g79_i1?ie=UTF8&colid=8PH4GCSLSBIC&coliid=I3SN4RIGHSGEM9&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=01KA8NV42R2ZDV7KQCP0&pf_rd_t=101&pf_rd_p=1630083502&pf_rd_i=507846";
   shortenTask.execute(url);
}

private void onGetShortUrl(String $shortUrl)
{
   Log.i("MainActivity.java | onGetShortUrl", "|" + $shortUrl + "|");
}

private AsyncTask<String, Integer, String> shortenTask = new AsyncTask<String, Integer, String>()
{
   @Override
   protected String doInBackground(String... params)
   {
      return UrlShortenUtil.shorten(params[0]);
   }

   protected void onPostExecute(String result)
   {
      onGetShortUrl(result);
   };
};

네트웍 왔다갔다하는 작업이라 AsyncTask, Handler, Thread 등을 써야한다. 아 귀찮아

 

import java.io.BufferedReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.util.Log;

public class UrlShortenUtil
{
   private static final String URL_GOOGL_SERVICE = "https://www.googleapis.com/urlshortener/v1/url";

   public static String shorten(String $longUrl)
   {
      DefaultHttpClient client = new DefaultHttpClient();
      String result = null;
      BufferedReader reader = null;

      try
      {
         HttpPost kRequest = new HttpPost(URL_GOOGL_SERVICE);
         kRequest.setHeader("Content-Type", "application/json");

         JSONObject longUrlJson = new JSONObject();
         longUrlJson.put("longUrl", $longUrl);
         Log.i("UrlShortenUtil.java | shorten", "|" + $longUrl + " | " + longUrlJson + "|");

         StringEntity kStringEntity = new StringEntity(longUrlJson.toString(), HTTP.UTF_8);

         kRequest.setEntity(kStringEntity);

         HttpResponse kResponse = client.execute(kRequest);
         String jsonResult = EntityUtils.toString(kResponse.getEntity());

         try
         {
            result = new JSONObject(jsonResult).getString("id");
         }
         catch (Exception e)
         {
            e.printStackTrace();
         }

         Log.i("UrlShortenUtil.java | shorten", "|" + result + "|");
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
      finally
      {
         if (reader != null)
         {
            try
            {
               reader.close();
            }
            catch (Exception e)
            {
               e.printStackTrace();
            }
         }

         client.getConnectionManager().closeExpiredConnections();
      }

      return result;
   }
}

 

소스를 참고한 곳에 있는 Gson 이란 놈이 이상하게도 apk를 만들고 나면 이상한 json을 만들어 버려서 기존에 사용하던 네트웍 함수를 고쳐서 쓰기로 했다.

 

결과는 이렇게 잘 넘어온다.

http://goo.gl/81DnK0

 

 

<uses-permission android:name="android.permission.INTERNET" />