You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于com.sun.jersey实现OAuth2授权的API调用求助及代码示例需求

别担心,我帮你写一个基于Sun Jersey的完整示例,完全对应你给出的curl命令逻辑,一步一步搞定OAuth2的client_credentials模式令牌获取!

首先,确保你有正确的依赖

如果用Maven的话,把这些依赖加到你的pom.xml里:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.19.4</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.19.4</version>
</dependency>
<!-- 如果需要自动解析JSON响应到POJO,再加这个 -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.19.4</version>
</dependency>

完整代码示例

这个示例完全复刻你的curl请求逻辑:包含Basic Auth头、表单类型的请求体、指定grant_type=client_credentials参数。

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

import javax.ws.rs.core.MediaType;

public class OAuth2TokenClient {

    public static void main(String[] args) {
        // 替换成你的实际配置
        String clientId = "your-client-id";
        String clientSecret = "your-client-secret";
        String tokenEndpoint = "https://api.xxxx.com/api/oauth/token";

        // 1. 初始化Jersey Client(如果要解析JSON到POJO,用带配置的方式)
        ClientConfig config = new DefaultClientConfig();
        config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        Client client = Client.create(config);

        try {
            // 2. 添加Basic Auth过滤器:Jersey会自动帮你把client_id:client_secret转成Base64编码的头
            client.addFilter(new HTTPBasicAuthFilter(clientId, clientSecret));

            // 3. 构建请求资源
            WebResource webResource = client.resource(tokenEndpoint);

            // 4. 准备表单参数(对应curl里的-d参数)
            MultivaluedMapImpl formParams = new MultivaluedMapImpl();
            formParams.add("grant_type", "client_credentials");

            // 5. 发送POST请求,指定Content-Type为表单编码
            ClientResponse response = webResource
                    .type(MediaType.APPLICATION_FORM_URLENCODED)
                    .post(ClientResponse.class, formParams);

            // 6. 处理响应
            int statusCode = response.getStatus();
            if (statusCode == 200) {
                // 方式1:直接读取JSON字符串
                String rawResponse = response.getEntity(String.class);
                System.out.println("令牌获取成功:\n" + rawResponse);

                // 方式2:自动解析到POJO(需要先定义TokenResponse类,加上jersey-json依赖)
                // TokenResponse tokenResponse = response.getEntity(TokenResponse.class);
                // System.out.println("Access Token: " + tokenResponse.getAccess_token());
                // System.out.println("Expires in: " + tokenResponse.getExpires_in());
            } else {
                System.err.println("请求失败,状态码:" + statusCode);
                System.err.println("错误详情:" + response.getEntity(String.class));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 记得关闭Client释放资源
            client.destroy();
        }
    }

    // 可选:定义令牌响应的POJO类,用于自动解析JSON
    static class TokenResponse {
        private String access_token;
        private String token_type;
        private long expires_in;

        // getter和setter方法
        public String getAccess_token() { return access_token; }
        public void setAccess_token(String access_token) { this.access_token = access_token; }
        public String getToken_type() { return token_type; }
        public void setToken_type(String token_type) { this.token_type = token_type; }
        public long getExpires_in() { return expires_in; }
        public void setExpires_in(long expires_in) { this.expires_in = expires_in; }
    }
}

关键细节说明

  • HTTPBasicAuthFilter:这个过滤器会帮你自动处理Basic Auth的编码逻辑,完全等价于curl里的Authorization: Basic 1234567890qwertyQWERTY,不用自己手动编码Base64。
  • MediaType.APPLICATION_FORM_URLENCODED:对应curl里的Content-Type: application/x-www-form-urlencoded,告诉服务器请求体是表单格式。
  • MultivaluedMapImpl:用来存放表单参数,和curl里的-d参数对应。

如果不想用过滤器,也可以手动构造Authorization头,比如:

// 手动生成Basic Auth头
String authStr = clientId + ":" + clientSecret;
String encodedAuth = java.util.Base64.getEncoder().encodeToString(authStr.getBytes());
webResource = webResource.header("Authorization", "Basic " + encodedAuth);

这样效果是一样的,不过用过滤器更简洁省心。

内容的提问来源于stack exchange,提问作者Sudarsono Sung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:23:36