ClimaTempo API - Cities with accent give error

4

I have the following Endpoint where you get the name of the city and state in the URI:

@RequestMapping(value= "/clima/{nomeCidade}/{ufCidade}/agora",  method = {RequestMethod.GET, RequestMethod.OPTIONS} , produces="application/json" )
public ResponseEntity<Clima> getClimaAgoraByNomeCidade(@PathVariable(value = "nomeCidade") String nomeCidade,  @PathVariable(value = "ufCidade") Estado ufCidade) throws JSONException, ParseException, java.text.ParseException {

    JSONObject detCidade = new JSONObject();
    ClimaTempoAPI ct = new ClimaTempoAPI();     

    String newNomeCidade = nomeCidade.toLowerCase().replace(" ", "%20");
    String weatherEndpoint = "/api/v1/locale/city?name=" + newNomeCidade + "&state=" + ufCidade.toString();
    Long idCidade;

    Integer findRegCidade = climaRepository.findCountCidade(ufCidade, nomeCidade);

    // Se a cidade existir no banco
    if(findRegCidade != 0) {

        // Atribuir o idCidade da cidade e fazer requisi�ao no banco
        idCidade = climaRepository.findTop1IdCidade(ufCidade, nomeCidade);

    // Se nao existir a cidade no banco, gravar a cidade e fazer a requisicao   
    } else {

        try {
            detCidade = ct.RequestWeather(weatherEndpoint);
        } catch (IOException e) {
            e.printStackTrace();
        }

        CidadeCT cidadeCT = new CidadeCT();
        cidadeCT.setId((long) System.currentTimeMillis());
        cidadeCT.setCodPais(detCidade.get("country").toString().trim());
        cidadeCT.setNomeCidade((String) detCidade.get("name"));
        idCidade = (Long) detCidade.get("id");
        cidadeCT.setIdCidade(idCidade);
        cidadeCT.setEstado(Enum.valueOf(Estado.class, detCidade.get("state").toString()));  
        cidadeCTRepository.save(cidadeCT);  

    }       

    return getClimaAgora(idCidade);


}

The ct.RequestWeather () method is as follows:

public JSONObject RequestWeather(String weatherEndpoint) throws IOException, JSONException, ParseException {

    String appToken = "&token=xxx";     

    URL weatherDomain = new URL("http://apiadvisor.climatempo.com.br" + weatherEndpoint + appToken);

    return ConnectionJson.returnJson(weatherDomain, true);

}

And my AJAX call on the Front-End .js is as follows:

var uf = $("#colWeather #selectState").val();
var city = $("#colWeather #selectCity").val();    

//Send a request to the ClimaTempo Endpoint
$.ajax({
    url: host + '/clima/' + city + '/' + uf + '/agora',
    type: 'GET',
    contentType: "application/json",
    async: true
}).done(function (JSONReturn) {

      //Algumas ações aqui

});

When the city name has NO accent, it can normally pick up current weather data. But city with an accent (for example: Avaí-SP, Arujá-SP) I'm getting a 500 error:

   {
"timestamp":1530038926783,
"status":500,
"error":"Internal Server Error",
"exception":"org.json.simple.parser.ParseException",
"message":"No message available",
"path":"/clima/Altin%C3%B3polis/SP/agora"
}

What am I doing wrong that city with an accent is always giving trouble?

DETAIL: LOCALHOST is working perfectly! But when I upload to the server these cities with an accent do not work.

    
asked by anonymous 26.06.2018 / 21:08

1 answer

2

I solved CODING the name City that I get via get BEFORE sending to the WeatherTime Endpoint. It looks like this:

//Encode the nomeCidade to send to the ClimaTempo Endpoint
//(This must be done because of the accents)

String newNomeCidade = nomeCidade.toLowerCase();
try {
    newNomeCidade = URLEncoder.encode(newNomeCidade, "UTF-8");
} catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
    e1.printStackTrace();
}       
JSONObject climaCidade = new JSONObject();
ClimaTempoAPI ct = new ClimaTempoAPI();

String weatherEndpoint = "/api/v1/locale/city?name=" + newNomeCidade + "&state=" + ufCidade.toString();
climaCidade = ct.RequestWeather(weatherEndpoint, appToken.getKey());

I used the "City.toLowerCase ()" because, for some reason, if the first letter of the city name had an accent and was a capital letter, the ClimaTempo API endpoint returned an exception, which was only solved if it were anything small .

    
29.06.2018 / 16:06