SpringBoot/개인프로젝트

트위치 API 채널 검색 결과를 받아오는 과정에서의 문제

ewok 2023. 5. 1. 12:55

트위치 API로 채널 검색 결과를 받아오려고 하는데 제대로 작동이 되지 않았다.

 

public List<ChannelData> getChannelSearchResult(String streamer) {
    String accessToken = getAccessToken();
    if (!isAccessTokenValid(accessToken)) {
        accessToken = reGetAccessToken();
    }

    HttpHeaders headers = new HttpHeaders();
    headers.setBearerAuth(accessToken);
    headers.set("Client-Id", clientId);

    HttpEntity<?> httpEntity = new HttpEntity<>(headers);
    
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://api.twitch.tv/helix/search/channels")
                .queryParam("query", streamer);

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<LinkedHashMap> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, httpEntity, LinkedHashMap.class);
    LinkedHashMap data = response.getBody();
    ArrayList list = (ArrayList) data.get("data");
    List<ChannelData> channelData = channelListToChannelData(list);
    return channelData;
}

 

https://dev.twitch.tv/docs/api/reference/#search-channels

 

Reference

Twitch Developer tools and services to integrate Twitch into your development or create interactive experience on twitch.tv.

dev.twitch.tv

 

query라는 파라미터로 검색어를 보낼 때 URI 인코딩을 해야 한다고 나와있다. 그래서 URI 인코더로 인코딩 해서 요청했는데도 여전히 결과를 못가져왔다.

 

이유는 UriComponentsBuilder에서 fromHttpUrl()이 인코딩을 해주고 또 restTemplate이 또 인코딩을 해주어서 두번 되었기 때문이다. 심지어 인코딩이 아예 안된줄 알고 URI 인코더로 직접 인코딩 해주어서 세번까지 되었다.

 

그래서 restemplate에서만 인코딩이 되도록 바꿔주었다.

 

public List<ChannelData> getChannelSearchResult(String streamer) {
    String accessToken = getAccessToken();
    if (!isAccessTokenValid(accessToken)) {
        accessToken = reGetAccessToken();
    }

    HttpHeaders headers = new HttpHeaders();
    headers.setBearerAuth(accessToken);
    headers.set("Client-Id", clientId);

    HttpEntity<?> httpEntity = new HttpEntity<>(headers);

    URI uri = UriComponentsBuilder.fromHttpUrl("https://api.twitch.tv/helix/search/channels")
            .queryParam("query", streamer)
            .build().toUri();

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<LinkedHashMap> response = restTemplate.exchange(uri, HttpMethod.GET, httpEntity, LinkedHashMap.class);
    LinkedHashMap data = response.getBody();
    ArrayList list = (ArrayList) data.get("data");
    List<ChannelData> channelData = channelListToChannelData(list);
    return channelData;
}

UriComponentsBuilder 대신 URI를 사용하였고 이것을 resTemplate.exchange()에서 인코딩 되도록 하여 한번만 인코딩 되도록 바꾸었더니 제대로 정보를 받아올 수 있었다.

 

 

 

참고

https://findmypiece.tistory.com/176

 

UriComponentsBuilder

URL 에는 사용할 수 있는 문자가 제한되어 있기 때문에 한글과 일부 특수문자, 공백 등의 문자들이 포함될 경우 반드시 인코딩을 해줘야 한다. 일반적으로 RestTemplate 나 브라우저 같은 클라이언트

findmypiece.tistory.com