Olá,
conforme os colegas estão relatando, aparentemente a API alterou o comportamento de consultas a id's inexistentes. Nesse ponto surge uma dúvida: Para esses casos, o correto não seria gerar uma nova versão da API?
Entendo que como é um serviço de terceiro, temos pouco controle sobre isso, mas a dúvida seria mais para quando estivermos desenvolvendo nossa própria API.
Apesar do desafio servir como um aprendizado a todos que estão no curso, acredito que o ideal, e certamente será feito, uma atualização no curso para contornar o problema.
Nesse sentido, tentei também resolver do meu jeito e gostaria de sugestões de possíveis melhorias. Segue meu código:
package net.lucianodacunha.alugames.main
import net.lucianodacunha.alugames.model.Jogo
import net.lucianodacunha.alugames.service.ConsumerAPI
fun main(){
print("Entre com um código de jogo para buscar: ")
val codigo = readln()
var resultadoDaBusca = runCatching {
// pelo que pesquisei, é necessário um cast explícito aqui.
ConsumerAPI.findGame(codigo) as Jogo
}
// Aparentemente, caso falhar, o retorno será um objeto Exception
// nesse caso, imprimo a mensagem de erro.
resultadoDaBusca.onFailure {
print(it.message)
}
resultadoDaBusca.onSuccess {
println("Deseja atribuir uma nova descrição ao jogo [s/N]?")
val resposta = readln()
it.descricao = when (resposta) {
"s" -> {
print("Entre com a descrição desejada: ")
readln()
}
else -> {
it.titulo
}
}
println(it)
}
}
package net.lucianodacunha.alugames.service
import com.google.gson.Gson
import net.lucianodacunha.alugames.model.InfoJogo
import net.lucianodacunha.alugames.model.Jogo
import java.lang.Exception
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
/**
* Deixei static por enquanto mais por questões práticas de testes.
* Acredito que essa não seja a melhor abordagem por outras questões
*/
object ConsumerAPI {
fun findGame(id: String) : Any {
val endpoint = "https://www.cheapshark.com/api/1.0/games?id=$id"
val client: HttpClient = HttpClient.newHttpClient()
val request = HttpRequest.newBuilder()
.uri(URI.create(endpoint))
.build()
val response = client
.send(request, BodyHandlers.ofString())
val json = response.body()
val gson = Gson()
// não consegui implementar outro tipo de tratamento aqui.
return try {
val resultadoDaDeserializacao = gson.fromJson(json, InfoJogo::class.java)
Jogo(
resultadoDaDeserializacao.info.title,
resultadoDaDeserializacao.info.thumb
)
} catch (e: Exception){
throw Exception("Falha ao buscar pelo id. Tente outro...")
}
}
}
Até +.