Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dm_project
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
姚本章
dm_project
Commits
93162abe
Commit
93162abe
authored
Jan 22, 2021
by
zhangc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加api测试接口
parent
edbf048a
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
412 additions
and
112 deletions
+412
-112
api_gateway.sql
database/zc/api_gateway.sql
+3
-0
GatewayResultCode.java
...c/main/java/com/jz/dm/common/enums/GatewayResultCode.java
+6
-1
AuthFilter.java
...apigateway/src/main/java/com/jz/dm/filter/AuthFilter.java
+15
-12
VerifySignFilter.java
...eway/src/main/java/com/jz/dm/filter/VerifySignFilter.java
+17
-14
ApiInterface.java
...y/src/main/java/com/jz/dm/models/domian/ApiInterface.java
+5
-0
ApiInterfaceCustom.java
...main/java/com/jz/dm/models/domian/ApiInterfaceCustom.java
+10
-0
ApiInterfaceReq.java
.../main/java/com/jz/dm/models/req/make/ApiInterfaceReq.java
+5
-2
MakeDataBankApiReq.java
...in/java/com/jz/dm/models/req/make/MakeDataBankApiReq.java
+17
-6
ProducerServiceImpl.java
...main/java/com/jz/dm/service/impl/ProducerServiceImpl.java
+6
-4
ApiQueryService.java
.../main/java/com/jz/dm/service/request/ApiQueryService.java
+262
-66
application-test.yml
jz-dm-apigateway/src/main/resources/application-test.yml
+3
-0
TestRedisUserSave.java
...test/java/com/jz/dm/gateway/orther/TestRedisUserSave.java
+2
-2
TestStr.java
...teway/src/test/java/com/jz/dm/gateway/orther/TestStr.java
+61
-5
No files found.
database/zc/api_gateway.sql
View file @
93162abe
...
...
@@ -9,6 +9,7 @@ CREATE TABLE `t_api_interface` (
`api_path`
varchar
(
100
)
DEFAULT
NULL
COMMENT
'请求地址'
,
`target_url`
varchar
(
100
)
DEFAULT
NULL
COMMENT
'目标url'
,
`api_type`
varchar
(
50
)
NULL
DEFAULT
''
COMMENT
'api类型:1 数据银行制作大数据表 2 数据银行制作数据包,3,数据银行制作自定义API 4 API实时接入 6 标签查询 9自定义'
,
`req_method`
varchar
(
20
)
NULL
DEFAULT
NULL
COMMENT
'请求方式: GET, POST'
,
`api_function`
varchar
(
200
)
DEFAULT
NULL
COMMENT
'接口功能'
,
`join_type`
varchar
(
50
)
NULL
DEFAULT
NULL
COMMENT
'接入类型:字典表对应key值'
,
`test_example`
varchar
(
255
)
NULL
DEFAULT
NULL
COMMENT
'测试实例'
,
...
...
@@ -49,6 +50,8 @@ CREATE TABLE `t_api_interface_custom` (
`resp_code`
varchar
(
300
)
DEFAULT
NULL
COMMENT
'响应状态码'
,
`api_example`
varchar
(
300
)
DEFAULT
NULL
COMMENT
'api返回样例'
,
`inbox_param`
varchar
(
300
)
NULL
DEFAULT
NULL
COMMENT
'固定参数'
,
`page_num`
int
(
10
)
NULL
DEFAULT
'1'
COMMENT
'当前页'
,
`page_size`
int
(
10
)
NULL
DEFAULT
'100'
COMMENT
'当前页显示数'
`remark`
varchar
(
500
)
DEFAULT
NULL
COMMENT
'备注'
,
`create_date`
datetime
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
COMMENT
'创建时间'
,
`create_user`
varchar
(
100
)
DEFAULT
NULL
COMMENT
'创建人'
,
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/common/enums/GatewayResultCode.java
View file @
93162abe
...
...
@@ -37,7 +37,6 @@ public enum GatewayResultCode implements ResultCode {
ILLEGAL_TIMETEMP
(
"ILLEGAL_TIMETEMP"
,
"无效时间戳"
),
/** 请求次数受限 */
REQUEST_LIMIT_EXCEPTION
(
"REQUEST_LIMIT_EXCEPTION"
,
"请求次数受限"
),
...
...
@@ -60,6 +59,12 @@ public enum GatewayResultCode implements ResultCode {
/** API状态异常 */
API_STATUS_EXCEPTION
(
"API_STATUS_EXCEPTION"
,
"API状态异常"
),
/** API类型错误 */
API_TYPE_ERROR
(
"API_TYPE_ERROR"
,
"API类型错误"
),
/** 文件地址不存在 */
DATA_BIG_ADDR_UNEXIST
(
"DATA_BIG_ADDR_UNEXIST"
,
"文件地址不存在!"
),
/** 请求组织状态异常 */
ORG_STATE_EXCEPTION
(
"ORG_STATE_EXCEPTION"
,
"请求组织状态异常"
),
/** 请求信息不存在 */
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/filter/AuthFilter.java
View file @
93162abe
...
...
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import
com.jz.common.utils.HttpsUtils
;
import
com.jz.common.utils.RedisUtils
;
import
com.jz.dm.common.constant.Constants
;
import
com.jz.dm.common.constant.TagConstants
;
import
com.jz.dm.common.enums.GatewayResultCode
;
import
com.jz.dm.common.enums.apiInterface.ApiStatusEnum
;
import
com.jz.dm.common.enums.auth.AuthReqTypeEnum
;
...
...
@@ -89,7 +90,11 @@ public class AuthFilter extends AbstractFilter {
}
}
JSONObject
parameter
=
JSONObject
.
parseObject
(
request
.
getParams
());
if
(
null
!=
parameter
)
{
if
(
null
==
parameter
)
{
throw
new
GatewayException
(
GatewayResultCode
.
REQUEST_PARAM_EMPTY
);
}
Boolean
isTest
=
parameter
.
getBoolean
(
"isTest"
);
if
(!
isTest
)
{
//是否测试数据
String
authCode
=
parameter
.
getString
(
"authCode"
);
ApiAuth
authAuth
=
authService
.
getAuthUser
(
authCode
,
apiInterface
.
getId
());
if
(
null
==
authAuth
)
{
...
...
@@ -107,7 +112,7 @@ public class AuthFilter extends AbstractFilter {
if
(!
apiOrg
.
getStatus
())
{
throw
new
GatewayException
(
GatewayResultCode
.
ORG_STATE_EXCEPTION
);
}
checkBill
(
request
,
authCode
,
authAuth
,
apiOrg
);
checkBill
(
request
,
authCode
,
authAuth
);
}
chain
.
doFilter
(
request
,
response
);
}
catch
(
Exception
e
)
{
...
...
@@ -132,19 +137,17 @@ public class AuthFilter extends AbstractFilter {
* @param request
* @param authCode
* @param authAuth
* @param apiOrg
* @throws ParseException
*/
private
void
checkBill
(
GatewayRequest
request
,
String
authCode
,
ApiAuth
authAuth
,
ApiOrg
apiOrg
)
throws
ParseException
{
ApiAuth
authAuth
)
throws
ParseException
{
switch
(
authAuth
.
getAuthMode
())
{
case
"POWER_CALL_MODE"
:
//按次调用
//查询数据银行银行余额是否充足
getDataAmountResult
(
request
);
try
{
//记录请求次数(每天限制请求次数)
// String limitKey = TagConstants.OPEN_API_REDIS_LIMIT_KEY + authCode;
String
limitKey
=
authCode
;
String
reqValue
=
(
String
)
redisUtils
.
getObj
(
limitKey
);
String
limitKey
=
TagConstants
.
OPEN_API_REDIS_LIMIT_KEY
+
authCode
;
Integer
reqValue
=
(
Integer
)
redisUtils
.
getObj
(
limitKey
);
long
timeOut
=
0
;
if
(
AuthReqTypeEnum
.
DAY
.
name
().
equals
(
authAuth
.
getReqType
()))
{
//按天
timeOut
=
DateUtil
.
calculateNowResidueTime
();
...
...
@@ -154,11 +157,11 @@ public class AuthFilter extends AbstractFilter {
//暂时不支持年
}
if
(
null
!=
reqValue
)
{
Integer
value
=
Integer
.
valueOf
(
reqValue
);
if
(
v
alue
>
authAuth
.
getReqFrequency
())
{
//超出最大请求次数
/* Integer value = Integer.valueOf(reqValue);*/
if
(
reqV
alue
>
authAuth
.
getReqFrequency
())
{
//超出最大请求次数
throw
new
GatewayException
(
GatewayResultCode
.
REQUEST_LIMIT_EXCEPTION
);
}
else
if
(
v
alue
<=
authAuth
.
getReqFrequency
())
{
redisUtils
.
delAndAdd
(
limitKey
,
limitKey
,
v
alue
+
1
,
timeOut
);
}
else
if
(
reqV
alue
<=
authAuth
.
getReqFrequency
())
{
redisUtils
.
delAndAdd
(
limitKey
,
limitKey
,
reqV
alue
+
1
,
timeOut
);
}
}
else
{
redisUtils
.
set
(
limitKey
,
1
,
timeOut
);
...
...
@@ -217,7 +220,7 @@ public class AuthFilter extends AbstractFilter {
pObject
.
put
(
"assetsId"
,
assetsId
);
pObject
.
put
(
"userId"
,
userId
);
pObject
.
put
(
"dataPrice"
,
dataPrice
);
String
respResult
=
httpUtils
.
submitPost
(
balanceUrl
+
"/mall/financeCustomerAssets/findAssets"
,
pObject
.
toString
());
String
respResult
=
httpUtils
.
submitPost
(
balanceUrl
+
"/mall/financeCustomerAssets/findAssets"
,
pObject
.
toString
());
JSONObject
result
=
JSONObject
.
parseObject
(
respResult
);
if
(
null
!=
result
)
{
if
(
200
!=
result
.
getInteger
(
"code"
))
{
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/filter/VerifySignFilter.java
View file @
93162abe
...
...
@@ -41,22 +41,25 @@ public class VerifySignFilter extends AbstractFilter {
protected
void
internalDoFilter
(
GatewayRequest
request
,
GatewayResponse
response
,
FilterChain
chain
)
{
try
{
//对签约参数进行字典排序
String
signParams
=
MapUtil
.
getSignValue
(
request
.
getApiKey
(),
request
.
getMethod
(),
request
.
getSignType
());
if
(
StringUtils
.
isNotBlank
(
signParams
)){
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
request
.
getParams
());
String
authCode
=
jsonObject
.
getString
(
"authCode"
);
//需要传入授权码
ApiAuth
apiAuthInfo
=
apiInterfaceService
.
getApiAuthInfo
(
request
.
getApiKey
(),
authCode
);
if
(
null
==
apiAuthInfo
){
throw
new
GatewayException
(
GatewayResultCode
.
ILLEGAL_REQUEST
);
}
String
sign
=
Md5
.
encrypt
(
signParams
,
apiAuthInfo
.
getSalt
());
if
(!
request
.
getSign
().
equals
(
sign
)){
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
request
.
getParams
());
if
(!
jsonObject
.
getBoolean
(
"isTest"
)){
//是否测试调用
//对签约参数进行字典排序
String
signParams
=
MapUtil
.
getSignValue
(
request
.
getApiKey
(),
request
.
getMethod
(),
request
.
getSignType
());
if
(
StringUtils
.
isNotBlank
(
signParams
)){
String
authCode
=
jsonObject
.
getString
(
"authCode"
);
//需要传入授权码
ApiAuth
apiAuthInfo
=
apiInterfaceService
.
getApiAuthInfo
(
request
.
getApiKey
(),
authCode
);
if
(
null
==
apiAuthInfo
){
throw
new
GatewayException
(
GatewayResultCode
.
ILLEGAL_REQUEST
);
}
String
sign
=
Md5
.
encrypt
(
signParams
,
apiAuthInfo
.
getSalt
());
if
(!
request
.
getSign
().
equals
(
sign
)){
throw
new
GatewayException
(
GatewayResultCode
.
SIGN_ERROR
);
}
}
else
{
throw
new
GatewayException
(
GatewayResultCode
.
SIGN_ERROR
);
}
}
else
{
throw
new
GatewayException
(
GatewayResultCode
.
SIGN_ERROR
);
}
chain
.
doFilter
(
request
,
response
);
}
catch
(
SignatureException
ex
)
{
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/models/domian/ApiInterface.java
View file @
93162abe
...
...
@@ -66,6 +66,11 @@ public class ApiInterface extends BaseObject implements Serializable {
*/
@TableField
(
"target_url"
)
private
String
targetUrl
;
/**
* 请求方式:GET POST
*/
@TableField
(
"req_method"
)
private
String
reqMethod
;
/**
* 接入类型:对应字典表key
*/
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/models/domian/ApiInterfaceCustom.java
View file @
93162abe
...
...
@@ -93,5 +93,15 @@ public class ApiInterfaceCustom extends BaseObject implements Serializable {
*/
@TableField
(
"inbox_param"
)
private
String
inboxParam
;
/**
* 当前页
*/
@TableField
(
"page_num"
)
private
Integer
pageNum
;
/**
* 当前页显示数据
*/
@TableField
(
"page_size"
)
private
Integer
pageSize
;
}
jz-dm-apigateway/src/main/java/com/jz/dm/models/req/make/ApiInterfaceReq.java
View file @
93162abe
...
...
@@ -40,6 +40,9 @@ public class ApiInterfaceReq implements Serializable {
@NotNull
(
message
=
"目标地址不能为空"
)
public
String
targetUrl
;
@ApiModelProperty
(
value
=
"请求方式:GET POST"
,
required
=
false
)
public
String
reqMethod
;
@ApiModelProperty
(
value
=
"超时时间"
,
required
=
true
)
@NotNull
(
message
=
"超时时间不能为空"
)
public
String
timeout
;
...
...
@@ -54,7 +57,7 @@ public class ApiInterfaceReq implements Serializable {
@ApiModelProperty
(
value
=
"api描述"
,
required
=
false
)
public
String
apiFunction
;
@ApiModelProperty
(
value
=
"父类文件id,一级文件夹传入0"
,
required
=
false
)
/*
@ApiModelProperty(value = "父类文件id,一级文件夹传入0",required = false)
public Long parentId;
@ApiModelProperty(value = "文件id",required = false)
...
...
@@ -62,7 +65,7 @@ public class ApiInterfaceReq implements Serializable {
@ApiModelProperty(value = "项目id",required = true)
@NotNull(message="项目id不能为空")
public
Long
projectId
;
public Long projectId;
*/
@ApiModelProperty
(
value
=
"状态"
,
required
=
false
)
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/models/req/make/MakeDataBankApiReq.java
View file @
93162abe
...
...
@@ -40,9 +40,13 @@ public class MakeDataBankApiReq implements Serializable {
@NotNull
(
message
=
"输出类型不能为空"
)
public
String
outputType
;
@ApiModelProperty
(
value
=
"是否分页:"
,
required
=
true
)
@ApiModelProperty
(
value
=
"请求方式:GET POST"
,
required
=
true
)
@NotNull
(
message
=
"请求方式不能为空"
)
public
String
reqMethod
;
/*@ApiModelProperty(value = "是否分页:",required = true)
@NotNull(message = "是否分页不能为空")
public
Boolean
page
;
public Boolean page;
*/
@ApiModelProperty
(
value
=
"限流类型:DAY 按天,MONTH 按月"
,
required
=
true
)
@NotNull
(
message
=
"限流类型不能为空"
)
...
...
@@ -52,9 +56,15 @@ public class MakeDataBankApiReq implements Serializable {
@NotNull
(
message
=
"目标地址不能为空"
)
public
String
targetUrl
;
@ApiModelProperty
(
value
=
"文件id"
,
required
=
true
)
@NotNull
(
message
=
"文件id不能为空"
)
public
Long
fileId
;
@ApiModelProperty
(
value
=
"当前页"
,
required
=
true
)
public
Integer
pageNum
;
@ApiModelProperty
(
value
=
"当前页显示条数"
,
required
=
true
)
public
Integer
pageSize
;
//@ApiModelProperty(value = "文件id",required = true)
//@NotNull(message = "文件id不能为空")
//public Long fileId;
@ApiModelProperty
(
value
=
"签名"
,
required
=
true
)
@NotNull
(
message
=
"签名不能为空"
)
...
...
@@ -69,7 +79,8 @@ public class MakeDataBankApiReq implements Serializable {
@ApiModelProperty
(
value
=
"接口描述"
,
required
=
false
)
public
String
apiDesc
;
@ApiModelProperty
(
value
=
"数据包下载路径"
,
required
=
false
)
public
String
fileLocation
;
@ApiModelProperty
(
value
=
"超时时间"
,
required
=
false
)
public
String
timeout
;
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/service/impl/ProducerServiceImpl.java
View file @
93162abe
...
...
@@ -146,13 +146,13 @@ public class ProducerServiceImpl implements ProducerService {
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
,
propagation
=
Propagation
.
REQUIRES_NEW
)
public
Result
addDataBankApiInfo
(
MakeDataBankApiReq
req
)
{
QueryWrapper
<
ApiInterfaceFile
>
query
=
new
QueryWrapper
<>();
/*
QueryWrapper<ApiInterfaceFile> query = new QueryWrapper<>();
query.eq("file_source", "2");
query.eq("is_deleted", 0);
List<ApiInterfaceFile> fileSource = apiInterfaceFileMapper.selectList(query);
if (fileSource.size() == 0 || fileSource.size() >= 2) {
return Result.of_error("文件夹信息异常!");
}
}
*/
if
(
StringUtils
.
isNotBlank
(
req
.
getOutputType
()))
{
if
(!
req
.
getOutputType
().
contains
(
ApiInfoOutTypeEnum
.
JSON
.
name
())
||
!
req
.
getOutputType
().
contains
(
ApiInfoOutTypeEnum
.
FLOW
.
name
()))
{
...
...
@@ -175,6 +175,7 @@ public class ProducerServiceImpl implements ProducerService {
saveDataBanker
(
req
,
apiKey
,
"3"
);
break
;
case
"10007"
:
//数据银行数据包上传
if
(
StringUtils
.
isNotBlank
(
req
.
getFileLocation
()))
return
Result
.
of_error
(
"文件地址不存在!"
);
saveDataBanker
(
req
,
apiKey
,
"2"
);
break
;
case
"10008"
:
//数据银行制作大数据表
...
...
@@ -199,6 +200,7 @@ public class ProducerServiceImpl implements ProducerService {
JSONObject
object
=
new
JSONObject
();
object
.
put
(
"targetUrl"
,
req
.
getTargetUrl
());
object
.
put
(
"outputType"
,
req
.
getOutputType
());
object
.
put
(
"reqMethod"
,
req
.
getReqMethod
());
saveObjOnRedis
(
apiInterface
.
getApiKey
(),
object
);
}
...
...
@@ -340,10 +342,10 @@ public class ProducerServiceImpl implements ProducerService {
//生成ApiKey
String
apiKey
=
getApiKey
();
ApiInterface
apiInterface
=
new
ApiInterface
();
if
(
null
==
req
.
getFileId
())
{
//创建下级文件夹
/*
if (null == req.getFileId()) {//创建下级文件夹
Long fileId = checkFileExist(req.getProjectId(), req.getParentId(), req.getCreateUser());
req.setFileId(fileId);
}
}
*/
BeanUtils
.
copyProperties
(
req
,
apiInterface
);
apiInterface
.
setApiKey
(
apiKey
);
apiInterface
.
setApiProtocl
(
req
.
getTransMode
());
//传输方式 https http
...
...
jz-dm-apigateway/src/main/java/com/jz/dm/service/request/ApiQueryService.java
View file @
93162abe
...
...
@@ -15,11 +15,13 @@ import com.jz.dm.common.util.stream.HttpDownload;
import
com.jz.dm.gateway.OpenApiService
;
import
com.jz.dm.models.domian.ApiAuth
;
import
com.jz.dm.models.domian.ApiInterface
;
import
com.jz.dm.models.domian.ApiInterfaceCustom
;
import
com.jz.dm.service.ApiInterfaceService
;
import
com.jz.dm.service.AuthService
;
import
com.jz.dm.web.annotation.AccessLimit
;
import
com.jz.dm.web.annotation.ApiLogAspect
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
...
...
@@ -27,6 +29,7 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
import
java.util.Map
;
/**
...
...
@@ -61,9 +64,19 @@ public class ApiQueryService extends ApiParamVerify implements OpenApiService {
@Autowired
private
HttpsUtils
httpsUtils
;
/**
* 数据银行扣款链接
*/
@Value
(
"${data.bank.balanceUrl}"
)
private
String
balanceUrl
;
/**
* 数据包下载路径
*/
@Value
(
"${dataPackage.downloadUrl}"
)
private
String
downloadUrl
;
/**
* API请求逻辑处理
*
...
...
@@ -76,44 +89,48 @@ public class ApiQueryService extends ApiParamVerify implements OpenApiService {
@SentinelResource
(
value
=
"api.gateway"
,
fallback
=
"fallbackGateway"
)
@Transactional
(
rollbackFor
=
Exception
.
class
,
propagation
=
Propagation
.
REQUIRES_NEW
)
public
void
doService
(
OpenApiRequest
request
,
OpenApiResponse
response
)
{
JSONObject
parameter
=
JSONObject
.
parseObject
(
request
.
getOpenApiParams
());
String
authCode
=
parameter
.
getString
(
"authCode"
);
if
(
StringUtils
.
isBlank
(
authCode
))
{
throw
new
GatewayException
(
GatewayResultCode
.
ILLEGAL_REQUEST
);
}
verifyApiInterface
(
apiInterfaceService
.
getApiInfo
(
request
.
getApiKey
()));
ApiAuth
apiAuth
=
authService
.
getAuthInfo
(
authCode
);
verifyAuth
(
apiAuth
);
String
reqParams
=
parameter
.
getString
(
"reqParams"
);
Map
paramMap
=
null
;
if
(
StringUtils
.
isNotBlank
(
reqParams
))
{
paramMap
=
(
Map
)
JSONObject
.
parseObject
(
reqParams
);
}
//取出缓存数据
String
redisReqParam
=
redisUtils
.
get
(
request
.
getApiKey
());
boolean
bResult
=
false
;
JSONObject
parameter
=
JSONObject
.
parseObject
(
request
.
getOpenApiParams
());
ApiInterface
apiInterface
=
apiInterfaceService
.
getApiInfo
(
request
.
getApiKey
());
ApiAuth
apiAuth
=
null
;
try
{
if
(
StringUtils
.
isNotBlank
(
redisReqParam
))
{
//redis中存在
//解析出API制作成功时的参数配置
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
redisReqParam
);
String
targetUrl
=
jsonObject
.
getString
(
"targetUrl"
);
String
outputType
=
jsonObject
.
getString
(
"outputType"
);
bResult
=
rangRequestTarget
(
outputType
,
targetUrl
,
paramMap
,
response
);
}
else
{
//不存在查询数据库
ApiInterface
apiInterface
=
apiInterfaceService
.
getReqTargetInfo
(
request
.
getApiKey
());
if
(
null
==
apiInterface
)
{
throw
new
GatewayException
(
GatewayResultCode
.
REQUEST_INFO_UNEXIST
);
}
bResult
=
rangRequestTarget
(
apiInterface
.
getOutputType
(),
apiInterface
.
getTargetUrl
(),
paramMap
,
response
);
Boolean
isTest
=
parameter
.
getBoolean
(
"isTest"
);
String
reqParams
=
parameter
.
getString
(
"reqParams"
);
Map
paramMap
=
null
;
if
(
StringUtils
.
isNotBlank
(
reqParams
))
{
paramMap
=
(
Map
)
JSONObject
.
parseObject
(
reqParams
);
paramMap
.
put
(
"is_test"
,
isTest
);
}
//调用成功请求数据银行扣款
if
(
AuthModeEnum
.
POWER_CALL_MODE
.
name
().
equals
(
apiAuth
.
getAuthMode
()))
{
notifierMinusMoney
(
parameter
,
bResult
);
//按次调用时处理(处理为已调用)
authService
.
updateApiAuthStatus
(
apiAuth
);
if
(!
isTest
)
{
//如果不是测试
String
authCode
=
parameter
.
getString
(
"authCode"
);
if
(
StringUtils
.
isBlank
(
authCode
))
{
throw
new
GatewayException
(
GatewayResultCode
.
ILLEGAL_REQUEST
);
}
verifyApiInterface
(
apiInterface
);
apiAuth
=
authService
.
getAuthInfo
(
authCode
);
verifyAuth
(
apiAuth
);
//取出缓存数据
String
redisReqParam
=
redisUtils
.
get
(
request
.
getApiKey
());
if
(
StringUtils
.
isNotBlank
(
redisReqParam
))
{
//redis中存在
//解析出API制作成功时的参数配置
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
redisReqParam
);
String
targetUrl
=
jsonObject
.
getString
(
"targetUrl"
);
String
outputType
=
jsonObject
.
getString
(
"outputType"
);
String
joinType
=
jsonObject
.
getString
(
"joinType"
);
bResult
=
rangRequestTarget
(
outputType
,
targetUrl
,
false
,
paramMap
,
joinType
,
apiInterface
,
response
);
}
else
{
//不存在查询数据库
bResult
=
rangRequestTarget
(
apiInterface
.
getOutputType
(),
apiInterface
.
getTargetUrl
(),
false
,
paramMap
,
apiInterface
.
getJoinType
(),
apiInterface
,
response
);
}
//调用成功请求数据银行扣款
if
(
AuthModeEnum
.
POWER_CALL_MODE
.
name
().
equals
(
apiAuth
.
getAuthMode
()))
{
notifierMinusMoney
(
parameter
,
bResult
);
//按次调用时处理(处理为已调用)
authService
.
updateApiAuthStatus
(
apiAuth
);
}
}
else
{
bResult
=
rangRequestTarget
(
ApiInfoOutTypeEnum
.
JSON
.
name
(),
apiInterface
.
getTargetUrl
(),
true
,
paramMap
,
apiInterface
.
getJoinType
(),
apiInterface
,
response
);
}
}
catch
(
Exception
ex
)
{
if
(
ex
instanceof
GatewayException
)
{
...
...
@@ -137,52 +154,231 @@ public class ApiQueryService extends ApiParamVerify implements OpenApiService {
* @param outputType
* @param targetUrl
* @param param
* @param isTest 是否是测试
* @param joinType
* @param response
*/
private
boolean
rangRequestTarget
(
String
outputType
,
String
targetUrl
,
Map
<
String
,
String
>
param
,
OpenApiResponse
response
)
{
private
boolean
rangRequestTarget
(
String
outputType
,
String
targetUrl
,
Boolean
isTest
,
Map
<
String
,
String
>
param
,
String
joinType
,
ApiInterface
apiInterface
,
OpenApiResponse
response
)
{
if
(
StringUtils
.
isBlank
(
outputType
))
{
outputType
=
ApiInfoOutTypeEnum
.
JSON
.
name
();
}
if
(
StringUtils
.
isBlank
(
targetUrl
))
{
throw
new
GatewayException
(
GatewayResultCode
.
ILLEGAL_REQUEST
);
throw
new
GatewayException
(
GatewayResultCode
.
REQUEST_PARAM_EMPTY
);
}
if
(
StringUtils
.
isBlank
(
joinType
))
{
throw
new
GatewayException
(
GatewayResultCode
.
API_TYPE_ERROR
);
}
if
(!
isTest
){
if
(
"10002"
.
equals
(
joinType
)
||
"10009"
.
equals
(
joinType
))
{
//数据表查询
return
dataTableSelect
(
outputType
,
targetUrl
,
param
,
apiInterface
,
response
);
}
else
if
(
"10004"
.
equals
(
joinType
)
||
"10008"
.
equals
(
joinType
))
{
//三方查询
return
thirdSelect
(
targetUrl
,
apiInterface
,
response
);
}
else
if
(
"10005"
.
equals
(
joinType
)
||
"10007"
.
equals
(
joinType
))
{
//数据包查询
return
dataBagDownload
(
param
);
}
else
{
throw
new
GatewayException
(
GatewayResultCode
.
API_TYPE_ERROR
);
}
}
else
{
return
dataTableSelect
(
outputType
,
targetUrl
,
param
,
apiInterface
,
response
);
}
}
/**
* 三方查询 $$ 数据银行+DMP
*
* @param targetUrl
* @param apiInterface
* @param response
* @return
*/
private
boolean
thirdSelect
(
String
targetUrl
,
ApiInterface
apiInterface
,
OpenApiResponse
response
)
{
if
(
"POST"
.
equalsIgnoreCase
(
apiInterface
.
getReqType
()))
{
return
callMethodResponse
(
httpsUtils
.
submitPost
(
targetUrl
,
null
),
response
);
}
else
{
return
callMethodResponse
(
httpsUtils
.
doGet
(
targetUrl
,
null
),
response
);
}
}
/**
* 数据包下载 $$ 数据银行+DMP
*
* @param param
* @return
*/
private
boolean
dataBagDownload
(
Map
<
String
,
String
>
param
)
{
String
fileLocation
=
param
.
get
(
"fileLocation"
);
String
datasourceId
=
param
.
get
(
"datasourceId"
);
if
(
null
==
fileLocation
||
null
==
datasourceId
)
{
throw
new
GatewayException
(
GatewayResultCode
.
DATA_BIG_ADDR_UNEXIST
);
}
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
"?"
).
append
(
"file_location="
)
.
append
(
fileLocation
).
append
(
"&"
)
.
append
(
"datasourceId="
)
.
append
(
datasourceId
);
HttpDownload
.
download
(
downloadUrl
+
builder
.
toString
());
return
true
;
}
/**
* 数据表查询
*
* @param outputType
* @param targetUrl
* @param param
* @param apiInterface
* @param response
* @return
*/
private
boolean
dataTableSelect
(
String
outputType
,
String
targetUrl
,
Map
<
String
,
String
>
param
,
ApiInterface
apiInterface
,
OpenApiResponse
response
)
{
ApiInterfaceCustom
apiCustomInfo
=
checkParamLegal
(
param
,
apiInterface
);
if
(
ApiInfoOutTypeEnum
.
FLOW
.
name
().
equals
(
outputType
))
{
//文件流形式请求
StringBuilder
builder
=
new
StringBuilder
();
builder
.
append
(
targetUrl
).
append
(
"?"
);
for
(
Map
.
Entry
<
String
,
String
>
entry
:
param
.
entrySet
())
{
String
key
=
entry
.
getKey
();
String
value
=
entry
.
getValue
();
builder
.
append
(
key
).
append
(
LoggingConstants
.
AND_EQUAL
)
.
append
(
value
).
append
(
LoggingConstants
.
AND_SPILT
);
return
flowRequestMethod
(
targetUrl
,
param
,
response
,
apiCustomInfo
);
}
else
if
(
ApiInfoOutTypeEnum
.
JSON
.
name
().
equals
(
outputType
))
{
//json格式请求
return
jsonRequestMethod
(
targetUrl
,
param
,
response
,
apiCustomInfo
);
}
else
{
throw
new
GatewayException
(
GatewayResultCode
.
OUTPUT_TYPE_EXCEPTION
);
}
}
/**
* 校验参数合法性
*
* @param param
* @param apiInterface
* @return
*/
private
ApiInterfaceCustom
checkParamLegal
(
Map
<
String
,
String
>
param
,
ApiInterface
apiInterface
)
{
ApiInterfaceCustom
apiCustomInfo
=
apiInterfaceService
.
getApiCustomInfo
(
apiInterface
.
getId
());
boolean
tag
=
false
;
if
(
null
!=
apiCustomInfo
)
{
List
<
Map
>
mapList
=
JSONObject
.
parseArray
(
apiCustomInfo
.
getRequestParam
(),
Map
.
class
);
if
(
CollectionUtils
.
isNotEmpty
(
mapList
))
{
for
(
Map
map
:
mapList
)
{
if
((
Boolean
)
map
.
get
(
"required"
))
{
String
name
=
(
String
)
map
.
get
(
"name"
);
if
(
null
==
param
.
get
(
name
))
{
tag
=
true
;
}
}
}
if
(
tag
)
{
throw
new
GatewayException
(
GatewayResultCode
.
REQUEST_PARAM_EMPTY
);
}
}
String
baseUrl
=
builder
.
substring
(
0
,
builder
.
length
()
-
1
);
HttpDownload
.
download
(
baseUrl
);
}
return
apiCustomInfo
;
}
/**
* 数据查询---流请求方式
*
* @param targetUrl
* @param param
* @param response
* @return
*/
private
boolean
flowRequestMethod
(
String
targetUrl
,
Map
<
String
,
String
>
param
,
OpenApiResponse
response
,
ApiInterfaceCustom
apiCustomInfo
)
{
String
dataSize
=
param
.
get
(
"dataSize"
);
Integer
valueOf
=
-
1
;
if
(
StringUtils
.
isNotBlank
(
dataSize
))
{
valueOf
=
Integer
.
valueOf
(
dataSize
);
}
StringBuilder
builder
=
new
StringBuilder
();
net
.
sf
.
json
.
JSONObject
reqParams
=
net
.
sf
.
json
.
JSONObject
.
fromObject
(
param
);
builder
.
append
(
targetUrl
).
append
(
"?"
)
.
append
(
"datasourceId="
).
append
(
apiCustomInfo
.
getEsDataSource
())
.
append
(
"query_database="
).
append
(
apiCustomInfo
.
getEsDataBase
())
.
append
(
"request_fileds="
).
append
(
reqParams
).
append
(
"response_fields="
)
.
append
(
assembleResponseParams
(
apiCustomInfo
.
getResponseParam
()))
.
append
(
valueOf
);
/* for (Map.Entry<String, String> entry : param.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
builder.append(key).append(LoggingConstants.AND_EQUAL)
.append(value).append(LoggingConstants.AND_SPILT);
}*/
HttpDownload
.
download
(
builder
.
toString
());
response
.
setCode
(
GatewayResultCode
.
SUCCESS
.
getCode
());
response
.
setMsg
(
GatewayResultCode
.
SUCCESS
.
getMsg
());
return
true
;
}
/**
* 数据查询--json请求方式
*
* @param targetUrl
* @param param
* @param response
* @param apiCustomInfo
* @return
*/
private
boolean
jsonRequestMethod
(
String
targetUrl
,
Map
<
String
,
String
>
param
,
OpenApiResponse
response
,
ApiInterfaceCustom
apiCustomInfo
)
{
JSONObject
params
=
new
JSONObject
();
params
.
put
(
"datasourceId"
,
apiCustomInfo
.
getEsDataSource
());
//数据源id
params
.
put
(
"query_database"
,
apiCustomInfo
.
getEsDataBase
());
//数据源库名称
params
.
put
(
"query_table"
,
apiCustomInfo
.
getEsTable
());
//数据源库表
net
.
sf
.
json
.
JSONObject
reqParams
=
net
.
sf
.
json
.
JSONObject
.
fromObject
(
param
);
params
.
put
(
"request_fileds"
,
reqParams
);
//请求参数
params
.
put
(
"response_fields"
,
assembleResponseParams
(
apiCustomInfo
.
getResponseParam
()));
//响应参数
Integer
pageNum
=
Integer
.
valueOf
(
param
.
get
(
"pageNum"
));
Integer
pageSize
=
Integer
.
valueOf
(
param
.
get
(
"pageSize"
));
params
.
put
(
"page_size"
,
apiCustomInfo
.
getPageSize
());
params
.
put
(
"page_num"
,
apiCustomInfo
.
getPageNum
());
if
(
null
!=
pageNum
)
{
params
.
put
(
"page_num"
,
pageNum
);
}
if
(
null
!=
pageSize
)
{
params
.
put
(
"page_size"
,
pageSize
);
}
String
respResult
=
httpsUtils
.
submitPost
(
targetUrl
,
params
.
toString
());
return
callMethodResponse
(
respResult
,
response
);
}
/**
* 组装响应参数
*
* @param respParams
* @return
*/
private
String
assembleResponseParams
(
String
respParams
)
{
StringBuilder
builder
=
new
StringBuilder
();
List
<
Map
>
mapList
=
JSONObject
.
parseArray
(
respParams
,
Map
.
class
);
if
(
CollectionUtils
.
isNotEmpty
(
mapList
))
{
for
(
Map
map
:
mapList
)
{
String
name
=
(
String
)
map
.
get
(
"name"
);
builder
.
append
(
name
).
append
(
LoggingConstants
.
SEP
);
}
}
return
builder
.
substring
(
0
,
builder
.
length
()
-
1
);
}
/**
* 调用方法处理结果
*
* @param result
* @param response
*/
private
boolean
callMethodResponse
(
String
result
,
OpenApiResponse
response
)
{
if
(
null
==
result
)
{
throw
new
GatewayException
(
GatewayResultCode
.
DISTANCE_REQUEST_EXCEPTION
);
}
JSONObject
resp
=
JSONObject
.
parseObject
(
result
);
if
(
null
!=
resp
&&
"ESC00000"
.
equals
(
resp
.
getString
(
"return_code"
)))
{
response
.
setCode
(
GatewayResultCode
.
SUCCESS
.
getCode
());
response
.
setMsg
(
GatewayResultCode
.
SUCCESS
.
getMsg
());
response
.
setAttribute
(
resp
);
return
true
;
}
else
if
(
ApiInfoOutTypeEnum
.
JSON
.
name
().
equals
(
outputType
))
{
//json格式请求
response
.
setAttribute
(
"调用成功!"
);
response
.
setMsg
(
GatewayResultCode
.
SUCCESS
.
getMsg
());
response
.
setCode
(
GatewayResultCode
.
SUCCESS
.
getCode
());
/*String respResult = httpsUtils.doGet(targetUrl, param);
JSONObject resp = JSONObject.parseObject(respResult);
if (null != resp && 200 == resp.getInteger("code")) {
response.setCode(GatewayResultCode.SUCCESS.getCode());
response.setMsg(GatewayResultCode.SUCCESS.getMsg());
response.setAttribute(resp.getString("data"));
return true;
} else {
log.error("~~~~~~~~~~~~~~~~远程请求异常~~~~~~~~~~~~~~~~~");
throw new GatewayException(GatewayResultCode.DISTANCE_REQUEST_EXCEPTION);
}*/
}
else
{
throw
new
GatewayException
(
GatewayResultCode
.
OUTPUT_TYPE_EXCEPTION
);
log
.
error
(
"~~~~~~~~~~~~~~~~远程请求异常~~~~~~~~~~~~~~~~~"
);
throw
new
GatewayException
(
GatewayResultCode
.
DISTANCE_REQUEST_EXCEPTION
);
}
return
false
;
}
/**
* 通知扣款
*
...
...
@@ -198,7 +394,7 @@ public class ApiQueryService extends ApiParamVerify implements OpenApiService {
jsonReq
.
put
(
"userId"
,
userId
);
jsonReq
.
put
(
"dataPrice"
,
dataPrice
);
jsonReq
.
put
(
"callStatus"
,
bResult
);
//true 调用成功 扣款 false 调用失败,解冻金额
String
responseResult
=
httpsUtils
.
submitPost
(
balanceUrl
+
"/mall/financeCustomerAssets/unfreezeMoney"
,
jsonReq
.
toString
());
String
responseResult
=
httpsUtils
.
submitPost
(
balanceUrl
+
"/mall/financeCustomerAssets/unfreezeMoney"
,
jsonReq
.
toString
());
JSONObject
paramsResult
=
JSONObject
.
parseObject
(
responseResult
);
if
(
null
!=
paramsResult
)
{
if
(
200
!=
paramsResult
.
getInteger
(
"code"
))
{
...
...
jz-dm-apigateway/src/main/resources/application-test.yml
View file @
93162abe
...
...
@@ -107,5 +107,8 @@ logging:
zhl
:
springbootlogback
:
off
#数据包访问链接
dataPackage
:
downloadUrl
:
http://xxx.com
jz-dm-apigateway/src/test/java/com/jz/dm/gateway/orther/TestRedisUserSave.java
View file @
93162abe
...
...
@@ -43,10 +43,10 @@ public class TestRedisUserSave extends SpringTestCase {
bankApiReq
.
setSignType
(
"MD5"
);
bankApiReq
.
setJoinType
(
"10004"
);
bankApiReq
.
setOutputType
(
"JSON"
);
bankApiReq
.
setPage
(
false
);
//
bankApiReq.setPage(false);
bankApiReq
.
setReqType
(
"DAY"
);
bankApiReq
.
setTargetUrl
(
"www.baidu.com"
);
bankApiReq
.
setFileId
(
1L
);
//
bankApiReq.setFileId(1L);
bankApiReq
.
setSign
(
"F2A8E3CFE528D6AE5C5B075046653F3E"
);
bankApiReq
.
setReqFrequency
(
0L
);
bankApiReq
.
setApiDesc
(
"4444"
);
...
...
jz-dm-apigateway/src/test/java/com/jz/dm/gateway/orther/TestStr.java
View file @
93162abe
package
com
.
jz
.
dm
.
gateway
.
orther
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
/**
* @ClassName:
* @Author: Carl
...
...
@@ -8,10 +12,62 @@ package com.jz.dm.gateway.orther;
*/
public
class
TestStr
{
public
static
void
main
(
String
[]
args
)
{
String
str
=
"/picture/logo/T6gxlv137nFA555z.jpg"
;
// String[] split = str.split("\\/");
System
.
out
.
println
(
str
.
substring
(
0
,
str
.
lastIndexOf
(
"/"
)
+
1
));
String
substring
=
str
.
substring
(
str
.
lastIndexOf
(
"."
));
System
.
out
.
println
(
substring
);
List
<
String
>
list1
=
new
ArrayList
<
String
>();
list1
.
add
(
"1"
);
list1
.
add
(
"2"
);
list1
.
add
(
"3"
);
list1
.
add
(
"4"
);
list1
.
add
(
"5"
);
List
<
String
>
list2
=
new
ArrayList
<
String
>();
list2
.
add
(
"1"
);
list2
.
add
(
"2"
);
list2
.
add
(
"3"
);
list2
.
add
(
"4"
);
list2
.
add
(
"5"
);
list2
.
add
(
"7"
);
list2
.
add
(
"9"
);
// 交集
List
<
String
>
intersection
=
list1
.
stream
().
filter
(
item
->
list2
.
contains
(
item
)).
collect
(
Collectors
.
toList
());
System
.
out
.
println
(
"---交集 intersection---"
);
intersection
.
parallelStream
().
forEach
(
System
.
out
::
println
);
// 差集 (list1 - list2)
List
<
String
>
reduce1
=
list1
.
stream
().
filter
(
item
->
!
list2
.
contains
(
item
)).
collect
(
Collectors
.
toList
());
System
.
out
.
println
(
"---差集 reduce1 (list1 - list2)---"
);
reduce1
.
parallelStream
().
forEach
(
System
.
out
::
println
);
// 差集 (list2 - list1)
List
<
String
>
reduce2
=
list2
.
stream
().
filter
(
item
->
!
list1
.
contains
(
item
)).
collect
(
Collectors
.
toList
());
System
.
out
.
println
(
"---差集 reduce2 (list2 - list1)---"
);
reduce2
.
parallelStream
().
forEach
(
System
.
out
::
println
);
//合拼差
reduce1
.
addAll
(
reduce2
);
System
.
out
.
println
(
"---合拼差 reduce1 (list2 -> list1)---"
);
reduce1
.
parallelStream
().
forEach
(
System
.
out
::
println
);
// 并集
List
<
String
>
listAll
=
list1
.
parallelStream
().
collect
(
Collectors
.
toList
());
List
<
String
>
listAll2
=
list2
.
parallelStream
().
collect
(
Collectors
.
toList
());
listAll
.
addAll
(
listAll2
);
System
.
out
.
println
(
"---并集 listAll---"
);
listAll
.
parallelStream
().
forEachOrdered
(
System
.
out
::
println
);
// 去重并集
List
<
String
>
listAllDistinct
=
listAll
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
System
.
out
.
println
(
"---得到去重并集 listAllDistinct---"
);
listAllDistinct
.
parallelStream
().
forEachOrdered
(
System
.
out
::
println
);
System
.
out
.
println
(
"---原来的List1---"
);
list1
.
parallelStream
().
forEachOrdered
(
System
.
out
::
println
);
System
.
out
.
println
(
"---原来的List2---"
);
list2
.
parallelStream
().
forEachOrdered
(
System
.
out
::
println
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment