CORS
- 크로스 도메인에러
- JavaScript에서 공공데이터 API호출시 Ajax 실행하려고 했는데 CORS 에러가 났다.
- 해결방법 요약
- Java에서 API데이터를 불러온다.
- A.jsp의 request영역에 json 데이터를 등록
- 새로운 jsp인 B.jsp에서 A.jsp에 뿌려진 json데이터를 파싱한다.
- 이 방법은 교수님께 여쭤보니 파싱을 한번 더 하는거니까 바로 가져오는 것 보다 느릴거라고 말씀하셨다 ㅠㅠ
- 바로 가져오는 방법은 좀 더 시간이 필요할듯!…
해결1 : Java로 파싱하기
- 파일설명
- LHController.java : uri로 연결해주는 Controller
- LHapiPractice.jsp : json데이터 받는 곳.
- LHapiAjax.jsp : LHapiPractice.jsp에 뿌려진 json데이터 파싱해서 새롭게 보여주는 곳
- Controller 생성
package kr.co.soyo;
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.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@Controller
@RequestMapping("/ajax")
public class LHController {
@RequestMapping("/LHapiPractice.do")
public static void getLHapi(Model model) throws IOException {
// API데이터 뿌려주는 곳.
StringBuilder urlBuilder = new StringBuilder("https://data.myhome.go.kr:443/rentalHouseList"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=서비스키"); /*Service Key*/
//urlBuilder.append("&" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + URLEncoder.encode("서비스키", "UTF-8")); /*공공데이터포털에서 받은 인증키*/
urlBuilder.append("&" + URLEncoder.encode("brtcCode","UTF-8") + "=" + URLEncoder.encode("11", "UTF-8")); /*광역시도 코드*/
urlBuilder.append("&" + URLEncoder.encode("signguCode","UTF-8") + "=" + URLEncoder.encode("140", "UTF-8")); /*시군구 코드*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("50", "UTF-8")); /*조회될 목록의 페이지당 데이터 개수 (기본값:10)*/
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("2", "UTF-8")); /*조회될 페이지의 번호 (기본값:1)*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
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 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 jsonObj = (JsonObject) Parser.parse(sb.toString());
JsonArray memberArray = (JsonArray) jsonObj.get("hsmpList");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOuput = gson.toJson(memberArray);
model.addAttribute("LHInfo",jsonOuput );
}
@RequestMapping(value="/LHapiAjax.do", method=RequestMethod.GET)
public String LHapiAjax() {
// 파싱하는 곳.
return "ajax/LHapiAjax";
}
}