调用京灵平台接口,很详细

news2024/10/6 18:24:55

调用京灵平台接口,很详细

  • 一、准备
    • 1、开发资源
    • 2、申请环境
  • 二、测试接口调用
    • 1、查看接口文档
    • 2、查看示例代码
    • 3、引入对应依赖
    • 4、改造后需要的依赖
    • 5、测试调用
  • 三、工具类
    • 1、配置dto
    • 2、公共参数dto
    • 3、请求参数dto
    • 4、响应参数dto
    • 4、调用工具类(重要)

一、准备

在确定好要对接京东的京灵平台的时,会把你拉进一个技术群。

1、开发资源

找群里的技术要到API文档、demo等。他们会问需要Java还是PHP,我的项目是Java写的,所有已Java为例,资源如下图所示:

在这里插入图片描述

2、申请环境

申请测试环境和正式环境的步骤是一样的,这里以申请测试环境为例:

先解压公私钥生成工具
在这里插入图片描述

进入根目录会看到一个生成命令的TXT文件,打开后面需要用到,

在这里插入图片描述

在这里插入图片描述

内容如下:

RSA密钥生成命令:

生成RSA私钥 
openssl>genrsa -out app_rsa_private_key.pem 1024 

生成RSA公钥 
openssl>rsa -in app_rsa_private_key.pem -pubout -out app_rsa_public_key.pem 

将RSA私钥转换成PKCS8格式 
openssl>pkcs8 -topk8 -inform PEM -in app_rsa_private_key.pem -outform PEM -nocrypt -out  app_rsa_private_pkcs8_key.pem

注意:“>”符号后面的才是需要输入的命令。

注: 生成的密钥文件
app_rsa_private_pkcs8_key.pem (应用私钥,开发者自行保存)
app_rsa_public_key.pem (应用公钥,上传至数科开放平台)

php语言,请把两个文件放在\config目录下面

然后进入“bin”目录,

在这里插入图片描述

双击“openssl.exe”文件

在这里插入图片描述

打开“生成命令.txt”文件中的命令,先输入“生成RSA私钥”命令,命令如下:

genrsa -out app_rsa_private_key.pem 1024

在这里插入图片描述

接着输入“生成RSA公钥”命令:

rsa -in app_rsa_private_key.pem -pubout -out app_rsa_public_key.pem

在这里插入图片描述

最后输入“将RSA私钥转换成PKCS8格式 ”命令:

pkcs8 -topk8 -inform PEM -in app_rsa_private_key.pem -outform PEM -nocrypt -out  app_rsa_private_pkcs8_key.pem

在这里插入图片描述

回到“bin”目录,我们会发现多了三个秘钥文件,将公钥文件发给对接的技术,公钥如下图所示:

在这里插入图片描述

保存好生成的私钥,后面调用接口需要用到,私钥如下图所示:

在这里插入图片描述

最后一个目前没有用到,然后等他们走完流程,走完之后会给AppId、token、sysId、serviceCompanyId测试环境参数,就算把测试环境申请下来了。

申请正式环境的过程也是如此。

二、测试接口调用

这开始认为已经拿到AppId、token、sysId、serviceCompanyId测试环境参数了

1、查看接口文档

在这里插入图片描述

这里以“查询灵工合同信息”接口为例,文档参数如下:

在这里插入图片描述

2、查看示例代码

解压这个

在这里插入图片描述

重命名为“demo”,查看此目录下的案例即可

在这里插入图片描述

具体内容如下:

package com.jdd.open.demo.esu.spi.inner;

import com.jddglobal.open.client.SpiInnerClient;
import com.jddglobal.open.request.base.JddRequest;
import com.jddglobal.open.response.base.BaseJddResponse;
import com.jddglobal.open.support.app.AppInfo;
import com.jddglobal.open.support.http.HttpClientConfig;
import com.jddglobal.open.support.util.JacksonUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.http.client.utils.DateUtils;

import java.util.Date;

public class SpiInnerInvoker {

