[Android/API]SNS 로그인 구현(5) - 네이버 JSON 파싱으로 계정 정보 얻어오기

2021. 5. 14. 15:24Android/튜토리얼 및 가이드

728x90
반응형

* 아래 링크에서 로그인 기능을 완성하고 이 작업을 따라해주세요!

 

[Android Studio/JAVA]SNS 로그인 구현(1) - 네이버

1. Naver Developer에서 네이버 로그인 연동 API 개발 신청을 한다. 네이버 아이디로 로그인 - INTRO 환영합니다 네아로의 올바른 적용방법을 알아볼까요? 네이버 아이디로 로그인을 통해 신규 회원을

anovice-dp.tistory.com

* 아래 링크도 네이버 API를 XML과 JSON으로 파싱함 (검색 - 쇼핑)

 

[프로젝트/Android]너의 사료가 보여 #02 API 파싱(xml)

- 이전글 - 2020/12/17 - [프로젝트/Android]너의 사료가 보여 - oven 2020/12/19 - [프로젝트/Android]너의 사료가 보여 #01 화면 구현(스플래시, 화면이동, 액션바) 1. 우선 API 등록 후 키 값을 이용해 주소..

anovice-dp.tistory.com

 

[프로젝트/Android]너의 사료가 보여 #06 API 파싱(json/네이버 검색-쇼핑)

- 이전글 - 2020/12/17 - [프로젝트/Android]너의 사료가 보여 - oven 2020/12/19 - [프로젝트/Android]너의 사료가 보여 #01 화면 구현(스플래시, 화면이동, 액션바) 2021/02/03 - [프로젝트/Android]너의 사료..

anovice-dp.tistory.com

 

* Naver Developers

 

블로그 - Search API

블로그 NAVER Developers - 검색 API 블로그 검색 개발가이드 검색 > 블로그 네이버 블로그 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출할 때 HTTP Header에 애플리케이션

developers.naver.com

 

1. 로그인이 완료되어 id값과 pw값이 일치한다는 토큰을 얻어오고 토큰와 유저정보를 받아올 주소를 이용해 값을 추출한다.

btnNaverLogin.setOAuthLoginHandler(mOAuthLoginHandler); // 네이버 핸들러 연결
private OAuthLoginHandler mOAuthLoginHandler = new OAuthLoginHandler() {
	@Override
	public void run(boolean success) {
		if (success) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					String accessToken = mOAuthLoginModule.getAccessToken(mContext);
					String header = "Bearer " +  accessToken;
					Map<String, String> requestHeaders = new HashMap<>();
					requestHeaders.put("Authorization", header);
					String apiURL = "https://openapi.naver.com/v1/nid/me"; //엑세스 토큰으로 유저정보를 받아올 주소
					String responseBody = get(apiURL,requestHeaders);
					Log.d("responseBody 확인 ",responseBody); //주소로 얻은 유저정보 (제이슨)
					NaverUserInfo(responseBody);

					login_state = "n";
					new Thread()
					{
						public void run()
						{
							Message msg = btnInVisibleHandler.obtainMessage();
							btnInVisibleHandler.sendMessage(msg);
							txtLoginState.setText("네이버 : " + login_name);
						}
					}.start();
				}
			}).start();

		} else {
			String errorCode = mOAuthLoginModule.getLastErrorCode(mContext).getCode();
			String errorDesc = mOAuthLoginModule.getLastErrorDesc(mContext);
			Toast.makeText(mContext, "errorCode:" + errorCode + ", errorDesc:" + errorDesc, Toast.LENGTH_SHORT).show();
		}
	}
};

 

2. 위에서 얻어온 유저 정보를 NaverUserInfo 메서드를 만들어 매개변수로 보낸다. 이 메서드에서는 get() 메서드로 키 값을 이용해 밸류를 가져온다.

private void NaverUserInfo(String msg){
	JSONParser jsonParser = new JSONParser();

	try {
		JSONObject jsonObject = (JSONObject) jsonParser.parse(msg);
		String resultcode = jsonObject.get("resultcode").toString();
		Log.d("resultcode 확인 ",resultcode);

		String message = jsonObject.get("message").toString();
		Log.d("message 확인 ",message);

		if(resultcode.equals("00")){
			if(message.equals("success")){
				JSONObject naverJson = (JSONObject) jsonObject.get("response");

				login_name = naverJson.get("name").toString();
				Log.d("이름 확인 ",login_name);
			}
		}
		else{
			//Toast.makeText(getApplicationContext(),"로그인 오류가 발생했습니다.",Toast.LENGTH_SHORT).show();
		}
	}
	catch (ParseException e) {
		e.printStackTrace();
	}
}
private 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();
	}
}

 

3. get() 메서드에서는 HttpURLConnection() 메서드를 통해 url과 연결된다.

private static HttpURLConnection connect(String apiUrl){
	try {
		java.net.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);
	}
}

 

4. get() 메서드에서는 readBody() 메서드를 통해 데이터들을 읽어온다.

private 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);
	}
}
728x90
반응형