Former-commit-id: 3664788a8b243bd07f7043c162c4dd62a771cbb4
master
wangbing 5 years ago
parent e29ec42c0d
commit fe2f127ba6

@ -72,6 +72,7 @@ public class ApiCallable implements Callable {
for (Api api : apiList) { for (Api api : apiList) {
if (api.isCheck()) { if (api.isCheck()) {
RequestReader requestReader = new RequestReader(api.getRequestFile()); RequestReader requestReader = new RequestReader(api.getRequestFile());
api.setRequestFather(requestReader.getFatherName());
generateRequest(requestReader); generateRequest(requestReader);
ResponseReader responseReader = new ResponseReader(api.getResponseFile()); ResponseReader responseReader = new ResponseReader(api.getResponseFile());
@ -88,15 +89,9 @@ public class ApiCallable implements Callable {
freeMarkerManager.outputTemp(file, "Java_api/pom.xml", ctx); freeMarkerManager.outputTemp(file, "Java_api/pom.xml", ctx);
} }
{
HashMap<String, Object> ctx = new HashMap<String, Object>();
ctx.put("domain", String.join(".", domainList));
File file = new File(apiDomain, "ApiClient.java");
freeMarkerManager.outputTemp(file, "/Java_api/ApiClient.java", ctx);
}
{ {
File base = Tool.createPath(frame, "base"); File base = Tool.createPath(frame, "base");
File client = Tool.createPath(frame, "client");
File utils = Tool.createPath(frame, "utils"); File utils = Tool.createPath(frame, "utils");
File okhttp3 = Tool.createPath(frame, "okhttp3"); File okhttp3 = Tool.createPath(frame, "okhttp3");
@ -106,6 +101,10 @@ public class ApiCallable implements Callable {
freeMarkerManager.outputTemp(Tool.createFile(base, name), "Java_api/frame/base/" + name, ctx); freeMarkerManager.outputTemp(Tool.createFile(base, name), "Java_api/frame/base/" + name, ctx);
} }
for (String name : ResourceUtil.getResourceFiles("/modules/Java_api/frame/client/")) {
freeMarkerManager.outputTemp(Tool.createFile(client, name), "Java_api/frame/client/" + name, ctx);
}
for (String name : ResourceUtil.getResourceFiles("/modules/Java_api/frame/utils/")) { for (String name : ResourceUtil.getResourceFiles("/modules/Java_api/frame/utils/")) {
if (name.equals("ValidationUtil.java")){//去掉验证 减少体积 if (name.equals("ValidationUtil.java")){//去掉验证 减少体积
continue; continue;

@ -11,6 +11,8 @@ public class Api {
private String request; private String request;
//目标请求响应 //目标请求响应
private String response; private String response;
private String requestFather;
private String responseFather;
private String module; private String module;
private String target; private String target;
private String method; private String method;
@ -110,4 +112,20 @@ public class Api {
public void setError(String error) { public void setError(String error) {
this.error = error; this.error = error;
} }
public String getRequestFather() {
return requestFather;
}
public void setRequestFather(String requestFather) {
this.requestFather = requestFather;
}
public String getResponseFather() {
return responseFather;
}
public void setResponseFather(String responseFather) {
this.responseFather = responseFather;
}
} }

@ -3,9 +3,9 @@ package ${domain};
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import ${domain}.frame.ApiRequest; import ${domain}.frame.base.SortType;
import ${domain}.frame.ApiResponse; import ${domain}.frame.client.ApiClient;
import ${domain}.frame.MapperUtil; import ${domain}.frame.utils.MapperUtil;
<#list apiList as item> <#list apiList as item>
import ${domain}.module.${module}.req.${item.request}; import ${domain}.module.${module}.req.${item.request};
</#list> </#list>
@ -27,45 +27,49 @@ import java.util.Date;
*/ */
public class ${className} { public class ${className} {
private ApiClient apiClient; private ApiClient client;
@Before @Before
public void before() { public void before() {
//实例化API请求客户端 //实例化API请求客户端
ApiClient.init("http://localhost:8080/api", "app_key", "01234567890123456789012345678901"); client = ApiClient.getInstance("http://localhost:8080/api", "app_key", "01234567890123456789012345678901");
apiClient = ApiClient.getInstance();
ApiClient client = ApiClient.getInstance();
client.setDebug(true); client.setDebug(true);
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
//设置发送网络请求前的统一操作 //设置发送网络请求前的统一操作
client.setBefore(new ApiClient.Before() { client.setCallBefore(request -> {
public void call(ApiRequest request) {
System.out.println("before-->request = " + MapperUtil.toJson(request)); System.out.println("before-->request = " + MapperUtil.toJson(request));
System.out.println("before-->path = " + request.path()); System.out.println("before-->path = " + request.path());
}
}); });
//设置网络请求完成后的统一操作 //设置网络请求完成后的统一操作
client.setAfter(new ApiClient.After() { client.setCallAfter((request, response) -> {
public void call(ApiRequest request, ApiResponse response) {
System.out.println("after-->response = " + MapperUtil.toJson(response)); System.out.println("after-->response = " + MapperUtil.toJson(response));
Date end = new Date(); Date end = new Date();
System.out.println("after-->time = " + simpleDateFormat.format(end)); System.out.println("after-->time = " + simpleDateFormat.format(end));
if (response.hasError()) {
System.err.println(MapperUtil.toJson(response));
} }
}); });
UserLoginRequest request = new UserLoginRequest(); UserLoginRequest request = new UserLoginRequest();
request.setUsername("test"); request.setUsername("test");
request.setPassword("test123"); request.setPassword("test123");
UserLoginResponse response = apiClient.execute(request); UserLoginResponse response = client.execute(request);
apiClient.setToken(response.getToken()); Assert.assertTrue(!response.hasError());
client.setToken(response.getToken());
} }
<#list apiList as item> <#list apiList as item>
@Test @Test
public void test${item.request}() { public void test${item.request}() {
${item.request} request = new ${item.request}(); ${item.request} request = new ${item.request}();
${item.response} response = apiClient.execute(request); <#if item.requestFather == 'BaseFindRequest'>
request.setPageNumber(1);
request.setPageSize(10);
request.setSortKey("CREATE_TIME");
request.setSortType(SortType.DESC);
</#if>
${item.response} response = client.execute(request);
Assert.assertTrue(!response.hasError()); Assert.assertTrue(!response.hasError());
} }
</#list> </#list>

@ -7,7 +7,7 @@ package ${domain}.frame.base;
* @version 0.0.1 * @version 0.0.1
* @since 2017-01-01 * @since 2017-01-01
*/ */
public abstract class BaseFindRequest<T> extends BaseRequest{ public class BaseFindRequest<T extends BaseResponse> extends BaseRequest<T> {
private long pageNumber = 1L; private long pageNumber = 1L;

@ -9,15 +9,15 @@ package ${domain}.frame.base;
*/ */
public class BaseRequest<T extends BaseResponse> { public class BaseRequest<T extends BaseResponse> {
void check() { public void check() {
} }
String path() { public String path() {
return ""; return "";
} }
Class<T> responseClass() { public Class<T> responseClass() {
return null; return null;
} }
} }

@ -7,7 +7,7 @@ package ${domain}.frame.base;
* @version 0.0.1 * @version 0.0.1
* @since 2017-01-01 * @since 2017-01-01
*/ */
public abstract class BaseSearchRequest<T> extends BaseFindRequest{ public class BaseSearchRequest<T extends BaseResponse> extends BaseFindRequest<T> {
/** /**
* *

@ -1,17 +1,20 @@
package ${domain}; package ${domain}.frame.client;
import ${domain}.frame.utils.AESUtil;
import ${domain}.frame.base.ApiRequest;
import ${domain}.frame.base.ApiResponse;
import ${domain}.frame.base.ErrorType;
import ${domain}.frame.utils.MD5Util;
import ${domain}.frame.utils.MapperUtil;
import ${domain}.frame.okhttp3.ProgressRequestBody;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import ${domain}.frame.base.BaseRequest;
import ${domain}.frame.base.BaseResponse;
import ${domain}.frame.base.ErrorType;
import ${domain}.frame.client.CallAfter;
import ${domain}.frame.client.CallBefore;
import ${domain}.frame.client.Callback;
import ${domain}.frame.okhttp3.ProgressRequestBody;
import ${domain}.frame.utils.AESUtil;
import ${domain}.frame.utils.MD5Util;
import ${domain}.frame.utils.MapperUtil;
import java.io.IOException; import java.io.IOException;
import java.net.ConnectException; import java.net.ConnectException;
@ -21,28 +24,19 @@ import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
* ApiTest - * ApiClient -
* *
* @author ${author?default("")} * @author
* @version 0.0.1 * @version 0.0.1
* @since ${.now?string["yyyy-MM-dd"]} * @since 2020-06-18
*/ */
public class ApiClient { public class ApiClient {
private static ApiClient ourInstance = null; public static ApiClient getInstance(String serverUrl, String appKey, String appSecret) {
return new ApiClient(serverUrl, appKey, appSecret, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT);
public static void init(String serverUrl, String appKey, String appSecret) {
init(serverUrl, appKey, appSecret, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT);
} }
public static void init(String serverUrl, String appKey, String appSecret, int connectTimeout, int readTimeout) { public static ApiClient getInstance(String serverUrl, String appKey, String appSecret, int connectTimeout, int readTimeout) {
ourInstance = new ApiClient(serverUrl, appKey, appSecret, connectTimeout, readTimeout); return new ApiClient(serverUrl, appKey, appSecret, connectTimeout, readTimeout);
}
public static ApiClient getInstance() {
if (ourInstance == null) {
System.err.print("ApiClient need init");
}
return ourInstance;
} }
//应用码 //应用码
@ -56,8 +50,8 @@ public class ApiClient {
private static final int DEFAULT_CONNECT_TIMEOUT = 5;//秒 private static final int DEFAULT_CONNECT_TIMEOUT = 5;//秒
private static final int DEFAULT_READ_TIMEOUT = 10;//秒 private static final int DEFAULT_READ_TIMEOUT = 10;//秒
private Before before = null; private CallBefore callBefore = null;
private After after = null; private CallAfter callAfter = null;
private String token = ""; private String token = "";
private boolean debug = false; private boolean debug = false;
@ -71,33 +65,21 @@ public class ApiClient {
.build(); .build();
} }
public interface Callback<T extends ApiResponse> { public void setCallAfter(CallAfter callAfter) {
void call(T response); this.callAfter = callAfter;
}
public interface Before {
void call(ApiRequest request);
}
public interface After {
void call(ApiRequest request, ApiResponse response);
}
public void setAfter(After after) {
this.after = after;
} }
public void setBefore(Before before) { public void setCallBefore(CallBefore callBefore) {
this.before = before; this.callBefore = callBefore;
} }
public <T extends ApiResponse> T execute(ApiRequest<T> request) { public <T extends BaseResponse> T execute(BaseRequest<T> request) {
return execute(request, null); return execute(request, null);
} }
public <T extends ApiResponse> T execute(ApiRequest<T> request, ProgressRequestBody.ProgressListener listener) { public <T extends BaseResponse> T execute(BaseRequest<T> request, ProgressRequestBody.ProgressListener listener) {
if (before != null) { if (callBefore != null) {
before.call(request); callBefore.call(request);
} }
if (debug) { if (debug) {
@ -152,14 +134,14 @@ public class ApiClient {
} catch (IOException e) { } catch (IOException e) {
t.addError(ErrorType.SYSTEM_ERROR, "请求异常!"); t.addError(ErrorType.SYSTEM_ERROR, "请求异常!");
} finally { } finally {
if (after != null) { if (callAfter != null) {
after.call(request, t); callAfter.call(request, t);
} }
} }
return t; return t;
} }
public <T extends ApiResponse> void executeCall(ApiRequest<T> request, Callback callback) { public <T extends BaseResponse> void executeCall(BaseRequest<T> request, Callback callback) {
ExecutorService executorService = Executors.newFixedThreadPool(1); ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(new Runnable() { executorService.execute(new Runnable() {
@Override @Override
@ -170,7 +152,7 @@ public class ApiClient {
}); });
} }
public <T extends ApiResponse> void executeCall(ApiRequest<T> request, Callback callback, ProgressRequestBody.ProgressListener listener) { public <T extends BaseResponse> void executeCall(BaseRequest<T> request, Callback callback, ProgressRequestBody.ProgressListener listener) {
ExecutorService executorService = Executors.newFixedThreadPool(1); ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(new Runnable() { executorService.execute(new Runnable() {
@Override @Override
@ -187,13 +169,13 @@ public class ApiClient {
* @param request * @param request
* @return * @return
*/ */
private String sign(ApiRequest request, String currentTime) { private String sign(BaseRequest request, String currentTime) {
String json = MapperUtil.toJson(request); String json = MapperUtil.toJson(request);
return MD5Util.encode(appSecret + json + currentTime); return MD5Util.encode(appSecret + json + currentTime);
} }
public void setToken(String token) { public void setToken(String token) {
this.token = token; this.token = token == null ? "" : token;
} }
public boolean isDebug() { public boolean isDebug() {

@ -0,0 +1,9 @@
package ${domain}.frame.client;
import ${domain}.frame.base.BaseRequest;
import ${domain}.frame.base.BaseResponse;
public interface CallAfter {
void call(BaseRequest request, BaseResponse response);
}

@ -0,0 +1,7 @@
package ${domain}.frame.client;
import ${domain}.frame.base.BaseRequest;
public interface CallBefore {
void call(BaseRequest request);
}

@ -0,0 +1,7 @@
package ${domain}.frame.client;
import ${domain}.frame.base.BaseResponse;
public interface Callback<T extends BaseResponse> {
void call(T response);
}

@ -30,8 +30,8 @@ public class AESUtil {
*/ */
public static byte[] encrypt(byte[] data, String secret) { public static byte[] encrypt(byte[] data, String secret) {
try { try {
if (secret.length() != 16) { if (secret.length() != 32) {
throw new IllegalArgumentException("secret's length is not 16"); throw new IllegalArgumentException("Hex secret's length must be 32");
} }
SecretKeySpec key = new SecretKeySpec(BytesUtil.hex2Bytes(secret), ALGORITHM); SecretKeySpec key = new SecretKeySpec(BytesUtil.hex2Bytes(secret), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM_STR); // 创建密码器 Cipher cipher = Cipher.getInstance(ALGORITHM_STR); // 创建密码器
@ -72,8 +72,8 @@ public class AESUtil {
*/ */
public static byte[] decrypt(byte[] data, String secret) { public static byte[] decrypt(byte[] data, String secret) {
try { try {
if (secret.length() != 16) { if (secret.length() != 32) {
throw new IllegalArgumentException("secret's length is not 16"); throw new IllegalArgumentException("Hex secret's length must be 32");
} }
SecretKeySpec key = new SecretKeySpec(BytesUtil.hex2Bytes(secret), ALGORITHM); SecretKeySpec key = new SecretKeySpec(BytesUtil.hex2Bytes(secret), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM_STR); Cipher cipher = Cipher.getInstance(ALGORITHM_STR);

@ -7,12 +7,13 @@ ${i}
import ${domain}.module.${module}.ent.${entName}; import ${domain}.module.${module}.ent.${entName};
</#list> </#list>
<#if fatherName == 'BaseRequest'> <#if fatherName == 'BaseRequest'>
import ${domain}.frame.base.'BaseRequest'; import ${domain}.frame.base.BaseRequest;
<#elseif fatherName == 'BaseFindRequest'> <#elseif fatherName == 'BaseFindRequest'>
import ${domain}.frame.base.BaseFindRequest; import ${domain}.frame.base.BaseFindRequest;
<#elseif fatherName == 'BaseSearchRequest'> <#elseif fatherName == 'BaseSearchRequest'>
import ${domain}.frame.base.BaseSearchRequest; import ${domain}.frame.base.BaseSearchRequest;
</#if> </#if>
import ${domain}.module.${module}.rsp.${rspClassName};
<#list annotation as i> <#list annotation as i>
${i} ${i}

Loading…
Cancel
Save

Powered by TurnKey Linux.