    public static void main(String[] args) throws Exception {
        /*密钥平台*/
       /*AppInfo appInfo = new AppInfo();
        appInfo.setAppId("6b232709d5a25d554b59ea05b4a621e0");
        appInfo.setEncryptType("ENV_RSA"); // 加密算法,支持 NONE、RSA、ENV_RSA
        appInfo.setSignType("MD5_RSA"); // 加签算法,支持 MD5_RSA、SHA1withRSA
        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder().build();
        String serverUrl = "http://59.151.67.121:1058"; // 服务端调用地址!测试: http://59.151.67.121:1058、生产: http://api-out.jdfin.local
        SpiInnerClient spiInnerClient = new SpiInnerClient(serverUrl, appInfo, httpClientConfig);*/

        /*AKS*/
        AppInfo appInfo = new AppInfo();
        appInfo.setAppId("4a5634fca025625860d8f3ad9c3b005f");
        appInfo.setEncryptType("3DES_RSA"); //加密算法,支持 3DES_RSA
        appInfo.setSignType("SHA256withRSA"); // 加签算法,支持 SHA256withRSA
        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder().build();
        String serverUrl = "http://59.151.67.121:1058"; // 服务端调用地址!测试: http://59.151.67.121:1058、生产: http://api-out.jdfin.local
        SpiInnerClient spiInnerClient = new SpiInnerClient(serverUrl, appInfo, httpClientConfig);

        /*国密*/
        /*AppInfo appInfo = new AppInfo();
        appInfo.setAppId("4a5634fca025625860d8f3ad9c3b005f");
        appInfo.setEncryptType("SM4_SM2"); //加密算法,支持 SM2、SM4_SM2
        appInfo.setSignType("SM3withSM2"); // 加签算法,支持 SM3withSM2
        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder().build();
        String serverUrl = "http://127.0.0.1:8095"; // 服务端调用地址!测试: http://59.151.67.121:1058、生产: http://api-out.jdfin.local
        SpiInnerClient spiInnerClient = new SpiInnerClient(serverUrl, appInfo, httpClientConfig);*/

        SpiBizDemoRequest bizDemoRequest = new SpiBizDemoRequest();
        bizDemoRequest.setAge("22");
        bizDemoRequest.setName("张三");

        String appUrl = "http://127.0.0.1:8089/spi/demo"; // 外部商户调用地址
        BaseJddResponse result = spiInnerClient.execute(bizDemoRequest, appUrl);
        System.err.println(JacksonUtils.toJson(result));
    }

    @Data
    static class SpiBizDemoRequest implements JddRequest<SpiBizDemoResponse> {

        private String name;
        private String age;

        @Override
        public String getApiMethod() {
            return "/spi/v1/ghw-url/test_spi_02";
        }

        @Override
        public String getJsonParams() {
            return JacksonUtils.toJson(this);
        }

        @Override
        public Class getResponseClass() {
            return SpiBizDemoResponse.class;
        }

        @Override
        public String getRequestTime() {
            return DateUtils.formatDate(new Date(), "yyyyMMddHHmmssSSS");
        }
    }

    @EqualsAndHashCode(callSuper = true)
    @Data
    static class SpiBizDemoResponse extends BaseJddResponse {

    }
}

主要关注传参这部分

在这里插入图片描述

以我调用“查询灵工合同信息”接口为例,对应的请求参数实体如下:

在这里插入图片描述

响应参数继承“BaseJddResponse”,加上对应的返回参数就可以了,具体如下:

在这里插入图片描述

还有这个

在这里插入图片描述

具体内容如下:

package com.jdd.open.demo.esu.smapi;

import com.jddglobal.open.client.JddClient;
import com.jddglobal.open.request.base.HttpBizDemoRequest;
import com.jddglobal.open.response.base.HttpBizDemoResponse;
import com.jddglobal.open.support.config.EsuSdkConfig;
import com.jddglobal.open.support.util.JacksonUtils;

public class SmapiDemoInvoker {

    public static void main(String[] args) throws Exception {
        // 设置配置文件路径,默认为如下值,可不设置
        JddClient jddClient = EsuSdkConfig.getJddClient();
        HttpBizDemoRequest request = new HttpBizDemoRequest();
        request.setBal(123);

        HttpBizDemoResponse adaptResponse = jddClient.execute(request);
        System.out.println(JacksonUtils.toJson(adaptResponse));
    }
}

这个发送请求参数和公共参数的案例,需要在“resources”中加上案例中的如下文件:

在这里插入图片描述

感觉麻烦了点,后面修改参数也不方便。

3、引入对应依赖

这里插一句,如果不想跑demo,想要直接用笔者改造后的工具类,可以看“4、改造后的依赖”。

在项目中京灵平台的案例会发现报错,需要引入对应的依赖包,在根目录的“lib”目录下

在这里插入图片描述

关键是这三个jar包

在这里插入图片描述
引入的方式可以在项目中加上“lib”目录引入,也可以安装到本地maven仓库再引入,可以自行百度,或者看这里。

其他的依赖包有对应的maven依赖,具体如下:

“bcprov-jdk15on”对应依赖如下:

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

目前最高版本为“1.70”,但据我测试,最多使用“1.66”版本,再高就不行了,“1.66”版本依赖如下:

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.66</version>
</dependency>

“bcpkix-jdk15on”对应的依赖如下:

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

目前最高版本也是“1.70”,但最多只能使用“1.66”,再高就不行了,“1.66”版本依赖如下:

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.66</version>
</dependency>

“gson”对应的依赖如下:

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

虽然“gson”从始至终都没有用到。。。

4、改造后需要的依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<!--阿里巴巴相关依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.42</version>
</dependency>

<!--https://hutool.cn/docs/#/?id=%f0%9f%93%a6%e5%ae%89%e8%a3%85-->
<!--hutool工具包相关依赖-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<!--调用京灵平台需要,只能1.66版本及以下,版本高了调用京灵平台接口会报错-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.66</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<!--调用京灵平台需要-->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<!--调用京灵平台需要-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
</dependency>

<!--京灵平台依赖包,sdk的核心处理包,通讯、加解密、加验签等-->
<!--这是本地依赖,需要拿到京灵平台的jar包导入到本地maven仓库-->
<dependency>
    <groupId>com.jddglobal.open</groupId>
    <artifactId>jddglobal_open_sdk</artifactId>
    <version>1.6.1</version>
</dependency>

<!--京灵平台依赖包,商户请求响应实体类-->
<!--这是本地依赖,需要拿到京灵平台的jar包导入到本地maven仓库-->
<dependency>
    <groupId>com.jddglobal.open</groupId>
    <artifactId>jdd_api_domain</artifactId>
    <version>1.0.0</version>
</dependency>

<!--京灵平台依赖包,JD加解密SDK-->
<!--这是本地依赖,需要拿到京灵平台的jar包导入到本地maven仓库-->
<dependency>
    <groupId>com.jddglobal.open</groupId>
    <artifactId>wyaks_security</artifactId>
    <version>1.1.0</version>
</dependency>

5、测试调用

因为嫌京灵平台的调用方式麻烦,这里就自己改造了一下,只是调用部分,完整的代码在“工具类”中。这是“查询灵工合同信息”接口的测试案例

在这里插入图片描述

这是调用返回结果

在这里插入图片描述

三、工具类

1、配置dto

package com.zsp.demo.jl.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * 京灵平台参数
 *
 * @author:gan
 * @date: 2024-04-25 11:36
 */
@Data
public class JLConfig implements Serializable {

    /**
     * 京灵平台请求地址
     */
    private String url;

    /**
     * 京灵平台appId
     */
    private String appId;

    /**
     * 京灵平台用户公钥
     */
    private String publicKey;

    /**
     * 京灵平台用户私钥
     */
    private String privateKey;

    /**
     * 京灵平台服务端密钥系统类型
     */
    private String jddKeyType;

    /**
     * 京灵平台服务端密钥系统类型
     */
    private String appKeyType;

    /**
     * 京灵平台加密算法,支持 3DES_RSA,无特殊要求不需要修改
     */
    private String encryptType;

    /**
     * 京灵平台加签算法,支持 SHA256withRSA
     */
    private String signType;

    //====================以下为非必填参数

    /**
     * 京灵平台财税服务商id
     */
    private String serviceCompanyId;

    /**
     * 京灵平台系统id
     */
    private String sysId;

    /**
     * 京灵平台token
     */
    private String token;

    /**
     * 京灵平台客户端盐值,AKS 加密方式不需要(传值)
     */
    private String md5Salt;

    /**
     * 京灵平台,http请求代理ip
     */
    private String host;

    /**
     * 京灵平台,http请求代理端口
     */
    private String port;

    /**
     * 京灵平台,国密证书存在路径(证书存放位置支持绝对路径和jar资源文件目录下)
     */
    private String path;

    /**
     * 京灵平台,国密证书打开的密码
     */
    private String password;
}

2、公共参数dto

package com.zsp.demo.jl.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * 公共参数
 *
 * @author:gan
 * @date: 2024-05-29 18:13
 */
