Spring RestTemplate GET-запрос возвращает статус 302 - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь использовать сторонний REST API с помощью компонента RestTemplate Spring. Я попытался ввести тот же запрос на внешнем клиенте REST API (Почтальон), используя тот же URI и пользовательские заголовки, и я могу получить правильные данные.

Однако, когда я попытался отразить точный запрос используя RestTemplate, он возвращает мне

        <html><head>
        <title>302 Found</title>
        </head><body>
        <h1>Found</h1>
        <p>The document has moved <a href="https://address/{path of endpoint}">here</a>.</p>
        <hr>
        <address>Apache/2.4.7 (Ubuntu) Server at address Port 80</address>
        </body></html>

Это пример кода, который я использую:

        String uri = "http://address/{path of endpoint}";
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.set(someCustomHeaderKey, someCustomHeaderValue);
        HttpEntity<String> entity = new HttpEntity<String>(headers);
        ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);

Я прочитал, что java не позволяет перенаправить с одного протокола на другой, например, с http на https и наоборот. Потребуется некоторая помощь в подходе по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Я попробовал ваш код на моей локальной машине, и все, кажется, хорошо. Код состояния 302 указывает, что ваше местоположение URI отличается. в соответствии с вашим примером, вы должны использовать https вместо Http в URI

Я попробовал ваш код, как показано ниже

String uri = "https://jsonplaceholder.typicode.com/todos/1";
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.set("link", "http/:");
    HttpEntity<String> entity = new HttpEntity<String>(headers);
    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, 
    entity, String.class);
    System.out.println(response);

вывод на консоль

<200,{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
},[Date:"Thu, 12 Mar 2020 03:45:44 GMT", Content-Type:"application/json; charset=utf-8", Content-Length:"83", Connection:"keep-alive", Set-Cookie:"__cfduid=d3104b8bbd25cbcb802977fc9183d559e1583984744; expires=Sat, 11-Apr-20 03:45:44 GMT; path=/; domain=.typicode.com; HttpOnly; SameSite=Lax", X-Powered-By:"Express", Vary:"Origin, Accept-Encoding", Access-Control-Allow-Credentials:"true", Cache-Control:"max-age=14400", Pragma:"no-cache", Expires:"-1", X-Content-Type-Options:"nosniff", Etag:"W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"", Via:"1.1 vegur", CF-Cache-Status:"HIT", Age:"1747", Accept-Ranges:"bytes", Expect-CT:"max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"", Server:"cloudflare", CF-RAY:"572a862eab83d5e8-BOM"]>
0 голосов
/ 12 марта 2020

RestTemplate будет следовать перенаправлениям по умолчанию, но не в том случае, если протокол отличается, что является ситуацией, которую вы видите (перенаправление с http на https).

Для более полного объяснения и кода, который делает см. HTTPURLConnection не следует за редиректом с HTTP на HTTPS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...