Почтовый запрос клиента Джерси с ошибками x-www-form-urlencoded

java rest jersey jersey-2.0 jersey-client

9411 просмотра

1 ответ

1438 Репутация автора

Привет! Я использую Джерси-клиент Glassfish, чтобы получить oauth-Token с REST URL. Я могу получить токен через почтового клиента и CURL, пожалуйста, найдите ниже изображение для справки,

$ curl 'https://sample.com/oauth2/token' -X POST -d'g
rant_type=samples&id=2ZwqWBdksfjkads6Q8yNW3s58LNeOMucJeb&s                                                                                                                
ecret=dkfflJTZOqA1GCEH&scope=GROUP'

Но не может достичь этого с помощью кода,

<dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.22.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.2</version>
    </dependency>

Я использую следующий код для получения токена

Form form = new Form();
        form.param("grant_type", "samples");
        form.param("id", "2ZwqWBdksfjkads6Q8yNW3s58LNeOMucJeb");
        form.param("secret", "HGoslJTZOqA1GCEH");
        form.param("scope", "dkfflJTZOqA1GCEH");
JerseyClientBuilder jerseyClientBuilder = new JerseyClientBuilder()
            .register(new LoggingFilter());
    JerseyWebTarget jerseyWebTarget =      jerseyClientBuilder.build().target(hostname);
        response = jerseyWebTarget.request().accept(MediaType.APPLICATION_FORM_URLENCODED).post(Entity.form(form));

Продолжайте получать StatusCode = 406 (не приемлемо) в качестве ответа. Должен ли я передать параметры URL правильно?

Я был бы очень признателен, если бы кто-нибудь дал мне подсказку, чтобы решить эту проблему.

Автор: VelNaga Источник Размещён: 18.07.2016 12:47

Ответы (1)


4 плюса

163953 Репутация автора

Решение

Избавься от этого .accept(MediaType.APPLICATION_FORM_URLENCODED). Это устанавливает Acceptзаголовок. Здесь вы говорите, что хотите получить ответ с типом данных application/x-www-form-urlencoded. Сервер не знает, как ответить с этим типом, поэтому он сообщает, что этот тип ответа не является приемлемым.

Вам нужно отправить Content-Typeзаголовок, а не Acceptзаголовок. Использование Entity.form(Form)автоматически устанавливает Content-Typeдля, application/x-www-form-urlencodedтак что вам действительно не нужно больше ничего делать. Просто удалите acceptвызов метода.


ОБНОВИТЬ

Кажется, клиент устанавливает заголовок Accept, который не нравится серверу, поэтому вы можете явно установить Acceptзаголовок, application/jsonтак как это тип контента, отправляемый сервером обратно для ответа токена.

Если вы хотите получить токен как объект Java, вы можете просто создать Tokenкласс со всеми свойствами JSON в токене.

public class Token {
    @JsonProperty("access_token")
    private String accessToken;

    // other properties

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

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

    // other getters and setters
}

Тогда просто делай

Token token = response.readEntity(Token.class);

Если вы не знаете все другие свойства в ответе токена, просто посмотрите на содержимое фильтра журналирования. Вы должны увидеть ответ. Но вам нужно настроить фильтр регистрации, чтобы показать тело

.register(new LoggingFilter(Logger.getAnonymousLogger(), true));
Автор: Paul Samsotha Размещён: 18.07.2016 01:01
32x32