@Data
public class CommonParams implements Serializable {

    /**
     * 请求号,全局唯一,不参与业务逻辑
     */
    @JsonProperty("requestNo")
    private String requestNo;

    /**
     * 请求时间,格式: yyyyMMddHHmmss
     */
    @JsonProperty("reqTime")
    private String reqTime;

    /**
     * 请求时间,格式: yyyyMMddHHmmss
     */
    @JsonProperty("requestTime")
    private String requestTime;

    /**
     * 鉴权标识
     */
    @JsonProperty("token")
    private String token;

    /**
     * 请求数据对象
     */
    @JsonProperty("requestData")
    private Object requestData;

    /**
     * 京接入系统唯一标识(由京灵侧提供)
     */
    @JsonProperty("sysId")
    private String sysId;
}

3、请求参数dto

这里以“查询灵工合同信息”接口为例,需要调用其他接口针对性添加

package com.zsp.demo.jl.dto;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.jddglobal.open.request.base.JddRequest;
import com.jddglobal.open.support.util.JacksonUtils;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 查询灵工合同信息,请求参数
 *
 * @author:gan
 * @date: 2024-05-09 11:19
 */
@Data
public class QueryFreelancerContractInfoParams extends CommonParams implements JddRequest<QueryFreelancerContractInfoResult>, Serializable {

    /**
     * 灵工身份证号
     */
    private String certNo;

    /**
     * 服务商Id
     */
    private String serviceCompanyId;

    @Override
    public String getApiMethod() {
        return "/smapi/v1/ffp-common/queryFreelancerContractInfo";
    }

    @Override
    public String getJsonParams() {
        return JacksonUtils.toJson(this);
    }

    @Override
    public Class getResponseClass() {
        return QueryFreelancerContractInfoResult.class;
    }

    @Override
    public String getRequestTime() {
        return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN);
    }
}

4、响应参数dto

这里以“查询灵工合同信息”接口为例,需要调用其他接口针对性添加

package com.zsp.demo.jl.dto;

import com.jddglobal.open.response.base.BaseJddResponse;
import lombok.Data;

import java.io.Serializable;

/**
 * 查询灵工合同信息,响应参数
 *
 * @author:gan
 * @date: 2024-05-09 11:28
 */
@Data
public class QueryFreelancerContractInfoResult extends BaseJddResponse implements Serializable {

    /**
     * 合同id
     */
    private String contractId;

    /**
     * 合同名称
     */
    private String contractName;

    /**
     * 签约时间
     */
    private String signTime;

    /**
     * 签约人
     */
    private String freelancerName;

    /**
     * 服务商id
     */
    private String serviceCompanyId;

    /**
     * 服务商名称
     */
    private String serviceCompanyName;

    /**
     * 灵工身份证号
     */
    private String certNo;

    /**
     * 合同文件地址
     */
    private String contractUrl;

}

4、调用工具类(重要)

其中“VerifyUtil”是自己写的判空工具类,放在了这里,也可以用自己的方式判空。

package com.zsp.demo.jl.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.jddglobal.open.client.DefaultJddClient;
import com.jddglobal.open.client.JddClient;
import com.jddglobal.open.request.base.JddRequest;
import com.jddglobal.open.support.app.AppInfo;
import com.jddglobal.open.support.http.HttpClientConfig;
import com.jddglobal.open.support.security.GMKeyStore;

import com.zsp.demo.jl.dto.*;
import com.zsp.demo.utils.VerifyUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 京灵平台相关工具类
 *
 * @author:gan
 * @date: 2024-04-25 11:28
 */
public class JLUtils {

    private static final Logger log = LoggerFactory.getLogger(JLUtils.class);

    public static void main(String[] args) throws Exception {

        JLConfig jlConfig = new JLConfig();
        jlConfig.setAppId("你的AppId");
        jlConfig.setJddKeyType("AKS");
        jlConfig.setPublicKey("京灵平台demo中的公钥");
        jlConfig.setAppKeyType("PAIR");
        jlConfig.setPrivateKey("通过京灵技术提供的秘钥工具生成的秘钥");
        jlConfig.setMd5Salt("");
        jlConfig.setEncryptType("3DES_RSA");
        jlConfig.setSignType("SHA256withRSA");
        jlConfig.setUrl("请求地址");

        jlConfig.setServiceCompanyId("你的服务商id");
        jlConfig.setSysId("你的系统id");
        jlConfig.setToken("你的token");

        //这两个一般不设置,demo中也是这样
//        jlConfig.setHost("127.0.0.1");
//        jlConfig.setPort("1111");

        //============================查询灵工合同信息 接口测试================================
        QueryFreelancerContractInfoParams queryFreelancerContractInfoParams = new QueryFreelancerContractInfoParams();
        queryFreelancerContractInfoParams.setCertNo("你的测试身份证号");
        queryFreelancerContractInfoParams.setServiceCompanyId("你的服务商id");

        JSONObject responseJsonObject = JLUtils.sendRequest(jlConfig, queryFreelancerContractInfoParams);
    }

