Spring RestTemplate не использует полный URL - PullRequest
2 голосов
/ 07 апреля 2020

Я пытаюсь использовать Google Places API с помощью шаблона отдыха. Все работает отлично, за исключением использования маркера страницы для получения постраничных результатов. Маркер страницы является очень длинной строкой, и я попытался зарегистрировать URL и распечатать его. Если я скопирую и вставлю зарегистрированный URL-адрес и попробую его в браузере, он будет работать нормально, но API-запрос остальных шаблонов будет определен как недопустимый.

@ResponseBody
    @GetMapping("/nearby")
    public String nearbyController(@RequestParam String keyword, @RequestParam String location, @RequestParam String type, @RequestParam String radius, @RequestParam(defaultValue = "") String pagetoken) throws RestClientException, URISyntaxException {
        final String uri = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=Key_Here&keyword=" + keyword + "&type=" + type + "&radius=" + radius + "&location=" + location + "&pagetoken=" + pagetoken;
        RestTemplate restTemplate = new RestTemplate();
        logger.info(uri);
        String result = restTemplate.getForObject(new URI(uri), String.class);
        return result;
    }

Обычные запросы выполняются нормально, но при наличии маркера страницы, который представляет собой очень длинную строку, например

"CsQCQAEAALL-mDkGLJnijEldNf7CbsrkWX_a2SizcU-i60AkJrb20EFAnNMb8Pgm4wYrRQ1bXMOEm1dYbxxojJm14p43cDVylw_6X6RU-5p7hoLI5N3LJ_DMERR_Wwc_n08EeIf4xLk1ZJUJtmEVuAHvDHBf68VALb7RBXvurykkfN4Gb6fUFCQ0xmIhSAGaW9BAtB08Z6EsYdk8HhiRzgswUE4XuA6LBaQguldJXmo5SxJjqC8x5HCfeL3ZzG_DNAbhrx8ozlfDPUYLQk415mO1pw2SJeCAbfogrgaNvqPO1LnhuCzOW6wphB_y9401QwUhtVqwen0-yCJgOHju9Ow0ihJM9ht6k3PjMKDzxkUey4i7Xw8L9dP9zv3IquA3lzaOOgCdqkZ5U37XohJ78PbUWTh55-1eUf1sH04GHs1RWTbzoJbwEhB06aFckoVAbM7Oiz1zAj2YGhT0JEcQ02V7RuH95-a-dcHFew5a3A"

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

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Почему вы не используете json в качестве формата отправки клиента, а на стороне сервера вы можете использовать данные тела запроса, используя аннотацию @Requestbody.

В вашем приложении вы пытаетесь отправить данные на сервер, используя параметр запроса, который не позволяет вам отправлять строку, которая имеет большую длину.

Пожалуйста, попробуйте отправить данные в формате json на серверную часть со стороны клиента. Это один из стандартных способов связи с клиентом и сервером в остальных приложениях.

И, альтернативно, вы можно использовать restTemplate.exchange() метод. Как использовать этот метод с параметром запроса, вы можете проверить этот пост . Это хорошо объяснено.

0 голосов
/ 07 апреля 2020

Проблема заключалась в том, что я слишком рано запрашивал следующую страницу. Ничего общего с Spring или Rest Template. Нашел ответ здесь

{ ссылка }

0 голосов
/ 07 апреля 2020

Попробуйте это:

@ResponseBody
@GetMapping("/nearby")
public String nearbyController(@RequestParam String keyword, @RequestParam String location, @RequestParam String type, @RequestParam String radius, @RequestParam(defaultValue = "") String pagetoken) throws RestClientException, URISyntaxException {
    final String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json";
    Map<String, String> params = new HashMap<>();
    params.put("key", "Key_Here");
    params.put("keyword", keyword);
    params.put("type", type);
    params.put("radius", radius);
    params.put("location", location);
    params.put("pagetoken", pagetoken);

    HttpEntity httpEntity = new HttpEntity(headers);
    RestTemplate restTemplate = new RestTemplate();

    logger.info(url);
    String result = restTemplate.getForObject(url, String.class, httpEntity);
    return result;
}
...