泽西客户端 Post x-www-form-urlencoded 请求失败
Jersey client Post Request with x-www-form-urlencoded Fails
您好,我正在使用 Glassfish jersey-client 从 REST URL 获取 oauth-Token。
我可以通过postman client & CURL获取token,请参考下图,
$ 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
header。你在这里说你想要一个数据类型为 application/x-www-form-urlencoded
的响应。服务器不知道如何响应该类型,因此它告诉您该响应类型不可接受。
你想要的是发送 Content-Type
header,而不是 Accept
header。使用 Entity.form(Form)
会自动将 Content-Type
设置为 application/x-www-form-urlencoded
,因此您真的不需要做任何其他事情。只需删除 accept
方法调用。
更新
似乎客户端正在设置服务器不喜欢的 Accept header,因此您可以明确地将 Accept
header 设置为 application/json
,因为那是content-type 由服务器发回以获取令牌响应。
如果你想以 Java object 的形式获取令牌,你可以只创建一个 Token
class,其中包含所有 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);
如果您不知道令牌响应中的所有其他属性,只需查看日志记录过滤器的内容即可。您应该看到响应。但是您需要配置日志过滤器以显示 body
.register(new LoggingFilter(Logger.getAnonymousLogger(), true));
您好,我正在使用 Glassfish jersey-client 从 REST URL 获取 oauth-Token。 我可以通过postman client & CURL获取token,请参考下图,
$ 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
header。你在这里说你想要一个数据类型为 application/x-www-form-urlencoded
的响应。服务器不知道如何响应该类型,因此它告诉您该响应类型不可接受。
你想要的是发送 Content-Type
header,而不是 Accept
header。使用 Entity.form(Form)
会自动将 Content-Type
设置为 application/x-www-form-urlencoded
,因此您真的不需要做任何其他事情。只需删除 accept
方法调用。
更新
似乎客户端正在设置服务器不喜欢的 Accept header,因此您可以明确地将 Accept
header 设置为 application/json
,因为那是content-type 由服务器发回以获取令牌响应。
如果你想以 Java object 的形式获取令牌,你可以只创建一个 Token
class,其中包含所有 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);
如果您不知道令牌响应中的所有其他属性,只需查看日志记录过滤器的内容即可。您应该看到响应。但是您需要配置日志过滤器以显示 body
.register(new LoggingFilter(Logger.getAnonymousLogger(), true));