    /**
     * 发送请求
     * @param config  京灵平台配置
     * @param requestParams  请求参数
     * @return
     * @throws Exception
     */
    public static JSONObject sendRequest(JLConfig config, CommonParams requestParams) throws Exception {
        List<String> noEmptyFiledList = Arrays.asList("url", "appId", "publicKey", "privateKey", "jddKeyType", "appKeyType", "encryptType", "signType");
        VerifyUtil.checkBeanByNonEmptyFieldList(config, noEmptyFiledList, "京灵平台配置");

        AppInfo appInfo = new AppInfo();
        appInfo.setAppId(config.getAppId());
        appInfo.setOpenPublicKey(config.getPublicKey());
        appInfo.setAppPrivateKey(config.getPrivateKey());
        appInfo.setMd5Salt(config.getMd5Salt());
        appInfo.setEncryptType(config.getEncryptType());
        appInfo.setSignType(config.getSignType());
        appInfo.setJddKeyType(AppInfo.JddKeyTypeEnum.valueOf(config.getJddKeyType()));
        appInfo.setAppKeyType(AppInfo.AppKeyTypeEnum.valueOf(config.getAppKeyType()));

        if (AppInfo.AppKeyTypeEnum.CER.equals(appInfo.getAppKeyType())) {
            appInfo.setKeystore(GMKeyStore.getKeystore(config.getPath(), config.getPassword()));
        }

        HttpClientConfig httpClientConfig = new HttpClientConfig
                .Builder()
                .proxyHost(VerifyUtil.isNotEmpty(config.getHost()) ? config.getHost() : null)
                .proxyPort(VerifyUtil.isNotEmpty(config.getPort()) ? Integer.parseInt(config.getPort()) : null)
                .build();

        JddClient jddClient = new DefaultJddClient(config.getUrl(), appInfo, httpClientConfig);

        JLUtils.setCommonParams(config, requestParams);

        JSONObject responseJsonObject = JSONObject.parseObject(JSONObject.toJSONString(jddClient.execute((JddRequest) requestParams)));

        log.info("京灵平台响应结果:{}", responseJsonObject);
        return responseJsonObject;
    }

    /**
     * 发送请求
     * @param config  京灵平台配置
     * @param requestParams  请求参数
     * @param objectClass  响应参数class
     * @return
     * @throws Exception
     */
    public static <T> T sendRequest(JLConfig config, CommonParams requestParams, Class<T> objectClass) throws Exception {
        JSONObject responseJsonObject = JLUtils.sendRequest(config, requestParams);

        JSONObject bizContent = JLUtils.getBizContent(responseJsonObject);

        //如何没有成功 “responseData” 为空
        JSONObject responseData = bizContent.getJSONObject("responseData");

        VerifyUtil.checkParam(responseData, "响应结果中的【responseData】不存在!");

        return JSONObject.parseObject(responseData.toString(), objectClass);
    }

    /**
     * 获得响应结果参数中的bizContent
     * @param responseJsonObject  响应结果参数
     * @return
     * @throws Exception
     */
    public static JSONObject getBizContent(JSONObject responseJsonObject) throws Exception {
        if(!"00000".equals(responseJsonObject.getString("code"))) {
            throw new RuntimeException(responseJsonObject.getString("msg"));
        }

        JSONObject bizContent = responseJsonObject.getJSONObject("bizContent");

        VerifyUtil.checkParam(bizContent, "响应结果中的【bizContent】不存在!");

        if (!"00000".equals(bizContent.getString("code"))) {
            throw new RuntimeException(bizContent.getString("msg"));
        }

        return bizContent;
    }

