본문 바로가기

개발

[Riot Developer] 스프링부트에서 Riot API로 데이터 추출

닉네임으로 해당 유저의 정보 가져오기

 

Controller 

@PostMapping("/riot/summonerByName")
    public Summoner callSummonerByName(@RequestParam String summonerName){
        summonerName = summonerName.replaceAll(" ","%20");
        Summoner apiResult = riotService.callRiotAPISummonerByName(summonerName);
        return apiResult;
    }

닉네임 입력시 해당 유저의 정보를 끌어옴 + 현재는 profileIconId는 사용하지 않을 것 같아서 받아오지 않는데, 나중에 사용할거면 추가할 예정

 

Service

   public Summoner callRiotAPISummonerByName(String nickname){

        Optional<Summoner> find_summoner = riotRepository.findByNickname(nickname);
        if(find_summoner.isPresent()){
            //log.info("이미 db에 존재");
            return find_summoner.get();
        }

        SummonerDTO result;
        String serverUrl = "https://kr.api.riotgames.com";

        try {
            CloseableHttpClient client = HttpClientBuilder.create().build();
            HttpGet request = new HttpGet(serverUrl + "/lol/summoner/v4/summoners/by-name/" + nickname + "?api_key=" + mykey);
            HttpResponse response = (HttpResponse) client.execute(request);
            if(response.getStatusLine().getStatusCode() != 200){
                // 오류
                return null;
            }

            HttpEntity entity = response.getEntity();
            result = objectMapper.readValue(entity.getContent(), SummonerDTO.class);
            Summoner summoner = result.toEntity();
            riotRepository.save(summoner);
            return summoner;
        } catch (IOException e){
            e.printStackTrace();
            return null;
        }
    }

라이엇에서 제공하는 api를 SummonerDTO형식으로 받아오고, SummonerDTO의 toEntity를 사용해 Summoner db에 저장할 때는 내가 원하는 컬럼만 저장한다.

 

 

테스트 결과 DB:

 

 

puuid로 최근 경기 id 가져오기

 

Controller

    @PostMapping("/riot/match")
    public String[] getMatchInfo(@RequestParam String puuid){
        return riotService.getMatchInfo(puuid);
    }

위에서 얻은 puuid를 입력하면 최근 경기 5판의 id를 얻을 수 있다.

 

 

Service

    public String[] getMatchInfo(String puuid){
        try {
            CloseableHttpClient client = HttpClientBuilder.create().build();
            HttpGet request = new HttpGet("https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/" + puuid +"/ids?type=ranked&start=0&count=5&api_key=" + mykey);
            HttpResponse response = (HttpResponse) client.execute(request);
            HttpEntity entity = response.getEntity();
            String matchIds = EntityUtils.toString(entity);

            String substring = matchIds.substring(2, matchIds.length() - 2); // 양 옆의 [", "] 없애기
            System.out.println(substring);
            String[] matchIdArray = substring.split("\",\"");
//            for (String s : matchIdArray) {
//                System.out.println(s);
//            }
            return matchIdArray;

        } catch (IOException e){
            e.printStackTrace();
            return null;
        }
    }

우선은 경기의 id를 배열형태로 출력만 하는데, 만약 그 경기들의 정보도 같이 리턴하고싶으면 다음에 for문 안에 matchDetailInfo를 넣어준다.

 

 

테스트

 

 

경기 id로 경기 정보 받기

 

Riot API - ResponseBody

