Проблема с RestTemplate при включении URL-адресов в запрос REST API - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь получить данные из REST API Botify, чтобы использовать их внутри проекта, который также является REST API. Я использую экземпляр класса RestTemplate класса Spring для фактических запросов к Botify, в частности, к методу .exchange, так как мне нужно передать ключ Botify в качестве параметра заголовка.

Моя проблема возникает, когда мне нужно вызвать метод конечной точки, который принимает URL-адрес как часть URI запроса (а не параметра). Документация этой конечной точки находится в https://developers.botify.com/api/reference/#!/Analysis/getUrlDetail

В основном структура запросов выглядит следующим образом:

/ анализ / {имя пользователя} / {project_slug} / {analysis_slug} / URLs / {URL}

Последняя часть этого URI является URL-адресом, который необходимо кодировать в UTF-8, чтобы можно было отделить его от фактического запроса.

Проблема в том (я считаю), что метод .exchange всегда кодирует запрос, поэтому я пытаюсь отправить так:

/ анализ / MyUserName / myprojectname / myprojectslug / URLs / HTTPS% 3A% 2F% 2Fwww.example.com

... заканчивается так:

/ анализы / MyUserName / myprojectname / myprojectslug / URLs / HTTPS% 253A% 252F% 252Fwww.example.com '

Что, очевидно, не работает. Это выдержка из метода, который делает вызов Botify:

public String callBotifyEndpoint(String reportType, String parameters) throws UnsupportedEncodingException {
    String request = this.baseUri + "/analyses/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com"

    HttpHeaders headers = new HttpHeaders();
    headers.set("Authorization", "Token " + this.apiKey);
    HttpEntity<String> entity = new HttpEntity<>(headers);

    UriComponentsBuilder botifyQueryBuilder = UriComponentsBuilder.fromUriString(request);      
    String queryStringBuild = botifyQueryBuilder.build(true).toUriString();

    String botifyResult = null;

    try {
        System.out.println("Calling Botify API: " + queryStringBuild);
        ResponseEntity<String> response = botifyTemplate.exchange(queryStringBuild, HttpMethod.GET, entity, String.class);
        if(response.hasBody()) {
            botifyResult = response.getBody();
        }
    } catch(RestClientException ex) {
        ex.printStackTrace();
    }
    try {

    } catch (Exception e) {
        // TODO: handle exception
    }

    return botifyResult;    
}

В этой строке:

    botifyQueryBuilder.build(true).toUriString();

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

Я удалил фактический процесс генерации запроса (вместе с именем моего пользователя и проекта), чтобы упростить процесс, но это должно вернуть ответ от Botify с существующими данными для этого URL.

Вместо этого он возвращает ошибку 400 неверных запросов (что имеет смысл, поскольку URL-адрес неверен).

Мне кажется, что это может быть ошибкой в ​​методе Restexemplate .exchange, но, возможно, я его не правильно использую. Есть предложения?

1 Ответ

1 голос
/ 17 июня 2019

Не кодируйте преждевременно, как здесь:

String request = this.baseUri + "/analyses/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com";

Используйте функцию заполнителей параметров в RestTemplate вместо конкатенации текста.

См.: Spring RestTemplate GET с параметрами

...