Java对接外部接口

 /**
     * 获取设施农基本消息表上报数据
     *
     * @param jbxxRequest
     * @return SfBdjbxx
     * @author 梁伟浩
     * @Date 2024-12-18 15:35:19
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String reportBdjbxxInfo(JbxxRequest jbxxRequest) {
        LambdaQueryWrapper<SfBdjbxx> queryWrapper=new LambdaQueryWrapper<>();
        if (jbxxRequest.getXmmc() != null && !jbxxRequest.getXmmc().isEmpty()) {
            queryWrapper.eq(SfBdjbxx::getXmmc, jbxxRequest.getXmmc());
        }
        if (jbxxRequest.getInstId() != null && !jbxxRequest.getInstId().isEmpty()) {
            queryWrapper.eq(SfBdjbxx::getInstId, jbxxRequest.getInstId());
        }
        List<SfBdjbxx> sfBdjbxxes = mapper.selectList(queryWrapper);
        if (!sfBdjbxxes.isEmpty()){
            // Token
            String token = "";
            try {
                //获取部登录接口token
                String performedLogin = this.performLogin();
                // 解析 JSON 字符串
                JSONObject jsonObject = JSONUtil.parseObj(performedLogin);
                JSONObject data = jsonObject.getJSONObject("data");
                // 获取 token 字段的值
                if (data != null) {
                    token =  data.getStr("token");
                }else {
                    throw new BusinessException("获取登录接口token失败"+jsonObject.getJSONObject("msg"));
                }
                System.out.println(performedLogin);
            }catch (Exception e){
                throw new BusinessException("获取登录接口token失败"+e.getMessage());
            }
            SfBdjbxx sfBdjbxx = sfBdjbxxes.get(0);
            try {
                //调用部接口
                String sendPostRequest = this.sendPostRequest(reportPartUrl, sfBdjbxx, token);
                //更新基本信息表
                if (sendPostRequest!=null){
                    // 解析 JSON 字符串
                    JSONObject jsonObject = JSONUtil.parseObj(sendPostRequest);
                    JSONObject data = jsonObject.getJSONObject("data");
                    if (data != null) {
                        sfBdjbxx.setProjid(data.getStr("projId"));
                        sfBdjbxx.setProjnum(data.getStr("projNum"));
                        sfBdjbxx.setChangeid(data.getStr("changeId"));
                        sfBdjbxx.setSfsb("已上报");
                        mapper.updateById(sfBdjbxx);
                        System.out.println("=====上报数据成功["+data+"]");
                    }else {
                        throw new BusinessException("数据上报部接口失败"+sendPostRequest);
                    }
                }
            } catch (IOException e) {
                throw new BusinessException("数据上报部接口失败"+e.getMessage());
            }
        }
        return "上报数据部接口成功";
    }
  • 获取token
   /**
     * 获取登录接口 token
     * @author 梁伟浩
     * @Date 2024-12-19 9:18
     */
    public String performLogin() throws IOException {
        // 使用 Hutool HttpRequest 发送 POST 请求
        String encrypt = AESVueUtil.aesEncrypt(password); //密码加密
        HttpResponse response = HttpRequest.post(loginUrl)
                .form("username", username)
                .form("password", encrypt)
                .form("tenantCode", tenantCode)
                .form("isUserphoneCode", "0")
                .form("captcha", "0")
                .form("loginType", "0")
                .execute();
        // 判断响应是否成功,处理返回值
        if (response.getStatus() != 200) {
            throw new IOException("获取部登录接口token失败" + response.getStatus());
        }
        // 获取响应内容
        String responseBody = response.body();
        if (responseBody != null && !responseBody.isEmpty()) {
            return responseBody;
        }
        return "获取接口登录token失败";
    }
  • 处理上报逻辑
  /**
     * 数据上报发送 POST 请求部接口
     * @param url 请求部接口路径
     * @param sfBdjbxx 请求数据
     * @author 梁伟浩
     * @Date 2024-12-18 16:42:19
     */
    public String sendPostRequest(String url, SfBdjbxx sfBdjbxx, String token) throws IOException {
        //推送对接部接口 reportPartUrl
        Map<String, Object> params = new HashMap<>();
        //处理项目用途字典转换
        String ssnylx = sfBdjbxx.getSsnylx();
        ssnylx = ssnylx.replaceAll("[\\[\\]\"]", ""); // 去掉 [ ] 和 "
        List<String> ids = Arrays.asList(ssnylx.split(","));
        // 获取对应的 code 并用英文逗号隔开
        String codes = ids.stream()
                .map(ProjectCategoryEnum::getCodeById)
                .filter(Objects::nonNull) // 过滤掉可能为 null 的值
                .collect(Collectors.joining(","));
        // 请求参数修改
        // params.put("sysIsBlxm", 0);
        params.put("projName", sfBdjbxx.getXmmc());
        params.put("projOrgP", String.format("%-6s", sfBdjbxx.getShengjxzq()).replace(' ', '0'));
        params.put("projOrgC", String.format("%-6s", sfBdjbxx.getSjxzq()).replace(' ', '0'));
        params.put("projOrgCo", sfBdjbxx.getXjxzq());
        params.put("changeStartDate", sfBdjbxx.getKssj());
        params.put("changeEndDate", sfBdjbxx.getJssj());
        params.put("changeCuruse",codes);
        params.put("curuseName", sfBdjbxx.getXmflmc());
        params.put("projOrgX", sfBdjbxx.getXzxzqmc());
        params.put("projOrgXc",sfBdjbxx.getCunzhuang());
        // 将请求参数转换为JSON字符串
        String jsonData = mapToJson(params);
        System.out.println("=====获取基本消息表上报数据"+jsonData);
        try {
            HttpResponse response = HttpRequest.post(url)
                    .header("Content-Type", "application/json; charset=utf-8")
                    .header("token",  token)
                    .header("User-Agent", "PostmanRuntime/7.30.0")
                    .header("Accept", "*/*")
                    .header("Connection", "keep-alive")
                    .body(jsonData)
                    .execute();

            // 获取响应内容
            String responseString = response.body();
            if (responseString != null && !responseString.isEmpty()) {
                return responseString;
            }
        }catch (Exception e){
            throw new BusinessException("数据上报请求部接口失败"+e.getMessage());
        }
        return null;
    }
  • 处理参数为文件格式
  @Override
    public String reportVector(String instId) throws IOException {
        //获取对应到矢量压缩包
        File tempFile = null;
        try {
            // 查询实例信息
            SfBdjbxx sfBdjbxx = mapper.selectById(instId);
            if (sfBdjbxx == null) {
                throw new RuntimeException(String.format("数据[%s]不存在", instId));
            }
            // 检查状态
            String changeid = sfBdjbxx.getChangeid();
            String projid = sfBdjbxx.getProjid();
            if (!"已上报".equals(sfBdjbxx.getSfsb()) || changeid == null || projid  == null) {
                throw new RuntimeException(String.format("数据[%s]请先上报,再上传矢量数据", instId));
            }
            // 查询压缩包信息
            InstTxtFileEntity instTxtFileEntity = instTxtFileMapper.selectOne(
                    new LambdaQueryWrapper<InstTxtFileEntity>()
                            .eq(InstTxtFileEntity::getInstId, instId)
                            .eq(InstTxtFileEntity::getTabType, 0)
                            .like(InstTxtFileEntity::getFileName, "-矢量数据.zip")
            );
            if (instTxtFileEntity == null || instTxtFileEntity.getFileUrl() == null) {
                throw new RuntimeException("未找到对应的矢量压缩包信息");
            }

            String fileUrl = instTxtFileEntity.getFileUrl();

            // 从 MinIO 获取 InputStream
            InputStream inputStream = fileService.getObject(fileUrl);
            if (inputStream == null) {
                throw new RuntimeException("无法从 MinIO 获取文件:" + fileUrl);
            }

            // 获取登录接口 token
            String performedLogin = this.performLogin();
            JSONObject jsonObject = JSONUtil.parseObj(performedLogin);
            JSONObject data = jsonObject.getJSONObject("data");
            String token = (data != null) ? data.getStr("token") : null;

            if (token == null || token.isEmpty()) {
                throw new BusinessException("获取登录接口 token 失败:" + jsonObject.getStr("msg"));
            }

            // 创建临时文件
            tempFile = File.createTempFile("tempZipFile", ".zip");
            try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
            } finally {
                // 确保 InputStream 被关闭
                inputStream.close();
            }

            // 调用上传部接口
            HttpResponse response = HttpRequest.post(vectorUrl)
                    .header("Content-Type", "multipart/form-data")
                    .header("token", token)
                    .header("User-Agent", "PostmanRuntime/7.30.0")
                    .form("projId", projid)
                    .form("changeId",changeid)
                    .form("file", tempFile)
                    .execute();

            // 检查响应状态码
            if (response.getStatus() == 200) {
                return response.body();
            } else {
                throw new IOException("上传失败,状态码:" + response.getStatus() + ",响应内容:" + response.body());
            }
        } catch (Exception e) {
            // 捕获所有异常,确保临时文件被清理
            throw new IOException("获取图斑矢量上报数据失败:" + e.getMessage(), e);
        } finally {
            // 删除临时文件
            if (tempFile != null && tempFile.exists()) {
                boolean deleted = tempFile.delete();
                if (!deleted) {
                    System.err.println("临时文件删除失败:" + tempFile.getAbsolutePath());
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java中的战斗机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值