24.01.23

서린·2024년 1월 23일

혼자개발

목록 보기
26/82

샘플코드를 작성하는것 까지 했지만 console에 값이 찍히지 않아서 계속 서치 해보던 중
GetMapping을 놓친 것을 알았다

package com.project.api;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.project.mountain.mapper.MountainMapper;

import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping(value = "/api/parse")
@RequiredArgsConstructor
public class ApiParseController {
	
	private final MountainMapper mountainMapper;

	@GetMapping
	@Transactional
	 public static void main(String[] args) throws IOException {
	     // url을 만들기 위한 StringBuilder   
		 StringBuilder urlBuilder = new StringBuilder("https://apis.data.go.kr/B553662/top100FamtListBasiInfoService/getTop100FamtListBasiInfoList"); /*URL*/
	     // open api의 요청 규격에 맞는 파라미터 생성, 발급받은 인증키   
		 urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=JVpFRa8p0GbG8tVECHTxUPjTZ4DJAJRZkHcnrC%2Br0zNf%2FijOpKtFEiVqGI8BJIHHcyvZAIo95FHY0zOwCscOOg%3D%3D"); /*Service Key*/
	     urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
	     urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
	     urlBuilder.append("&" + URLEncoder.encode("frtrlNm","UTF-8") + "=" + URLEncoder.encode("가리산", "UTF-8")); /*조회할 산 이름*/
	     urlBuilder.append("&" + URLEncoder.encode("addrNm","UTF-8") + "=" + URLEncoder.encode("강원도 춘천시 북산면ㆍ동면, 홍천군 두촌면ㆍ화촌면", "UTF-8")); /*주소*/
	     urlBuilder.append("&" + URLEncoder.encode("aslAltide","UTF-8") + "=" + URLEncoder.encode("1051.0", "UTF-8")); /*고도*/
	     // url 객체 생성
	     URL url = new URL(urlBuilder.toString());
	     // 요청 하고자 하는 url과 통신하기 위한 Connection 객체 생성
	     HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	     // 통신을 위한 메소드 
	     conn.setRequestMethod("GET");
	     // 통신을 위한 Content-type
	     conn.setRequestProperty("Content-type", "application/json");
	     // 통신 응답 코드 확인
	     System.out.println("Response code: " + conn.getResponseCode());
	     // 전달받은 데이터를 BufferedReader 객체로 저장
	     BufferedReader rd;
	     if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
	         rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	     } else {
	         rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
	     }
	     // 저장된 데이터를 라인별로 읽어서 StringBuilder 객체로 저장
	     StringBuilder sb = new StringBuilder();
	     String line;
	     while ((line = rd.readLine()) != null) {
	         sb.append(line);
	     }
	     // 객체 해제
	     rd.close();
	     conn.disconnect();
	     // 전달받은 데이터 확인
	     System.out.println(sb.toString());
	    }
	
}

이 코드를 실행시켰더니



이런 식으로 값이 잘 나왔다

그 다음 json파싱 코드를 추가 하고 실행 시켰더니

package com.project.api;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.project.mountain.domain.Mountain;
import com.project.mountain.mapper.MountainMapper;

import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping(value = "/api/parse")
@RequiredArgsConstructor
public class ApiParseController {
	
	@Autowired MountainMapper mountainMapper;

	@GetMapping
	 public static void main(String[] args) throws IOException {
	     // url을 만들기 위한 StringBuilder   
		 StringBuilder urlBuilder = new StringBuilder("https://apis.data.go.kr/B553662/top100FamtListBasiInfoService/getTop100FamtListBasiInfoList"); /*URL*/
	     // open api의 요청 규격에 맞는 파라미터 생성, 발급받은 인증키   
		 urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=JVpFRa8p0GbG8tVECHTxUPjTZ4DJAJRZkHcnrC%2Br0zNf%2FijOpKtFEiVqGI8BJIHHcyvZAIo95FHY0zOwCscOOg%3D%3D"); /*Service Key*/
	     urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
	     urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
	     urlBuilder.append("&" + URLEncoder.encode("_type", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8"));
	     urlBuilder.append("&" + URLEncoder.encode("frtrlNm","UTF-8") + "=" + URLEncoder.encode("가리산", "UTF-8")); /*조회할 산 이름*/
	     urlBuilder.append("&" + URLEncoder.encode("addrNm","UTF-8") + "=" + URLEncoder.encode("강원도 춘천시 북산면ㆍ동면, 홍천군 두촌면ㆍ화촌면", "UTF-8")); /*주소*/
	     urlBuilder.append("&" + URLEncoder.encode("aslAltide","UTF-8") + "=" + URLEncoder.encode("1051.0", "UTF-8")); /*고도*/
	     // url 객체 생성
	     URL url = new URL(urlBuilder.toString());
	     // 요청 하고자 하는 url과 통신하기 위한 Connection 객체 생성
	     HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	     // 통신을 위한 메소드 
	     conn.setRequestMethod("GET");
	     // 통신을 위한 Content-type
	     conn.setRequestProperty("Content-type", "application/json");
	     // 통신 응답 코드 확인
	     System.out.println("Response code: " + conn.getResponseCode());
	     // 전달받은 데이터를 BufferedReader 객체로 저장
	     BufferedReader rd;
	     if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
	         rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	     } else {
	         rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
	     }
	     // 저장된 데이터를 라인별로 읽어서 StringBuilder 객체로 저장
	     StringBuilder sb = new StringBuilder();
	     String line;
	     while ((line = rd.readLine()) != null) {
	         sb.append(line);
	     }
	     // 객체 해제
	     rd.close();
	     conn.disconnect();
	     // 전달받은 데이터 확인
	     System.out.println(sb.toString());
	     
	     

         JsonParser parser = new JsonParser();
         JsonObject obj = parser.parse(sb.toString()).getAsJsonObject();

         JsonObject responseBody = obj.getAsJsonObject("response").getAsJsonObject("body");
         if (responseBody != null) {
             JsonArray items = responseBody.getAsJsonObject("items").getAsJsonArray("item");

             for (JsonElement jsonElement : items) {
                 JsonObject temp = jsonElement.getAsJsonObject();

                 String mtName = temp.has("frtrlNm") ? temp.get("frtrlNm").getAsString() : "";
                 String mtLocation = temp.has("addrNm") ? temp.get("addrNm").getAsString() : "";
                 int mtHeight = temp.has("aslAltide") ? temp.get("aslAltide").getAsInt() : 0;

               
                 Mountain mountain = Mountain.builder()
                         .mtName(mtName)
                         .mtLocation(mtLocation)
                         .mtHeight(mtHeight)
                         .build();
                 }
             }
	}
}

500에러가 나타났다


MalformedJsonException 에러는
Restful api를 지원하는 서버와 통신하기 위해 gson을 사용하는 경우에 발생 할 수있다
발생한 이유는 gson에서 json을 처리할 때 json 형식의 RFC 4627을 엄격하게 지키지 않아서라고한다 (json data에 불필요한 값이나 띄어쓰기가 있는 경우 등등)

0개의 댓글