Olá, estou fazendo o desafio: Catálogo de Livros, e é um dos requisitos que todos os livros consultados serem salvos no banco de dados, porém todos os títulos de livro que eu testo para a API buscar que contenham acentos ou ''ç'' (Como O Cortiço) ela simplesmente não retorna resultado algum, mesmo esse livro constando na API... Como resolver esse impasse? Em meu código já tentei muitas coisas, mas nada está dando certo, Já mudei a configuração da IntelliJ incluindo: -Dfile.encoding=UTF-8 e também não deu certo. Abaixo está o código do local onde acho que precisará de novas configurações.
obs: não há problemas em digitar títulos com letras maiúsculas e minúsculas
Tenho verificado e meu código parece traz uma URL com problema (para o livro O Cortiço) : https://gutendex.com/books?search=o+cortico
Aqui tenho uma URL que funciona (para o livro O Cortiço): https://gutendex.com/books/?search=o+cortiço
Elas são diferentes... /books/?
Abaixo parte do meu código:
package br.com.sheila.bookcatalog.client;
import br.com.sheila.bookcatalog.dto.BookDTO;
import br.com.sheila.bookcatalog.dto.GutendexResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.Normalizer;
@Service
public class GutendexClient {
private final RestTemplate restTemplate = new RestTemplate();
public BookDTO buscarLivroPorTitulo(String tituloOriginal) {
//Normaliza o título
String tituloParaBusca = Normalizer.normalize(tituloOriginal, Normalizer.Form.NFD)
.replaceAll("\\p{M}", "")
.toLowerCase();
//Codifica a URL com o título normalizado
String url = "https://gutendex.com/books?search=" + URLEncoder.encode(tituloParaBusca, StandardCharsets.UTF_8);
ResponseEntity<GutendexResponse> resposta = restTemplate.getForEntity(url, GutendexResponse.class);
GutendexResponse body = resposta.getBody();
if (body != null && body.results() != null && !body.results().isEmpty()) {
// A comparação adicional ainda é útil para refinar os resultados localmente
// caso a API retorne algo próximo, mas não exato.
String tituloUsuarioNormalizado = Normalizer.normalize(tituloOriginal, Normalizer.Form.NFD)
.replaceAll("\\p{M}", "")
.toLowerCase();
return body.results().stream()
.filter(dto -> {
String tituloDtoNormalizado = Normalizer.normalize(dto.title(), Normalizer.Form.NFD)
.replaceAll("\\p{M}", "")
.toLowerCase();
return tituloDtoNormalizado.contains(tituloUsuarioNormalizado);
})
.findFirst()
.orElse(body.results().get(0));
}
return null;
}
}