Геокодирование запросов к HERE API случайно завершается неудачей - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь геокодировать адреса с помощью ЗДЕСЬ API. Я не свободный план. Я пытаюсь следующий код (Spring Boot в Kotlin):

override fun geocode(address: Address): Coordinate? {
        val uriString = UriComponentsBuilder
            .fromHttpUrl(endpoint)
            .queryParam("app_id", appId)
            .queryParam("app_code", appCode)
            .queryParam("searchtext", addressToSearchText(address))
            .toUriString()
        logger.info("Geocode requested with url {}", uriString)
        val response = restTemplate.getForEntity(uriString, String::class.java)
        return response.body?.let {
            Klaxon().parse<GeocodeResponse>(it)
        }?.let {
            it.Response.View.firstOrNull()?.Result?.firstOrNull()
        }?.let {
            Coordinate(
                latitude = it.Location.DisplayPosition.Latitude,
                longitude = it.Location.DisplayPosition.Longitude
            )
        }.also {
            if (it == null) {
                logger.warn("Geocode failed: {}", response.body)
            }
        }
    }

Оказалось, что когда я вызываю этот метод много раз подряд, некоторые запросы возвращают пустые ответы, например:

{  
   "Response":{  
      "MetaInfo":{  
         "Timestamp":"2019-04-18T11:33:17.756+0000"
      },
      "View":[  

      ]
   }
}

Я не мог понять ни одного правила, почему некоторые запросы не выполняются. Кажется, это просто случайно.

Однако, когда я пытаюсь вызвать те же URL-адреса с curl в моем браузере, все работает просто отлично.

Полагаю, что количество запросов в секунду ограничено, но я не смог найти ничего в ЗДЕСЬ документации.

Кто-нибудь имеет представление о пределе? Или это может быть что-то еще?

1 Ответ

1 голос
/ 23 апреля 2019

На самом деле, была проблема с моим кодом. Запросы не выполнялись для адресов, имеющих «специальные» символы, такие как ü и ö. Проблема была с запросом на создание URL-адреса

val uriString = UriComponentsBuilder
            .fromHttpUrl(endpoint)
            .queryParam("app_id", appId)
            .queryParam("app_code", appCode)
            .queryParam("searchtext", addressQueryParam(address))
            .build(false)  // <= this was missed
            .toUriString()
...