Я пытаюсь вызвать ЗДЕСЬ API геокодера, но при действительном вызове URL тело ответа инициализируется не полностью.
Как показано ниже, я просто вызываю API, предоставляющий действительный URL:
val url = UriComponentsBuilder.fromUriString(properties.geocodeUrl)
.queryParam("app_id", properties.appId)
.queryParam("app_code", properties.appCode)
.queryParam("searchtext", "10 Downing Street, London")
.toUriString()
logger.debug("calling geocoder rest service: $url")
val geocoderResponse = RestTemplate().getForObject<GeocoderResponse>(url)
GeocoderResponse
package com.gudjob.geolocation
import com.fasterxml.jackson.annotation.JsonProperty
import com.gudjob.core.domain.Coordinates
import java.io.Serializable
/**
* @author Elia Sgolmin
*/
internal data class GeocoderResponse(
@field:JsonProperty("Response")
var response: Response?
) : Serializable {
data class Response(
@field:JsonProperty("View")
var views: List<View>
) : Serializable {
data class View(
@field:JsonProperty("Result")
var results: List<Result>
) : Serializable {
data class Result(
@field:JsonProperty("Location")
var location: Location?
) : Serializable {
data class Location(
@field:JsonProperty("DisplayPosition")
var displayPosition: DisplayPosition?
) : Serializable {
data class DisplayPosition(
@field:JsonProperty("Latitude")
var latitude: Double?,
@field:JsonProperty("Longitude")
var longitude: Double?
) : Serializable {
fun toCoordinates(): Coordinates {
val lat = latitude
val lon = longitude
return if (lat == null || lat.isNaN() || lon == null || lon.isNaN())
Coordinates.Unavailable
else
Coordinates.Available(lat, lon)
}
}
}
}
}
}
}
Если я скопирую зарегистрированный URL и использую его в браузере или почтальоне, я получаю следующий ожидаемый ответ
{
"Response":{
"MetaInfo":{
"Timestamp":"2019-02-26T14:03:09.236+0000"
},
"View":[
{
"_type":"SearchResultsViewType",
"ViewId":0,
"Result":[
{
"Relevance":1,
"MatchLevel":"houseNumber",
"MatchQuality":{
"City":1,
"Street":[
1
],
"HouseNumber":1
},
"MatchType":"pointAddress",
"Location":{
"LocationId":"NT_lWsc8knsFwVitNTFX88zmA_xAD",
"LocationType":"point",
"DisplayPosition":{
"Latitude":51.50341,
"Longitude":-0.12765
},
"NavigationPosition":[
{
"Latitude":51.50322,
"Longitude":-0.12767
}
],
"MapView":{
"TopLeft":{
"Latitude":51.5045342,
"Longitude":-0.129456
},
"BottomRight":{
"Latitude":51.5022858,
"Longitude":-0.125844
}
},
"Address":{
"Label":"10 Downing Street, London, SW1A 2AA, United Kingdom",
"Country":"GBR",
"State":"England",
"County":"London",
"City":"London",
"District":"Westminster",
"Street":"Downing Street",
"HouseNumber":"10",
"PostalCode":"SW1A 2AA",
"AdditionalData":[
{
"value":"United Kingdom",
"key":"CountryName"
},
{
"value":"England",
"key":"StateName"
},
{
"value":"London",
"key":"CountyName"
}
]
}
}
}
]
}
]
}
}
Как видите, атрибут «Вид» объекта «Ответ» - это массив с одним объектом, содержащим широту и долготу данного адреса.
Вместо этого я получаю
GeocoderResponse (response = Response (views = []))
, где response
инициализирован, но views
пуст.
Изменениемой код для получения ответа JSON в виде простого текста с
restTemplate().getForObject<String>(url)
приводит к следующему json
{"Response": {"MetaInfo": {"Timestamp": "2019-02-26T13: 35: 37.851 + 0000 "}," View ": []}}
Даже здесь "View"
свойство пусто, поэтому я не думаю, что проблемао десериализации JSON.
Есть какие-нибудь предложения?
ОБНОВЛЕНИЕ
Я проверил RestTemplate
заголовки запросов по сравнению с браузерами и почтальонами, но не смог найти никакой существенной разницы.
Единственное, на что я могу обратить внимание, это почтальон response header Content-Encoding → gzip , который отсутствует в ответе Spring.