Опубликовать в форме Django из Java-клиента против curl -d - PullRequest
0 голосов
/ 04 июня 2019

Я застрял здесь с проблемой.Я пытаюсь сделать запрос к API Django из приложения Java.У меня есть команда curl из командной строки, которая работает как шарм ... но из Java я не могу понять это правильно.Итак ... команда curl:

curl -X POST --header 'Content-Type: application/x-www-form-urlencoded' --header 'Accept: application/json' -d 'username=clientname&password=somepassword' 'https://hostname.domain/api/v1/login'

Это дает мне тело ответа вроде:

{
  "success": true,
  "message": "Login OK",
  "token": "iLCJhbGcoOIJIUzI1NiJ9.eyJuYW1lIjoiU0ZMT1JFUy...(truncated)"
}

Мой Java-код

public Optional<String> login() {

    Form form = new Form();
    form.param("username", USER);
    form.param("password", PASS);

    Entity<Form> requestEntity = Entity.form(form);
    WebTarget target = this.client.target(LOGIN_URL);
    Response response = target.request().accept(MediaType.APPLICATION_JSON).post(requestEntity);

    this.logger.info(String.format("Response status: %s", response));

    if (response.getStatus() == Status.OK.getStatusCode()) {
        LoginResponseDTO loginDTO = response.readEntity(LoginResponseDTO.class);
        return Optional.<String>of(loginDTO.getToken());
    } else {
        this.logger.warn(String.format("%s", response.getStatusInfo()));
        this.logger.warn(String.format("Cannot log user '%s' in", USER));
        return Optional.<String>empty();
    }

}

Java-код,при вызове возвращает ответ BadRequest.Я проверил журнал Django, и тело POST кажется пустым, но запрос в java содержит форму, переданную как тело.Если у кого-нибудь есть подсказка о том, что я пропускаю, было бы здорово.

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

1 Ответ

0 голосов
/ 10 июня 2019

Ну ... получается, что конфигурация клиента по-джерси gzips body ... Целевой API не поддерживает это.

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

    JerseyClientConfiguration clientConfig = new JerseyClientConfiguration();
    clientConfig.setGzipEnabled(false);
    clientConfig.setGzipEnabledForRequests(false);

    Client client = new JerseyClientBuilder(environment).using(clientConfig).build("RESTClient");

    this.petiteBundle.getPetiteContainer().addBean(Client.class.getName(), client);

Мне потребовалось некоторое время, чтобы увидеть это, но я смог понять, что это происходит после активации дампа полезной нагрузки запросов в методе run приложения:

    environment.jersey().register(
            new LoggingFeature(Logger.getLogger("Main application"), Level.INFO, Verbosity.PAYLOAD_ANY, 100000));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...