본문 바로가기
Android

안드로이드 단축URL 생성하기 (네이버 단축URL)

by 일용직 코딩노동자 2020. 5. 7.
728x90
반응형

URL을 작성하다보면 엄청 길어지는 경우가 많이있습니다.

 

오늘은 그 URL을 네이버에서 제공해주는 API로 단축 시켜볼게요.

 

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음성인식, 음성합성 등이 있습니다.

developers.naver.com

 

네이버 개발자 사이트에서 해볼수있는데요.

 

여기서 이쪽 탭에서 애플리케이션 등록을 선택해주시면 됩니다.

 

등록은 크게 어렵지 않습니다.

 

애플리케이션 이름을 작성하시고 원하시는 API서비스를 선택하시면됩니다.

 

저희는 단축URL을 할것이기 때문에, 선택해줍니다.

 

이렇게 해주시면 API신청 셋팅이 끝납니다.

 

아까 Application탭에서 내 애플리케이션을 보시면 

 

Client ID 및 등록 할때 적어놓은 Application명이 보입니다.

 

저는 부분 삭제를 한 캡쳐본 입니다.

 

클릭 해보시면 

이렇게 나옵니다.

 

해당 Client ID와 Client Secret는 메모장에 꼭! 복사 해놓기로 해요...!

 

이제 소스를 보시면 됩니다.

 

네이버 개발자 사이트에서 제공은 해줍니다.

 

네이버 제공에는 자바의 메인함수 부분이 포함되어있어 그부분을 제거하고 조금 바꾸었습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;

class ShortURL
{
    public static String get(String apiUrl, Map<String, String> requestHeaders){
        HttpURLConnection con = connect(apiUrl);
        try {
            con.setRequestMethod("GET");
            for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
                con.setRequestProperty(header.getKey(), header.getValue());
            }

            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
                return readBody(con.getInputStream());
            }
            else { // 에러 발생
                return readBody(con.getErrorStream());
            }
        }
        catch (IOException e) {
            throw new RuntimeException("API 요청과 응답 실패", e);
        }
        finally {
            con.disconnect();
        }
    }

    public static HttpURLConnection connect(String apiUrl){
        try {
            URL url = new URL(apiUrl);
            return (HttpURLConnection)url.openConnection();
        }
        catch (MalformedURLException e) {
            throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
        }
        catch (IOException e) {
            throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
        }
    }

    public static String readBody(InputStream body){
        InputStreamReader streamReader = new InputStreamReader(body);

        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();

            String line;
            while ((line = lineReader.readLine()) != null) {
                responseBody.append(line);
            }
            return responseBody.toString();
        }
        catch (IOException e) {
            throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
        }
    }
}

일반 클래스 하나 생성하셔서 이렇게 작성해주세요. (이 부분은 네이버에서 제공해줍니다.)

 

이제 URL을 단축 해보실 곳에 작성해볼게요.

 

우선 함수하나 생성해줄게요.

 

public String Create_ShortURL(String PageURL) throws UnsupportedEncodingException {
        String originalURL = PageURL;

        originalURL = URLEncoder.encode(originalURL,"UTF-8");

        String apiURL = "https://openapi.naver.com/v1/util/shorturl?url=" + originalURL;
        String clientId = ""; //애플리케이션 클라이언트 아이디값"
        String clientSecret = ""; //애플리케이션 클라이언트 시크릿값"

        Map<String, String> requestHeaders = new HashMap<>();
        requestHeaders.put("X-Naver-Client-Id", clientId);
        requestHeaders.put("X-Naver-Client-Secret", clientSecret);
        String responseBody = ShortURL.get(apiURL,requestHeaders);

        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(responseBody);
        jsonElement = jsonElement.getAsJsonObject().get("result");

        String result = String.valueOf(jsonElement.getAsJsonObject().get("url"));
        result = result.substring(1);
        result = result.substring(0,result.length()-1);

	return result;
 }

함수 만들어서 사용해주시면 되는데요. 결정적으로 result 변수에서 단축된 URL이 나옵니다.

 

String ShortURL = Creat_ShortURL(단축하고자 하는 URL);

이렇게 원하시는 곳에서 사용해 주시면 됩니다.

 

이제 부분 설명 드릴게요.

 

String responseBody = ShortURL.get(apiURL,requestHeaders);

이 부분을 보시면 아까 만든 클래스에있는 get이라는 메소드를 이용해서 사용합니다.

 

이렇게 하면 String형 변수 responseBody에는 단축 URL이 담기는데요.

 

제이슨(json) 형식으로 담기게됩니다.

 

제이슨을 모르는 분들도 많이 계십니다.

 

HashMap와 같은 형식이라고 생각하시면 됩니다. (하나의 키와 값 의 쌍으로 이뤄져있죠)

 

이게 막 어떻게 나오냐면....

 

{"result":{"url":"http://me2.do/GhIsYTfv","hash":"GhIsYTfv","orgUrl":"내가 단축 하려고 했던 URL"},"message":"ok","code":"200"}

 

막 이런식으로 나옵니다. 어우 .. 저게 뭔가 싶은 분도 많을거에요.

 

근데 보면 어? 저기.. me2..머시기 저게 단축 URL아닌가? 보이시는 분도 있을거에요.

 

맞습니다 저게 단축 URL이구요 저희는 저 값만 있으면 되요!!

 

그래서 필요했던 코드가 

 

JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(responseBody);
jsonElement = jsonElement.getAsJsonObject().get("result");

 

일단 저희는 String형으로 responseBody변수에 받았지만 이걸 따로 저 단축 URL만 추출하기 위해서는 제이슨 형식으로 바꿔줄 필요가 있어요.

 

제이슨파서(jsonparser)기능을 이용해서 제이슨 형식으로 바꿨습니다.

 

그리고 보시면 get("result") 보이실거에요.

 

위에 보시면 큰 괄호가 result로 감싸져있습니다.

 

일단 result먼저 추출 하는거에요.

 

그러면 값이 어떻게 나오냐면요.

 

{"url":"http://me2.do/GhIsYTfv","hash":"GhIsYTfv","orgUrl":"내가 단축 하려고 했던 URL"}

 

이렇게 나와요! 뭔가 위에꺼랑 조금 달라진 점이 보이시나요?

 

이제 단축 URL의 키값을 보시면 url로 되어있네요!! 

 

다시 추출해볼게요.

 

그 과정이 이제

 

String result = String.valueOf(jsonElement.getAsJsonObject().get("url"));

이 부분입니다.  더이상 제이슨 형식이 필요없기때문에 그냥 result라는 String형 변수에 바로 형변환 때려서 가져온거에요.

 

자 그러면 값이 어떻게 추출이 되느냐

 

"http://me2.do/GhIsYTfv"

 

이런식으로 추출이 됩니다.

 

근데 저는 양쪽의 " "  이 따옴표가 크게 신경에 거슬립디다...

 

result = result.substring(1);
result = result.substring(0,result.length()-1);

그것 조차도 서브스트링(substring) 기능으로 그냥 없애버렸습니다.

 

맨 첫글자를 지우고 그 후 맨 마지막 문자열도 지워버렸어요.

 

그랬더니

http://me2.do/GhIsYTfv

딱 저희가 원하는 단축 URL만 뽑았습니다 ㅎㅎ

 

일 한도는 25000건 이라고 합니다..

 

궁금하신 사항은 댓글주세요!

728x90
반응형

댓글