뇌약간고침
D-19 카카오맵 REST API 주소 -> 코드 변경 관련 오류 (해결) 본문
public Map<String, String> getGeoCod(String add) {
try {
log.info("getGeo Start");
log.info("Address:"+add);
String address = URLEncoder.encode(add, "UTF-8");
String url = GEOCODE_URL + address+"&key="+GEOCODE_USER_INFO;
URL Url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
conn.setRequestProperty("Authorization", "KakaoAK " + GEOCODE_USER_INFO); // 인증 헤더 추가
log.info("====================1");
//url.openConnection.getInputStream 리턴값을 is에 담기
InputStream is = conn.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is,"UTF-8"));
StringBuilder resBuilder = new StringBuilder();
String inputStr;
log.info("====================2");
while ((inputStr=bf.readLine())!=null) {
log.info(">>>"+inputStr);
resBuilder.append(inputStr); //inputStr를 파라미터로 갖는 리턴값 반환
}
log.info("====================3");
JSONObject jo = new JSONObject(resBuilder.toString());
JSONArray result = jo.getJSONArray("result");
Map<String, String> ret = new HashMap<String, String>();
log.info("result 길이 : ",result.length());
if(result.length()>0) {
JSONObject jsonObject;
//results안의 getJSONObject(0) 값. 즉, 배열의 첫번째 값을 jsonObject 변수에 담는다.
jsonObject = result.getJSONObject(0);
//location문자를 파라미터로 가진 getDouble 사용 시 리턴값을 Double 데이터 타입의 lng 변수에 담는다.
Double lat = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lat");
Double lng = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lng");
ret.put("lat", lat.toString());
ret.put("lng", lng.toString());
log.info("====================");
log.info("LAT(위도) : ",lat);
log.info("LNG(경도) : ",lng);
log.info("====================");
//jsonObject안의 address_components를 파라미터로 가지는 getJSONArray 함수의 리턴 값을 ja변수에 담는다.
JSONArray ja = jsonObject.getJSONArray("address_components");
for(int l=0; l<ja.length(); l++) {
//ja의 배열길이 만큼 반복
JSONObject curjo = ja.getJSONObject(l);
//ja안의 JSONObject를 가져올때 파라미터 값을 l로 가진 리턴 값을 JSONObject 데이터타입의 curjo 변수에 담는다.
String type = curjo.getJSONArray("types").getString(0);
//curjo안의 types의 문자를 파라미터로 가지는 getJSONArray함수 안의 getString(0) 즉 첫번째 리턴값을 String 타입의 type변수에 넣는다.
String short_name = curjo.getString("short_name");
//curjo안의 short_name의 문자를 파라미터로 가지는 getJSONArray함수 리턴 값을 String 타입의 short_name에 담는다.
if(type.equals("postal_code")) {
// type 안의 리턴 값이 postal_code문자와 일치하면
System.out.println("POSTAL_CODE: "+short_name);
ret.put("zip", short_name);
}
else if(type.equals("administrative_area_level_3")) {
// type 안의 리턴 값이 administrative_area_level_3문자와 일치하면
System.out.println("CITY: "+short_name);
ret.put("city", short_name);
}
else if(type.equals("administrative_area_level_2")) {
// type 안의 리턴 값이 administrative_area_level_2문자와 일치하면
System.out.println("PROVINCE: "+short_name);
ret.put("province", short_name);
}
else if(type.equals("administrative_area_level_1")) {
// type 안의 리턴 값이 administrative_area_level_1문자와 일치하면
System.out.println("REGION: "+short_name);
ret.put("region", short_name);
}
}
return ret;
}
else log.info("!!!!!!!!!!!!!!!!!!");
return ret;
}
catch(Exception e) {
log.info("!!!!!!!!!!!!!!!!!!catch");
log.debug("why?", e);
System.out.print(e);
return null;
}
}
첫 에러
org.json.JSONException: JSONObject["result"] not found.[2m2024-04-23 17:48:26.909
두번째 에러
{"errorType":"AccessDeniedError","message":"cannot find Authorization : KakaoAK header"}
인증 헤더 문제 - 간단히 해결
n번째 에러
계속 변수명 오류
results -> documents
찍히는 return json 내용 확인
[2m2024-04-23 18:12:20.439[0;39m [32m INFO[0;39m [35m10568[0;39m [2m---[0;39m [2m[nio-8088-exec-1][0;39m [36mc.e.demo.controller.itemController [0;39m [2m:[0;39m jsonObj : {"documents":[{"address":{"mountain_yn":"N","h_code":"1144066000","region_3depth_name":"서교동","main_address_no":"447","x":"126.919446053291","sub_address_no":"5","y":"37.5564857555897","address_name":"서울 마포구 서교동 447-5","region_2depth_name":"마포구","region_3depth_h_name":"서교동","region_1depth_name":"서울","b_code":"1144012000"},"address_type":"REGION_ADDR","x":"126.919446053291","y":"37.5564857555897","address_name":"서울 마포구 서교동 447-5","road_address":{"building_name":"풍성빌딩","main_building_no":"21","road_name":"월드컵북로","region_3depth_name":"서교동","underground_yn":"N","sub_building_no":"","x":"126.919530756025","y":"37.5565464504624","address_name":"서울 마포구 월드컵북로 21","region_2depth_name":"마포구","zone_no":"04001","region_1depth_name":"서울"}}],"meta":{"total_count":1,"is_end":true,"pageable_count":1}}
해결!
public Map<String, String> getGeoCod(String add) {
try {
log.info("getGeo Start");
log.info("Address:"+add);
String address = URLEncoder.encode(add, "UTF-8");
String url = GEOCODE_URL + address+"&key="+GEOCODE_USER_INFO;
URL Url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
conn.setRequestProperty("Authorization", "KakaoAK " + GEOCODE_USER_INFO); // 인증 헤더 추가
log.info("====================1");
//url.openConnection.getInputStream 리턴값을 is에 담기
InputStream is = conn.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is,"UTF-8"));
StringBuilder resBuilder = new StringBuilder();
String inputStr;
log.info("====================2");
while ((inputStr=bf.readLine())!=null) {
//log.info(">>>"+inputStr);
resBuilder.append(inputStr); //inputStr를 파라미터로 갖는 리턴값 반환
}
log.info("====================3");
JSONObject jo = new JSONObject(resBuilder.toString());
//log.info("jsonObj : " + jo);
JSONArray results = jo.getJSONArray("documents");
log.info("comeBack...");
//리턴할 맵 생성
Map<String, String> ret = new HashMap<String, String>();
if(results != null && results.length() > 0) {
JSONObject jsonObj = results.getJSONObject(0);
JSONObject address2 = jsonObj.getJSONObject("address");
// 위도 및 경도 정보 가져오기
Double lat = address2.getDouble("y"); // 위도
Double lng = address2.getDouble("x"); // 경도
String addressName = address2.getString("address_name"); // 한글 주소
// "address" 정보에서 위도, 경도 및 한글 주소 추가
ret.put("lat", lat.toString());
ret.put("lng", lng.toString());
ret.put("addressName", addressName);
// 로그 출력
log.info("==========*return*===========");
log.info("LAT(위도) : " + lat);
log.info("LNG(경도) : " + lng);
log.info("한글 주소: " + addressName);
log.info("=============================");
}
return ret;
}
catch(Exception e) {
log.debug("geocode Exception", e);
return null;
}
}
그냥 가지고 돌아온 객체 찍어보면서 객체 명을 맞춤
+) 이외에도 자바스크립트... 관련 오류가 너무 많아서 오전은 다 날림... 🥲🥲🥲
참고
https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide
https://mine-it-record.tistory.com/328
https://enqnajrwk.tistory.com/36
'Project > 과정 기록' 카테고리의 다른 글
D-17 (0) | 2024.04.25 |
---|---|
D-18 카카오 rest api 관련 오류 (해결) (0) | 2024.04.24 |
D-20,D-19 매물 정보 지도 구현 로직 정리 (0) | 2024.04.22 |
D-25 (0) | 2024.04.17 |
D-26 (0) | 2024.04.16 |