{
    "metadata": {
        "dataVersion": "2",
        "matchId": "KR_6654615721",
        "participants": [
            "N3IdH3P5AFpt2nJ5DRGkw0gJF2IMrdH8YiuyTEwxwx3ctJyIcbrUNoGdbP0oAtSudLGi--qmtkJLrA",
            "4R_EE52N--p5f58N0OroN_dRoHBPHHSmLewgBK7f1Hyxn1_U6c4sXtPSFlMoebwRvRV4BEIV-F7Kgg",
            "_lY3koy_l_a00gEaSjh98ROMkzZGC4CX-eiF6n5YxtL-bnKjjkUbB_9wJ6zMFeugm9DbfeZOc9j-Vg",
            "VC-U-mnqEqVE-p0_ULnIB0UrOLkwZ9JAN71Ax1swx6ILkkJ0e9XIc6h2TNa2M0OIVDCiOO1wn1-kyw",
            "iwA0Qygpv_Dscw5Yu9uozKGGgus-WiUy9b78rT1lEI7KfmtpReR5Xvl4KerFMUYxhe6BnV8oMUGnYA",
            "oiE5B9H__DHwJtZfMj3CExHcxl0-zQFAUs0NffAEOQsxsk-cdZEEAkyuq_ix9VFNHYbGcNgxlwoIEA",
            "IcDNiZcFgltqF9n54dmEJLSQht7QrjHr2x9xAM8R9vh9Rw-ocuQqNME3qhYR0UitbnP0Ngag9J5tgw",
            "6LVmq4ZauB09Bkc-rpbb0LWaEdRe64TWEZEl5ftb-tZE4jfzs2gZfpkKjJHOQ51F-HCmBbti38aNrA",
            "vE8RX81evkZycWEgvegcMxbTNs8Noza--yEL92ZLJCTaEtgAdhBoG0ycudIPt6HYih_rTPnNlK0Xog",
            "PHRUL4IciG8SLtNf_EAWL3s5SHSkymUovsA1Z4-q4jaFwvydTMx0rG_JhFe0FvSdUrLfIYllXKoldw"
        ]
    },
    "info": {
        "gameCreation": 1692124317188,
        "gameDuration": 2411,
        "gameEndTimestamp": 1692126744397,
        "gameId": 6654615721,
        "gameMode": "CLASSIC",
        "gameName": "teambuilder-match-6654615721",
        "gameStartTimestamp": 1692124333440,
        "gameType": "MATCHED_GAME",
        "gameVersion": "13.15.524.1760",
        "mapId": 11,
        "participants": [
            {
                "allInPings": 0,
                "assistMePings": 0,
                "assists": 17,
                "baitPings": 0,
                "baronKills": 0,

몇 천줄이 되는 게임 정보 중 내가 원하는 정보만 뽑아 올 예정

 

 

Controller

    @PostMapping("/riot/game")
    public JsonObject getGameInfo(@RequestParam String matchId) throws IOException, ParseException {
        return riotService.matchDetailInfo(matchId);
    }

해당 경기의 정보를 리턴해주는 컨트롤러

 

 

Service

    public JsonObject matchDetailInfo(String matchId) throws IOException, ParseException {

        CloseableHttpClient client = HttpClientBuilder.create().build();
        HttpGet request = new HttpGet("https://asia.api.riotgames.com/lol/match/v5/matches/" + matchId +"?api_key=" + mykey);
        HttpResponse response = (HttpResponse) client.execute(request);
        HttpEntity entity = response.getEntity();
        String matchInfo = EntityUtils.toString(entity);

        JSONParser parser = new JSONParser();
        Object obj = parser.parse(matchInfo);
        JSONObject jsonObj = (JSONObject) obj;

//        JSONObject jso = (JSONObject) jsonObj.get("metadata");

        JSONObject info = (JSONObject) jsonObj.get("info");
        JSONArray participants = (JSONArray) info.get("participants");

        JsonObject jsonobject = new JsonObject();
        jsonobject.addProperty("gameMode", String.valueOf(info.get("gameMode")));
        jsonobject.addProperty("gameDuration", String.valueOf(info.get("gameDuration")));
        JsonArray infoArray = new JsonArray();
        for (int i=0; i< participants.size(); i++) {
            JSONObject participant = (JSONObject) participants.get(i);
            JsonObject userInfo = new JsonObject();
            userInfo.addProperty("summonerName", (String) participant.get("summonerName"));
            userInfo.addProperty("championName", (String) participant.get("championName"));
            userInfo.addProperty("champLevel",String.valueOf(participant.get("champLevel")));
            userInfo.addProperty("individualPosition", (String) participant.get("individualPosition"));
            userInfo.addProperty("kills",String.valueOf(participant.get("kills")));
            userInfo.addProperty("deaths",String.valueOf(participant.get("deaths")));
            userInfo.addProperty("assists",String.valueOf(participant.get("assists")));
            userInfo.addProperty("totalDamageDealtToChampions",String.valueOf(participant.get("totalDamageDealtToChampions")));
            userInfo.addProperty("totalDamageTaken",String.valueOf(participant.get("totalDamageTaken")));
            userInfo.addProperty("goldEarned",String.valueOf(participant.get("goldEarned")));
            userInfo.addProperty("item0",String.valueOf(participant.get("item0")));
            userInfo.addProperty("item1",String.valueOf(participant.get("item1")));
            userInfo.addProperty("item2",String.valueOf(participant.get("item2")));
            userInfo.addProperty("item3",String.valueOf(participant.get("item3")));
            userInfo.addProperty("item4",String.valueOf(participant.get("item4")));
            userInfo.addProperty("item5",String.valueOf(participant.get("item5")));
            userInfo.addProperty("item6",String.valueOf(participant.get("item6")));
            userInfo.addProperty("wardsPlaced",String.valueOf(participant.get("wardsPlaced")));
            userInfo.addProperty("wardsKilled",String.valueOf(participant.get("wardsKilled")));
            infoArray.add(userInfo);
            jsonobject.add("users", infoArray);
        }
        return jsonobject;
    }

api를 통해 받은 정보를 Json형태로 변경하는 데 오래걸렸다. 

VO를 만들어서 받기에는 정보가 너무 많아서 EntityUtils를 통해 String형으로 받고 그걸 Object로 변경해서 그걸 또 JsonObject로 받는다.. (더 편한 방법이 있을 것 같은데 나는 못찾겠다..) 찾아보니 Map형식으로 받는 것도 가능할 것같은데 다음에 사용해보자..

https://itrh.tistory.com/76

Json 형식으로 출력하는 건 이 블로그에서 도움을 받았다.

 

그래서.. Json 형식으로 출력을 하려는데 에러 발생 ㅠㅠ

2023-08-16T17:30:33.341+09:00  WARN 92510 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: JsonObject]

 

application.yml

spring:
  mvc:
    converters:
      preferred-json-mapper: gson

추가해주니 정상적으로 작동했다 ㅎㅎ

 

 

테스트: 


스웨거 정리 완료!