Add Riot Api Controller

package gg.yj.kim.controller;

import gg.yj.kim.GRUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

@RestController
@Slf4j
public class RiotApiController {

    @Value("${riot.api.key}")
    private String riotApiKey;

    private String riotUrl = "https://kr.api.riotgames.com";

    @GetMapping(path = "/summoners/kr/{name}")
    public JSONObject findUserInformation(@PathVariable(name = "name") String name) {
        //소환사 명 인코딩
        //summonerName = grUtils.URLEncode(summonerName);
        String requestUrl = riotUrl + "/lol/summoner/v4/summoners/by-name/" + name;
        JSONObject jsonUserInfo = new JSONObject();
        try {
            jsonUserInfo = getApiJson(requestUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return jsonUserInfo;
    }

    public JSONObject getApiJson(String requestURL) throws Exception{
        JSONObject jsonObj = new JSONObject();
        JSONParser jParser = new JSONParser();

        //get 메서드와 URL 설정
        HttpGet httpGet = new HttpGet(requestURL);

        //header 설정
        httpGet.addHeader("User-Agent", "Mozilla/5.0");
        httpGet.addHeader("Accept-Language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7");
        httpGet.addHeader("Accept-Charset", "application/x-www-form-urlencoded; charset=UTF-8");
        httpGet.addHeader("Origin", "https://developer.riotgames.com");
        httpGet.addHeader("X-Riot-Token", riotApiKey);

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        CloseableHttpResponse response = httpClient.execute(httpGet);

        if (response.getStatusLine().getStatusCode() == 200) {
            ResponseHandler<String> handler = new BasicResponseHandler();
            String body = handler.handleResponse(response);
            log.info("body : " + body);

            jsonObj = (JSONObject) jParser.parse(body);
            log.info("jParser : " + jParser);
        }else{
            log.error("response is error : " + response.getStatusLine().getStatusCode());
        }

        return jsonObj;
    }

}

controller를 추가해주고 실행시킨 뒤 해당 url로 request를 보내면 아래와 같이 정상적으로 log가 출력이 됩니다.

 

AddErrorController

package gg.yj.kim.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebErrorController implements ErrorController {

    @GetMapping("/error")
    public String redirctRoot() {
        return "index.html";
    }
}

기본적으로 Spring Boot는 모든 오류를 합리적인 방식으로 처리하는 /error 매핑을 제공하며, 이는 서블릿 컨테이너에 "전역" 오류 페이지로 등록됩니다. 머신 클라이언트의 경우, 오류에 대한 세부 정보, HTTP 상태 및 예외 메시지가 포함된 JSON 응답을 생성합니다. 브라우저 클라이언트의 경우 동일한 데이터를 HTML 형식으로 렌더링하는 "화이트라벨" 오류 보기가 있습니다. 기본 동작을 완전히 바꾸려면 ErrorController를 구현하고 해당 유형의 빈 정의를 등록하는 방식이 있는데 해당 방식을 사용였습니다. 

 

 

 

 

 

 

 

 

 

참조 문서

 

 

 

 

+ Recent posts