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

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

  • 一、准备
    • 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("Wkmsd8XY6eY8kr7O9mLswLpXcxCs2uX9");
        appInfo.setEncryptType("ENV_RSA"); // 加密算法,支持 NONE、RSA、ENV_RSA
        appInfo.setSignType("MD5_RSA"); // 加签算法,支持 MD5_RSA、SHA1withRSA
        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder().build();
        String serverUrl = "http://127.0.0.1:1058"; // 服务端调用地址!
        SpiInnerClient spiInnerClient = new SpiInnerClient(serverUrl, appInfo, httpClientConfig);*/

        /*AKS*/
        AppInfo appInfo = new AppInfo();
        appInfo.setAppId("Wkmsd8XY6eY8kr7O9mLswLpXcxCs2uX9");
        appInfo.setEncryptType("3DES_RSA"); //加密算法,支持 3DES_RSA
        appInfo.setSignType("SHA256withRSA"); // 加签算法,支持 SHA256withRSA
        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder().build();
        String serverUrl = "http://127.0.0.1:1058"; // 服务端调用地址!
        SpiInnerClient spiInnerClient = new SpiInnerClient(serverUrl, appInfo, httpClientConfig);

        /*国密*/
        /*AppInfo appInfo = new AppInfo();
        appInfo.setAppId("Wkmsd8XY6eY8kr7O9mLswLpXcxCs2uX9");
        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"; // 服务端调用地址!
        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.mfbz.cn/a/757357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费翻译API及使用指南——百度、腾讯

目录 一、百度翻译API 二、腾讯翻译API 一、百度翻译API 百度翻译API接口免费翻译额度&#xff1a;标准版&#xff08;5万字符免费/每月&#xff09;、高级版&#xff08;100万字符免费/每月-需个人认证&#xff0c;基本都能通过&#xff09;、尊享版&#xff08;200万字符免…

matlab中simulink仿真软件的基础操作

&#xff08;本内容源自《详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真》 刘学勇编著的第二章内容&#xff0c;有兴趣的可以阅读该书&#xff09; 例&#xff1a;简单系统输入为两个不同频率的正弦、余弦信号&#xff0c;输出为两信号之和&#xff0c;建立模型。 在…

webpack源码深入--- webpack的编译主流程

webpack5的编译主流程 根据watch选项调用compiler.watch或者是compiler.run()方法 try {const { compiler, watch, watchOptions } create();if (watch) {compiler.watch(watchOptions, callback);} else {compiler.run((err, stats) > {compiler.close(err2 > {callb…

使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面

目录 资源准备&#xff1a;需要准备三张照片&#xff1a;商品图、向下图标、金钱图标 1.显示效果&#xff1a; 2.源码&#xff1a; 资源准备&#xff1a;需要准备三张照片&#xff1a;商品图、向下图标、金钱图标 1.显示效果&#xff1a; 定义了一个购物车页面的布局&#x…

[方法] Unity 3D模型与骨骼动画

1. 在软件中导出3D模型 1.1 3dsmax 2014 1.1.1 TGA转PNG 3dsmax的贴图格式为tga&#xff0c;我们需要在在线格式转换中将其转换为Unity可识别的png格式。 1.1.2 模型导出 导出文件格式为fbx。在导出设置中&#xff0c;要勾选三角算法&#xff0c;取消勾选摄像机和灯光&#…

mysql解压版本安装5.7

1. 官网下载好解压版本 我这边5.7版本 https://dev.mysql.com/downloads/file/?id523570 mysql官网 创建 my.ini文件 内容如下 [client] #客户端设置&#xff0c;即客户端默认的连接参数# socket /data/mysqldata/3306/mysql.sock #用于本地连接的socket套接字 # 默…

运维锅总详解HAProxy

本文尝试从HAProxy简介、HAProxy工作流程及其与Nginx的对比对其进行详细分析&#xff1b;在本文最后&#xff0c;给出了为什么Nginx比HAProxy更受欢迎的原因。希望对您有所帮助&#xff01; HAProxy简介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款广泛使…

【知识学习】阐述Unity3D中Profile和性能的概念及使用方法示例

在Unity3D中&#xff0c;"Profile"和"性能"是两个相关但不同的概念&#xff0c;它们在游戏开发中扮演着重要的角色。 Profile&#xff08;配置文件&#xff09; "Profile"在Unity中通常指的是一种配置文件&#xff0c;它包含了一系列的设置和参…

JAVA医院绩效考核管理系统源码:系统优势、系统目的、系统原则 (自主研发 功能完善 可直接上项目)

JAVA医院绩效考核管理系统源码&#xff1a;系统优势、系统目的、系统原则 &#xff08;自主研发 功能完善 可直接上项目&#xff09; 医院绩效考核系统优势 1.实现科室负责人单独考核 对科室负责人可以进行单独考核、奖金发放。 2. 科室奖金支持发放到个人 支持奖金二次分配&…

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源&#xff1a; 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中&#xff0c;如果你看到“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的”这样的提示&#xff0c;通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤&#xff1a; 解决办法&#xff1a;…

Bridging nonnull in Objective-C to Swift: Is It Safe?

Bridging nonnull in Objective-C to Swift: Is It Safe? In the world of iOS development, bridging between Objective-C and Swift is a common practice, especially for legacy codebases (遗留代码库) or when integrating (集成) third-party libraries. One importa…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。&#xff08;持续更新&#xff09; 问题&#xff1a; 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候&#xff0c;有时候不生效有时候生效&#xff0c;一度让我怀疑自己记忆错乱。后来…

揭秘Etched AI:三个哈佛辍学00后挑战英伟达,推出Transformer专用ASIC芯片sohu

人工智能领域最近掀起了一股新的热潮&#xff0c;三位哈佛辍学的00后本科生创建了Etched AI&#xff0c;并成功推出了一款超强AI芯片sohu&#xff0c;直指英伟达的AI芯片帝国。这款芯片被誉为比英伟达H100快20倍&#xff0c;吸引了众多科技界的关注。本文将深入探讨Etched AI及…

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…

Linux Doxygen快速生成文档

此前写过一篇编写Doxygen格式的注释以用于生成文档,点击以查阅, Doxygen常用语法与字段记录,但是当时用的windows桌面版的doxygen,最近使用ubuntu编写代码想直接使用doxygen生成,故写下此博客 Doxygen Doxygen是一个用于生成软件文档的工具&#xff0c;它可以从代码中提取注释…

工业自动化控制中心

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace 工业自动化控制中心 {public partial class Form1 : Form{public Form1(){InitializeComponent();}pri…

【智能算法】目标检测算法

目录 一、目标检测算法分类 二、 常见目标检测算法及matlab代码实现 2.1 R-CNN 2.1.1 定义 2.1.2 matlab代码实现 2.2 Fast R-CNN 2.2.1 定义 2.2.2 matlab代码实现 2.3 Faster R-CNN 2.3.1 定义 2.3.2 matlab代码实现 2.4 YOLO 2.4.1 定义 2.4.2 matlab代码实现…

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…