Запрос HTTP Get с RestTemplate - org.springframework.web.client.ResourceAccessException - PullRequest
0 голосов
/ 26 мая 2020

Я делаю запрос GET, используя RestTemplate в приведенном ниже коде. Запрос отлично работает, если я вызываю его напрямую из chrome / postman. Однако это не работает из кода. Кажется, что игнорируется rootUri

import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.stereotype.Component
import org.springframework.web.client.RestTemplate

@Component
class Provider(
    private val builder: RestTemplateBuilder
) {
    var client: RestTemplate = builder.rootUri("http://foo.test.com/API/rest").build()

    fun sendMessage(request: Request) {

        println("here is the request")
        try {
            val resp = client.getForEntity(
                "?userid=123456&password=1234356&method=TEST_MESSAGE", Response::class.java
            )
        } catch (e: Exception) {
            println("this is the error")
            e.printStackTrace()
        }
    }

}

Это исключение, которое я получаю.

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "": null; nested exception is org.apache.http.client.ClientProtocolException
....
....
Caused by: org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187)
Caused by: org.apache.http.client.ClientProtocolException
....
....
Caused by: org.apache.http.ProtocolException: Target host is not specified
    at org.apache.http.impl.conn.DefaultRoutePlanner.determineRoute(DefaultRoutePlanner.java:71)
    at org.apache.http.impl.client.InternalHttpClient.determineRoute(InternalHttpClient.java:125)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
Caused by: org.apache.http.ProtocolException: Target host is not specified

Полная трассировка в http://collabedit.com/t6h2f

Любая помощь приветствуется. Заранее благодарим.

Edit - Любой способ проверить / распечатать URL-адрес из restTemplate, на котором выполняется запрос на получение?

1 Ответ

1 голос
/ 26 мая 2020

Вы упускаете одну вещь. Если вы посмотрите документацию RestTemplateBuilder.rootUri (..), они устанавливают rootUri в любой запрос, начинающийся с /. но если вы не добавили его, он проигнорирует значение rootUri.

Итак, если вы только измените свой вызов на это, он будет работать:

val resp = client.getForEntity(
                "/?userid=123456&password=1234356&method=TEST_MESSAGE", Response::class.java
            ) 

Ссылка

Обновления:

var client: RestTemplate = builder.rootUri("http://foo.test.com/").build()

    fun sendMessage(request: Request) {

        println("here is the request")
        try {
            val resp = client.getForEntity(
                "/API/rest?userid=123456&password=1234356&method=TEST_MESSAGE", Response::class.java
            )
        } catch (e: Exception) {
            println("this is the error")
            e.printStackTrace()
        }
    }
...