트위치 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
'SpringBoot > 개인프로젝트' 카테고리의 다른 글
기능 구현 : 댓글 삭제 (0) | 2023.05.01 |
---|---|
Ajax가 작동이 되지 않는 문제 (0) | 2023.05.01 |
AWS EC2 https 적용 (1) | 2023.05.01 |
AWS 설정 (0) | 2023.05.01 |
Summernote 적용 (0) | 2023.05.01 |