gpt4 book ai didi

java - 带有 x-www-form-urlencoded 的 Jersey 客户端发布请求失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:32 25 4
gpt4 key购买 nike

您好,我正在使用 Glassfish jersey-client 从 REST URL 获取 oauth-Token。我可以通过 postman 客户端和 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>

我正在使用以下代码获取 token

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(Not acceptable) 作为响应。我应该正确传递 URL 参数吗?

如果有人给我提示以解决此问题,我将不胜感激。

最佳答案

去掉这个 .accept(MediaType.APPLICATION_FORM_URLENCODED)。这将设置 Accept header 。你在这里说你想要一个数据类型为 application/x-www-form-urlencoded 的响应。服务器不知道如何响应该类型,因此它告诉您该响应类型是 Not Acceptable 。

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


更新

似乎客户端正在设置服务器不喜欢的 Accept header ,因此您可以将 Accept header 显式设置为 application/json 因为那是内容-服务器为 token 响应发回的类型。

如果你想获取 token 作为Java对象,你可以只创建一个Token类,其中包含 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);

如果您不知道 token 响应中的所有其他属性,只需查看日志记录过滤器的内容即可。您应该看到响应。但是你需要配置日志过滤器来显示正文

.register(new LoggingFilter(Logger.getAnonymousLogger(), true));

关于java - 带有 x-www-form-urlencoded 的 Jersey 客户端发布请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38437136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com