Почему ЗДЕСЬ API отвечает с пустым «View» на действительный URL-запрос? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь вызвать ЗДЕСЬ 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.

...