    /**
     * 获得响应结果参数中的responseData,返回对应实体
     * @param responseJsonObject  响应结果参数
     * @param objectClass  响应参数class
     * @return
     * @throws Exception
     */
    public static <T> T getResponseDataObject(JSONObject responseJsonObject, Class<T> objectClass) throws Exception {
        JSONObject bizContent = JLUtils.getBizContent(responseJsonObject);

        //如何没有成功 “responseData” 为空
        JSONObject responseData = bizContent.getJSONObject("responseData");

        VerifyUtil.checkParam(responseData, "响应结果中的【responseData】不存在!");

        return JSONObject.parseObject(responseData.toString(), objectClass);
    }

    /**
     * 获得响应结果参数中的responseData,返回对应实体集合
     * @param responseJsonObject  响应结果参数
     * @param objectClass  响应参数class
     * @return
     * @throws Exception
     */
    public static <T> List<T> getResponseDataList(JSONObject responseJsonObject, Class<T> objectClass) throws Exception {
        JSONObject bizContent = JLUtils.getBizContent(responseJsonObject);

        List<T> responseDataList = null;  //返回数据集合
        try {
            responseDataList = JSONObject.parseArray(bizContent.getString("responseData"), objectClass);
        } catch (JSONException e) {
            //e.printStackTrace();

            //出现这个异常大概率就是有分页
            responseDataList = JSONObject.parseArray(bizContent.getJSONObject("responseData").getString("dataList"), objectClass);
        }

        return responseDataList;
    }

    /**
     * 获取京灵平台公共分页结果
     * @param responseJsonObject
     * @return
     */
    public static CommonPageResult getCommonPageResult(JSONObject responseJsonObject) throws Exception {
        JSONObject bizContent = JLUtils.getBizContent(responseJsonObject);

        return JSONObject.parseObject(bizContent.getString("responseData"), CommonPageResult.class);
    }

    /**
     * 设置公共参数
     * @param config  京灵平台配置
     * @param params  请求参数
     */
    private static void setCommonParams(JLConfig config, CommonParams params) {
        String dateTime = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN);
        params.setRequestNo(IdUtil.getSnowflakeNextIdStr());
        params.setReqTime(dateTime);
        params.setRequestTime(dateTime);
        params.setToken(config.getToken());
        params.setSysId(config.getSysId());

