Skip to content

Commit 45042cc

Browse files
author
YangSen-qn
committed
Api: Config add default value
1 parent ca45910 commit 45042cc

File tree

2 files changed

+254
-10
lines changed

2 files changed

+254
-10
lines changed

src/main/java/com/qiniu/storage/Api.java

Lines changed: 100 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public class Api {
3535
* @param client 请求的 Client【必须】
3636
**/
3737
protected Api(Client client) {
38-
this.client = client;
39-
this.interceptors = null;
38+
this(client, (Config) null);
4039
}
4140

4241
/**
@@ -129,6 +128,11 @@ protected com.qiniu.http.Response requestByClient(Request request) throws QiniuE
129128
ApiUtils.throwInvalidRequestParamException("request");
130129
}
131130

131+
request = request.clone();
132+
if (request == null) {
133+
throw QiniuException.unrecoverable("request clone error, just retry");
134+
}
135+
132136
request.prepareToRequest();
133137

134138
return innerRequest(request);
@@ -139,6 +143,11 @@ protected com.qiniu.http.Response requestWithInterceptor(Request request) throws
139143
ApiUtils.throwInvalidRequestParamException("request");
140144
}
141145

146+
request = request.clone();
147+
if (request == null) {
148+
throw QiniuException.unrecoverable("request clone error, just retry");
149+
}
150+
142151
request.prepareToRequest();
143152

144153
if (interceptors == null || interceptors.size() == 0) {
@@ -258,66 +267,142 @@ private Config(Auth auth, int hostRetryMax, int singleHostRetryMax, Retry.Interv
258267

259268
public static final class Builder {
260269
private Auth auth;
261-
private int hostRetryMax;
262-
private int singleHostRetryMax;
263-
private Retry.Interval retryInterval;
264-
private Retry.RetryCondition retryCondition;
265-
private Retry.HostFreezeCondition hostFreezeCondition;
266-
private HostProvider hostProvider;
267-
private int hostFreezeDuration;
268-
private int requestDebugLevel;
270+
private int hostRetryMax = 1;
271+
private int singleHostRetryMax = 1;
272+
private Retry.Interval retryInterval = Retry.defaultInterval();
273+
private Retry.RetryCondition retryCondition = Retry.defaultCondition();
274+
private Retry.HostFreezeCondition hostFreezeCondition = Retry.defaultHostFreezeCondition();
275+
private HostProvider hostProvider = null;
276+
private int hostFreezeDuration = 10 * 60 * 1000;
277+
private int requestDebugLevel = DebugLevelNone;
269278
private int responseDebugLevel;
270279

280+
/**
281+
* 设置鉴权信息
282+
*
283+
* @param auth 鉴权信息
284+
* @return Builder
285+
**/
271286
public Builder setAuth(Auth auth) {
272287
this.auth = auth;
273288
return this;
274289
}
275290

291+
/**
292+
* 当有多个 Host,在请求失败且请求可以重试时,最多切换 Host 的次数
293+
* 已经使用过的 Host 在冻结期内不会被使用
294+
*
295+
* @param hostRetryMax 切换 Host 的最大次数
296+
* @return Builder
297+
**/
276298
public Builder setHostRetryMax(int hostRetryMax) {
277299
this.hostRetryMax = hostRetryMax;
278300
return this;
279301
}
280302

303+
/**
304+
* 在请求失败且请求可以重试时,单个域名最大可以重试的次数
305+
*
306+
* @param singleHostRetryMax 单个域名最大可以重试的次数
307+
* @return Builder
308+
**/
281309
public Builder setSingleHostRetryMax(int singleHostRetryMax) {
282310
this.singleHostRetryMax = singleHostRetryMax;
283311
return this;
284312
}
285313

314+
/**
315+
* 设置请求重试的时间间隔
316+
*
317+
* @param retryInterval 固定大小的重试时间间隔,单位:毫秒
318+
* @return Builder
319+
**/
286320
public Builder setRetryInterval(int retryInterval) {
287321
this.retryInterval = Retry.staticInterval(retryInterval);
288322
return this;
289323
}
290324

325+
/**
326+
* 设置请求重试的时间间隔
327+
*
328+
* @param retryInterval 可动态调整的重试时间间隔
329+
* @return Builder
330+
**/
291331
public Builder setRetryInterval(Retry.Interval retryInterval) {
292332
this.retryInterval = retryInterval;
293333
return this;
294334
}
295335

336+
/**
337+
* 设置重试条件
338+
*
339+
* @param retryCondition 重试条件
340+
* @return Builder
341+
**/
296342
public Builder setRetryCondition(Retry.RetryCondition retryCondition) {
297343
this.retryCondition = retryCondition;
298344
return this;
299345
}
300346

347+
/**
348+
* 设置域名冻结时间
349+
* 当某个域名请求失败,且该域名短时间内不可在使用则会被冻结,切换其他域名进行重试
350+
*
351+
* @param hostFreezeDuration 域名冻结时间,单位:毫秒
352+
* @return Builder
353+
**/
301354
public Builder setHostFreezeDuration(int hostFreezeDuration) {
302355
this.hostFreezeDuration = hostFreezeDuration;
303356
return this;
304357
}
305358

359+
/**
360+
* 设置域名提供者
361+
* 当请求域名被冻结,且可以请求切换域名进行重试,此时会尝试从域名提供者中获取一个域名进行重试
362+
*
363+
* @param hostProvider 域名提供者
364+
* @return Builder
365+
**/
306366
public Builder setHostProvider(HostProvider hostProvider) {
307367
this.hostProvider = hostProvider;
308368
return this;
309369
}
310370

371+
/**
372+
* 设置域名冻结条件
373+
* 根据相应情况来判断域名是否可以再次被使用,不过不可则需要冻结(比如:服务内部繁忙需切换域名重试)
374+
*
375+
* @param hostFreezeCondition 域名冻结条件
376+
* @return Builder
377+
**/
311378
public Builder setHostFreezeCondition(Retry.HostFreezeCondition hostFreezeCondition) {
312379
this.hostFreezeCondition = hostFreezeCondition;
313380
return this;
314381
}
315382

383+
/**
384+
* 设置请求 Debug 的等级
385+
* {@link #DebugLevelNone}
386+
* {@link #DebugLevelNormal}
387+
* {@link #DebugLevelDetail}
388+
*
389+
* @param requestDebugLevel 请求 Debug 的等级
390+
* @return Builder
391+
**/
316392
public Builder setRequestDebugLevel(int requestDebugLevel) {
317393
this.requestDebugLevel = requestDebugLevel;
318394
return this;
319395
}
320396

397+
/**
398+
* 设置响应 Debug 的等级
399+
* {@link #DebugLevelNone}
400+
* {@link #DebugLevelNormal}
401+
* {@link #DebugLevelDetail}
402+
*
403+
* @param responseDebugLevel 响应 Debug 的等级
404+
* @return Builder
405+
**/
321406
public Builder setResponseDebugLevel(int responseDebugLevel) {
322407
this.responseDebugLevel = responseDebugLevel;
323408
return this;
@@ -414,6 +499,10 @@ protected Request(String urlPrefix) {
414499
}
415500

416501
try {
502+
if (!urlPrefix.startsWith("http")) {
503+
urlPrefix = "http://" + urlPrefix;
504+
}
505+
417506
URL url = new URL(urlPrefix);
418507
this.scheme = url.getProtocol();
419508
this.host = url.getHost();
@@ -628,6 +717,7 @@ protected void setMethod(MethodType method) {
628717

629718
/**
630719
* 增加请求头
720+
* 注:用户不可使用此方法
631721
*
632722
* @param key key
633723
* @param value value
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package test.com.qiniu.iam.apis;
2+
3+
import com.qiniu.common.QiniuException;
4+
import com.qiniu.iam.apis.*;
5+
import com.qiniu.storage.Api;
6+
import org.junit.jupiter.api.Disabled;
7+
import org.junit.jupiter.api.Tag;
8+
import org.junit.jupiter.api.Test;
9+
import test.com.qiniu.TestConfig;
10+
11+
import static org.junit.jupiter.api.Assertions.*;
12+
13+
public class UserApiTest {
14+
15+
@Test
16+
@Tag("IntegrationTest")
17+
public void testUsers() {
18+
String userAlias = "JavaTestUser";
19+
String userPWD = "JavaTestUserPWD";
20+
String baseUrl = "api.qiniu.com";
21+
Api.Config config = new Api.Config.Builder()
22+
.setAuth(TestConfig.testAuth)
23+
.setRequestDebugLevel(Api.Config.DebugLevelDetail)
24+
.setResponseDebugLevel(Api.Config.DebugLevelDetail)
25+
.build();
26+
27+
// 先删除,流程开始先清理历史数据
28+
ApiDeleteUser.Request deleteRequest = new ApiDeleteUser.Request(baseUrl, userAlias);
29+
ApiDeleteUser deleteApi = new ApiDeleteUser(null, config);
30+
try {
31+
deleteApi.request(deleteRequest);
32+
} catch (QiniuException e) {
33+
// 删除失败时预期的
34+
e.printStackTrace();
35+
}
36+
37+
try {
38+
// 1. 创建
39+
ApiCreateUser.Request.CreateIamUserParam createParam = new ApiCreateUser.Request.CreateIamUserParam();
40+
createParam.setAlias(userAlias);
41+
createParam.setPassword(userPWD);
42+
ApiCreateUser.Request createRequest = new ApiCreateUser.Request(baseUrl, createParam);
43+
ApiCreateUser createApi = new ApiCreateUser(null, config);
44+
ApiCreateUser.Response createResponse = createApi.request(createRequest);
45+
assertNotNull(createResponse, "1. 创建 User 失败:" + createResponse);
46+
assertEquals(createResponse.getResponse().statusCode, 200, "1.1 创建 User 失败:" + createResponse);
47+
ApiCreateUser.Response.CreatedIamUserData createdUserData = createResponse.getData().getData();
48+
assertEquals(createdUserData.getAlias(), userAlias, "1.2 创建 User 失败:" + createResponse);
49+
assertNotNull(createdUserData.getId(), "1.3 创建 User 失败:" + createResponse);
50+
assertNotNull(createdUserData.getRootUid(), "1.4 创建 User 失败:" + createResponse);
51+
assertNotNull(createdUserData.getIuid(), "1.5 创建 User 失败:" + createResponse);
52+
assertNotNull(createdUserData.getAlias(), "1.6 创建 User 失败:" + createResponse);
53+
assertNotNull(createdUserData.getCreatedAt(), "1.7 创建 User 失败:" + createResponse);
54+
assertNotNull(createdUserData.getUpdatedAt(), "1.8 创建 User 失败:" + createResponse);
55+
assertNotNull(createdUserData.getLastLoginTime(), "1.9 创建 User 失败:" + createResponse);
56+
assertNotNull(createdUserData.getEnabled(), "1.10 创建 User 失败:" + createResponse);
57+
58+
// 2. 获取某个
59+
ApiGetUser.Request getRequest = new ApiGetUser.Request(baseUrl, userAlias);
60+
ApiGetUser getApi = new ApiGetUser(null, config);
61+
ApiGetUser.Response getResponse = getApi.request(getRequest);
62+
assertNotNull(getResponse, "2. 获取 User 失败:" + getResponse);
63+
assertEquals(createResponse.getResponse().statusCode, 200, "2.1 获取 User 失败:" + getResponse);
64+
ApiGetUser.Response.GetIamUserData getUserData = getResponse.getData().getData();
65+
assertEquals(getUserData.getAlias(), userAlias, "2.2 获取 User 失败:" + getResponse);
66+
assertNotNull(getUserData.getId(), "2.3 获取 User 失败:" + getResponse);
67+
assertNotNull(getUserData.getRootUid(), "2.4 获取 User 失败:" + getResponse);
68+
assertNotNull(getUserData.getIuid(), "2.5 获取 User 失败:" + getResponse);
69+
assertNotNull(getUserData.getAlias(), "2.6 获取 User 失败:" + getResponse);
70+
assertNotNull(getUserData.getCreatedAt(), "2.7 获取 User 失败:" + getResponse);
71+
assertNotNull(getUserData.getUpdatedAt(), "2.8 获取 User 失败:" + getResponse);
72+
assertNotNull(getUserData.getLastLoginTime(), "2.9 获取 User 失败:" + getResponse);
73+
assertNotNull(getUserData.getEnabled(), "2.10 获取 User 失败:" + getResponse);
74+
assertEquals(getUserData.getId(), createdUserData.getId(), "2.11 获取 User 失败:" + getResponse);
75+
assertEquals(getUserData.getRootUid(), createdUserData.getRootUid(), "2.12 获取 User 失败:" + getResponse);
76+
assertEquals(getUserData.getIuid(), createdUserData.getIuid(), "2.13 获取 User 失败:" + getResponse);
77+
assertEquals(getUserData.getAlias(), createdUserData.getAlias(), "2.14 获取 User 失败:" + getResponse);
78+
assertEquals(getUserData.getEnabled(), createdUserData.getEnabled(), "2.15 获取 User 失败:" + getResponse);
79+
80+
// 3. 修改
81+
ApiModifyUser.Request.ModifyIamUserParam modifyParam = new ApiModifyUser.Request.ModifyIamUserParam();
82+
modifyParam.setEnabled(false);
83+
ApiModifyUser.Request modifyRequest = new ApiModifyUser.Request(baseUrl, userAlias, modifyParam);
84+
ApiModifyUser modifyApi = new ApiModifyUser(null, config);
85+
ApiModifyUser.Response modifyResponse = modifyApi.request(modifyRequest);
86+
assertTrue(modifyResponse.isOK(), "3.1 修改 User 失败:" + getResponse);
87+
ApiModifyUser.Response.ModifiedIamUserData modifyUserData = modifyResponse.getData().getData();
88+
assertEquals(modifyUserData.getId(), createdUserData.getId(), "3.2 修改 User 失败:" + getResponse);
89+
assertEquals(modifyUserData.getRootUid(), createdUserData.getRootUid(), "3.3 修改 User 失败:" + getResponse);
90+
assertEquals(modifyUserData.getIuid(), createdUserData.getIuid(), "3.4 修改 User 失败:" + getResponse);
91+
assertEquals(modifyUserData.getAlias(), createdUserData.getAlias(), "3.5 修改 User 失败:" + getResponse);
92+
assertNotNull(modifyUserData.getCreatedAt(), "3.6 修改 User 失败:" + getResponse);
93+
assertNotNull(modifyUserData.getUpdatedAt(), "3.7 修改 User 失败:" + getResponse);
94+
assertNotNull(modifyUserData.getLastLoginTime(), "3.8 修改 User 失败:" + getResponse);
95+
assertEquals(modifyUserData.getEnabled(), false, "3.9 修改 User 失败:" + getResponse);
96+
97+
// 4. 列举所有
98+
ApiGetUsers.Request getUsersRequest = new ApiGetUsers.Request(baseUrl)
99+
.setAlias(userAlias);
100+
ApiGetUsers getUsersApi = new ApiGetUsers(null, config);
101+
ApiGetUsers.Response getUsersResponse = getUsersApi.request(getUsersRequest);
102+
assertTrue(getUsersResponse.isOK(), "4.1 列举 User 失败:" + getResponse);
103+
ApiGetUsers.Response.GetIamUsersData getUsersDataList = getUsersResponse.getData().getData();
104+
assertEquals(1, (int) getUsersDataList.getCount(), "4.2 列举 User 失败:" + getResponse);
105+
ApiGetUsers.Response.GetIamUser getUsersData = getUsersDataList.getList()[0];
106+
assertEquals(getUsersData.getId(), modifyUserData.getId(), "4.3 修改 User 失败:" + getResponse);
107+
assertEquals(getUsersData.getRootUid(), modifyUserData.getRootUid(), "4.4 修改 User 失败:" + getResponse);
108+
assertEquals(getUsersData.getIuid(), modifyUserData.getIuid(), "4.5 修改 User 失败:" + getResponse);
109+
assertEquals(getUsersData.getAlias(), modifyUserData.getAlias(), "4.6 修改 User 失败:" + getResponse);
110+
assertNotNull(getUsersData.getCreatedAt(), "4.7 修改 User 失败:" + getResponse);
111+
assertNotNull(getUsersData.getUpdatedAt(), "4.8 修改 User 失败:" + getResponse);
112+
assertNotNull(getUsersData.getLastLoginTime(), "4.9 修改 User 失败:" + getResponse);
113+
assertEquals(getUsersData.getEnabled(), modifyUserData.getEnabled(), "4.10 修改 User 失败:" + getResponse);
114+
115+
// 5. 删除
116+
ApiDeleteUser.Response deleteResponse = deleteApi.request(deleteRequest);
117+
assertTrue(deleteResponse.isOK(), "5.1 删除 User 失败:" + getResponse);
118+
119+
} catch (QiniuException e) {
120+
throw new RuntimeException(e);
121+
} finally {
122+
try {
123+
deleteApi.request(deleteRequest);
124+
} catch (QiniuException e) {
125+
// 删除失败时预期的
126+
e.printStackTrace();
127+
}
128+
}
129+
130+
}
131+
132+
@Test
133+
@Tag("IntegrationTest")
134+
public void testUsersKeyPairs() {
135+
136+
137+
}
138+
139+
@Test
140+
@Disabled
141+
@Tag("IntegrationTest")
142+
public void testUsersGroups() {
143+
144+
145+
}
146+
147+
@Test
148+
@Disabled
149+
@Tag("IntegrationTest")
150+
public void testUsersPolicies() {
151+
152+
153+
}
154+
}

0 commit comments

Comments
 (0)