Как выполнить обмен метода для RestTemplate, чтобы не изменять URI - PullRequest
0 голосов
/ 24 мая 2018

Чтобы получить Json Content из API Rest xwiki, я использовал метод RestTemplate RestTemplate.exchange (..), но получаю ошибку 404 not found.Uri содержит% 2520 вместо% 20.

Здесь Мой код:

public static void main(String[] args) throws IOException{   
    private static final String link = "http://swininducasa02.ptx.fr.sopra:8080/xwiki-enterprise-web-8.4.5/rest/wikis/xwiki/spaces/Main/spaces/PIC/spaces/Serveur%20de%20virtualisation/spaces/Serveur%20de%20Marcoussis/spaces/choix/spaces/SGBFV/pages/WebHome";
    String plainCreds = "user:passwd";
    byte[] plainCredsBytes = plainCreds.getBytes();
    byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
    String base64Creds = new String(base64CredsBytes);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic " + base64Creds);
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

    RestTemplate restTemplate = new RestTemplate();
    System.out.println("Begin /GET request!");
    HttpEntity<String> request = new HttpEntity<>(headers);
    ResponseEntity<String> response = restTemplate.exchange(link+ "?media=json", HttpMethod.GET, request, String.class);
    Map<String, String> map = new ObjectMapper().readValue(response.getBody(), Map.class);
    System.out.println( map.get("content"));
}

Я искал и обнаружил, что проблема относится к типу содержимого.Я перепробовал все следующие строки, но он все еще не работает.

headers.add ("Content-type", MediaType.APPLICATION_JSON_UTF8_VALUE);

headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
UriComponents uriComponents = UriComponentsBuilder.fromPath(link).build(true);
URI uri= uriComponents.toUri();

Вот ссылка, по которой яхочу получить доступ:

http://swininducasa02.ptx.fr.sopra:8080/xwiki-enterprise-web-8.4.5/rest/wikis/xwiki/spaces/Main/spaces/PIC/spaces/Serveur%20de%20virtualisation/spaces/Serveur%20de%20Marcoussis/spaces/choix/spaces/SGBFV/pages/WebHome?media=json

Но мой запрос собирается:

http://swininducasa02.ptx.fr.sopra:8080/xwiki-enterprise-web-8.4.5/rest/wikis/xwiki/spaces/Main/spaces/PIC/spaces/Serveur%2520de%2520virtualisation/spaces/Serveur%2520de%2520Marcoussis/spaces/choix/spaces/SGBFV/pages/WebHome?media=json

Символ% 20 становится% 2520.Я использовал exchange, потому что мне нужно установить заголовки Auth

Пожалуйста, вы можете мне помочь?

1 Ответ

0 голосов
/ 24 мая 2018

exchange(...) кодирует ваш URI во второй раз.Попробуйте вместо этого создать URI, используя UriComponentsBuilder.build(true) (true говорит о том, что ваш URI уже закодирован).Я вижу в вашем посте, что вы говорите, что пытались это сделать, но похоже, что вы преобразовали его обратно в строку при передаче его в exchange(), что, вероятно, в любом случае привело к тому, что оно было закодировано во второй раз.

UriComponents uriComponents = UriComponentsBuilder.fromPath(link).queryParam("media","json").build(true);
URI uri= uriComponents.toUri();

или

UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(path + "?media=json").build(true);

тоже должно быть в порядке.И затем, чтобы использовать это, сделайте

ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, request, String.class);

вместо

ResponseEntity<String> response = restTemplate.exchange(uri.toString()+ "?media=json", HttpMethod.GET, request, String.class);
...