        params.setRequestData(handleRequestParams(params));
    }

    /**
     * 处理请求参数
     * @param params  请求参数
     */
    private static Map handleRequestParams(Object params) {
        List<Map> fieldsInfo = VerifyUtil.getFieldsInfo(params);

        Map requestMap = new HashMap();
        for (Map map : fieldsInfo) {
            requestMap.put(map.get("name"), map.get("value"));
        }

        return requestMap;
    }

    /**
     * 是否请求成功
     * @param responseJsonObject
     * @return
     */
    public boolean isSuccess(JSONObject responseJsonObject) {
        return "00000".equals(responseJsonObject.getString("code"));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站&#xff1a;OPEN IMAGES 2、准备标签labels 网站&#xff1a;CVAT 有点是&#xff1a;支持直接导出yolo格式的标…

Stirling-PDF 安装和使用教程

PDF (便携式文档格式) 目前已经成为了文档交换和存储的标准。然而&#xff0c;找到一个功能全面、安全可靠、且完全本地化的 PDF 处理工具并不容易。很多在线 PDF 工具存在隐私和安全风险&#xff0c;而桌面软件往往价格昂贵或功能有限。那么&#xff0c;有没有一种解决方案能够…

Java知识点整理 12 — 前端 Ant Design Pro 初始化模板使用

一. 项目初始化 Ant Design Pro 是基于 Ant Design 和 umi 封装的一整套企业级中后台前端设计框架&#xff0c;致力于在设计规范和基本组件的基础上&#xff0c;继续向上构建&#xff0c;提炼出典型模板或配套设计资源&#xff0c;进一步提升企业级中后台产品设计研发过程中的…

【学习笔记】Hive

Hive 作为数仓应用工具&#xff0c;对比 RDBMS&#xff08;关系型数据库&#xff09; 有3个“不能”&#xff1a; 不能像 RDBMS 一般实时响应&#xff0c;Hive 查询延时大&#xff1b; 不能像 RDBMS 做事务型查询&#xff0c;Hive 没有事务机制&#xff1b; 不能像 RDBMS 做行…

理解论文笔记:基于AHP和模糊综合评价的无线传感器网络可维护性评估方法

作为一个研0的娃,这是我认真读的第一篇论文,想着笔记让自己能看懂。如有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 翻译:第二部分简要介绍了无线传感器网络的维护,并对影响系统的因素…

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】

请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…

打破数据分析壁垒:SPSS复习必备(十一)

一、方差分析 方差分析的应用条件如下&#xff1a; &#xff08;1&#xff09;独立&#xff0c;各组数据相互独立&#xff0c;互不相关&#xff1b; &#xff08;2&#xff09;正态&#xff1a;即各组数据符合正态分布&#xff1b; &#xff08;3&#xff09;方差齐性&…

【第十八课】区域经济分析——探索性空间数据分析软件实操

一、前言 ArcGIS有专门处理探索性空间数据分析方法的工具,即地统计分析模块。 该模块主要由三个功能模块组成:探索性数据分析(Explore)、地统计分析向导(Geostatistical Wizard),以及生成数据子集(Create Subsets)。其中利用 这些基本功能模块,可以方便完成多种地统…

RPC架构基本结构和核心技术

当你在构建一个分布式系统时&#xff0c;势必需要考虑的一个问题是&#xff1a;如何实现服务与服务之间高效调用&#xff1f;当然&#xff0c;你可以使用Dubbo或Spring Cloud等分布式服务框架来完成这个目标&#xff0c;这些框架帮助我们封装了技术实现的复杂性。那么&#xff…

Spring Boot 整合 JSP

Spring Boot 是一个开源的 Java 框架&#xff0c;用于创建独立、生产级的基于 Spring 框架的应用程序。它简化了基于 Spring 的应用程序的创建和部署过程。JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术&#xff0c;允许开发者在 HTML 中嵌入 Java 代码。将 …

基于UDP的网络聊天室(多线程实现收和发消息)

要求&#xff1a;1.有新用户登录&#xff0c;其他在线的用户可以收到登录信息 2.有用户群聊&#xff0c;其他在线的用户可以收到群聊信息 3.有用户退出&#xff0c;其他在线的用户可以收到退出信息 4.服务器可以发送系统信息 效果图&#xff1a; service.c #include <head…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台&#xff0c;其在云原生应用开发和部署中具有广泛的应用。然而&#xff0c;由于一些安全或网络限制&#xff0c;一些组织可能选择在内部网络…

计算机专业课面试常见问题-计算机网络篇

目录 1. 计算机网络分为哪 5 层&#xff1f; 2. TCP 协议简述&#xff1f; 3. TCP 和 UDP 的区别&#xff1f;->不同的应用场景&#xff1f; 4. 从浏览器输入网址到显示页…

论文阅读MVBench: A Comprehensive Multi-modal Video Understanding Benchmark

摘要(Abstract)&#xff1a; 论文介绍了MVBench&#xff0c;这是一个全新的多模态视频理解基准测试&#xff0c;旨在评估多模态大型语言模型&#xff08;MLLMs&#xff09;在视频理解方面的能力。 目前许多基准测试主要集中在静态图像任务的空间理解上&#xff0c;而忽视了动…

云计算【第一阶段(21)】引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

Marin说PCB之total etch length规则知多少?

魔都上海最近迎来了一轮梅雨季节了&#xff0c;小编我上周就已经提前把被子衣服袜子都晒了一遍&#xff0c;省的后面一段时间下雨就不能晒了。这种阴雨绵绵的天气当然在家里睡觉最舒服了&#xff0c;上周留正当我在家里夏眠的时候&#xff0c;突然被一阵手机铃声吵醒了&#xf…

Spring Boot如何实现跨域资源共享(CORS)?

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…

ArkTS开发系列之Web组件的学习(2.9)

上篇回顾&#xff1a;ArkTS开发系列之事件&#xff08;2.8.2手势事件&#xff09; 本篇内容&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 一、知识储备 Web组件就是用来展示网页的一个组件。具有页面加载、页面交互以及页面调试功能 1. 加载网络…

多商户万能DIY商城小程序源码系统 支持自营+独立部署 带完整的安装代码包以及搭建教程

系统概述 多商户万能 DIY 商城小程序源码系统是一个综合性的电商平台解决方案&#xff0c;旨在满足不同用户的多样化需求。它不仅支持自营模式&#xff0c;还为多商户入驻提供了广阔的空间&#xff0c;使平台能够汇聚各类商品和商家&#xff0c;形成一个丰富多样的商业生态。 …