繁体   English   中英

使用x-www-form-urlencoded的Jersey客户端发布请求失败

[英]Jersey client Post Request with x-www-form-urlencoded Fails

您好我正在使用Glassfish jersey-client从REST URL获取oauth-Token。 我可以通过邮递员客户端和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参数吗?

如果有人给我提示解决这个问题,我将非常感激。

摆脱这个.accept(MediaType.APPLICATION_FORM_URLENCODED) 这将设置Accept标头。 你在这里说你想要一个数据类型为application/x-www-form-urlencoded的响应。 服务器不知道如何使用该类型进行响应,因此它告诉您该响应类型是不可接受的。

您想要的是发送Content-Type标头,而不是Accept标头。 使用Entity.form(Form)自动将Content-Typeapplication/x-www-form-urlencoded这样你真的不需要做任何其他事情。 只需删除accept方法调用即可。


UPDATE

似乎客户端正在设置服务器不喜欢的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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM