基于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
相关产品推荐
相关产品推荐

