Невозможно установить ContentType для HttpClient в микронавтом - PullRequest
0 голосов
/ 03 октября 2018

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

В основном мне нужно отправить сообщение с Content-Type: application / x-www-form-urlencoded

Это мой интерфейс

@Client("${keycloak.base-url}/")
public interface IKeycloakClient {

    @Post(value="/auth/realms/master/protocol/openid-connect/token", processes = { MediaType.APPLICATION_JSON,MediaType.APPLICATION_FORM_URLENCODED })
    public AuthenticationData getToken(@Body Map<String,String> body);
    public void createUser();

    public class AuthenticationData {
        private String accessToken;

        public String getAccessToken() {
            return this.accessToken;
        }

        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }
    }
}

Я создаю тело следующим образом

HashMap<String, String> body = new HashMap<>();
body.put("client_id", "admin-cli");
body.put("grant_type", "password");
body.put("username", kConfiguration.getAdminUser());
body.put("password", kConfiguration.getAdminSecret());
IKeycloakClient.AuthenticationData token = kc.getToken(body);

Когда я вызываю метод kc.getToken(body), я вижу вызов трассировки:

DEBUG i.m.http.client.DefaultHttpClient - Sending HTTP Request: POST /auth/realms/master/protocol/openid-connect/token
DEBUG i.m.http.client.DefaultHttpClient - Chosen Server: keycloakserver(-1)
TRACE i.m.http.client.DefaultHttpClient - host: keycloakserver
TRACE i.m.http.client.DefaultHttpClient - connection: close
TRACE i.m.http.client.DefaultHttpClient - content-type: application/json
TRACE i.m.http.client.DefaultHttpClient - content-length: 87
TRACE i.m.http.client.DefaultHttpClient - Request Body
TRACE i.m.http.client.DefaultHttpClient - ----
TRACE i.m.http.client.DefaultHttpClient - {"password":"admin","grant_type":"password","client_id":"admin-cli","username":"admin"}
TRACE i.m.http.client.DefaultHttpClient - ----
TRACE i.m.http.client.DefaultHttpClient - HTTP Client Response Received for Request: POST /auth/realms/master/protocol/openid-connect/token
TRACE i.m.http.client.DefaultHttpClient - Status Code: 400 Bad Request
TRACE i.m.http.client.DefaultHttpClient - Content-Type: application/json
TRACE i.m.http.client.DefaultHttpClient - Date: Tue, 02 Oct 2018 22:47:01 GMT
TRACE i.m.http.client.DefaultHttpClient - Server: nginx/1.15.2
TRACE i.m.http.client.DefaultHttpClient - Content-Length: 84
TRACE i.m.http.client.DefaultHttpClient - Connection: Close
TRACE i.m.http.client.DefaultHttpClient - Response Body
TRACE i.m.http.client.DefaultHttpClient - ----
TRACE i.m.http.client.DefaultHttpClient - {"error":"invalid_request","error_description":"Missing form parameter: grant_type"}

Читая ошибку, я почти уверен, что проблема в Content-Type: application/json Я уже тестировал конечную точку с помощью почтальона и с application/x-www-form-urlencoded отлично работает.

это может быть запрос почтальона:

POST /auth/realms/master/protocol/openid-connect/token HTTP/1.1
Host: keycloakserver
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

Мне нужна помощь для решения этой проблемы.

Заранее спасибо

1 Ответ

0 голосов
/ 03 октября 2018

Во-первых, вы не должны использовать вложенный класс, например IKeycloakClient.AuthenticationData

На основании вашего примера.Вы можете позвонить http-клиенту напрямую

, например:

RxHttpClient client = RxHttpClient.create( new URL("${keycloak.base-url}/"));
HashMap<String,String> data = new HashMap<>();
data.put("client_id","admin-cli");
data.put("grant_type","password");
data.put("username", kConfiguration.getAdminUser());
data.put("password", kConfiguration.getAdminSecret());
MutableHttpRequest<HashMap<String, String>> request = HttpRequest
        .POST("/auth/realms/master/protocol/openid-connect/token", data)
        .contentType(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
        .accept(MediaType.APPLICATION_JSON_TYPE);
HttpResponse<AuthenticationData> response = client.exchange(request, AuthenticationData.class)
        .blockingFirst();
...