ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WebService接口学习(二):如何从本系统调用第三方系统的方法(适合本系统做第三方的代理)

2021-05-02 17:30:39  阅读:174  来源: 互联网

标签:从本 String get jsonArray 系统 patientInforReqVO toString return 第三方


首先我们要知道第三方系统是怎么实现的方法,得找到该方法,从而我们才能调用,通过网页的按钮调试来找到。
因为我想挂号,我找到对应的Controller层的方法

/**
     * 提交挂号信息
     * @param reqVO
     * @return
     */

    @PostMapping(value = "/addRegisterInfor")
    public BaseResponse<String> addRegisterInfor(@RequestBody @Validated RegisterInforReqVO reqVO) {

        return iRegisterService.addRegisterInfor(reqVO);
    }

然后顺着业务层找到了如下方法:

/**
     * 保存挂号记录
     *
     * @param reqVO
     * @return
     */
    @Override
    public BaseResponse<String> addRegisterInfor(RegisterInforReqVO reqVO) {
    ...
    }

这时候我就开心,这不简单了,但事情却没有这么简单,看下去就知道了
我开始写接口了

@WebMethod
        String requestPatient(String patientInfo);
@Override
    public String requestPatient(String patientInfo) {
    //这里开始有问题,在调用的过程时候iRegisterService为NULL
        return iRegisterService.requestPatient(patientInfo);
    }

在第三方系统写了要怎么调用的实现方法

//注册对外请求接口
    public  String requestPatient(String patientInfo) {
        try {
            JSONArray jsonArray=JSONArray.fromObject(patientInfo);
            PatientInforReqVO patientInforReqVO=new PatientInforReqVO();
            patientInforReqVO.setName(jsonArray.getJSONObject(0).get("username").toString());
            patientInforReqVO.setIdCard(jsonArray.getJSONObject(0).get("idcard").toString());
            patientInforReqVO.setSex(jsonArray.getJSONObject(0).get("sex").toString());
            patientInforReqVO.setNationality(jsonArray.getJSONObject(0).get("nation").toString());
            patientInforReqVO.setBirthday(jsonArray.getJSONObject(0).get("birthday").toString());
            patientInforReqVO.setAddress(jsonArray.getJSONObject(0).get("address").toString());
            patientInforReqVO.setCardId(jsonArray.getJSONObject(0).get("cardid").toString());
            patientInforReqVO.setTelphone(jsonArray.getJSONObject(0).get("cellphone").toString());
            //new RegisterServiceImpl()这个导致业务层对象为空,我当时想着调用本层的方法,但行不通
          	new RegisterServiceImpl().addPatientInfor(patientInforReqVO);
            return "success";
        }catch (Exception e)
        {
            e.printStackTrace();
            //调用发送失败详细信息方法

            return e.toString();
        }
    }

new RegisterServiceImpl()导致生成了新的业务层对象,新的对象里各个@Autowired的属性肯定是空的,这样在webservice接口手动注入的对象全部没用上了,其实当时我还没发现,我是写了本系统的方法调试过程才发现的,所以说调试很重要!!!

先说个思路,webservice接口调用从Controller层开始,我感觉一开始就要从Controller开始比较好,手动注入Controller对象,方法在上一篇有。

然后可以写本系统的接口调用方法了

public static String requestPatient(String method,String parm){
		try{
			Client c = getClient();
			// 调用接口,parm为需要给第三方系统的数据
			Object[] os = c.invoke(method,parm);
			return os[0].toString();

		}catch (Exception e){
			e.printStackTrace();
			return e.toString();
		}
	}

在Controller层写了

@ResponseBody
	@RequestMapping("/doAdd")
    public Object doAdd(Patient patient){
        AjaxResult result=new AjaxResult();
        int count=0;
        try {
            List<Patient> patientList=new ArrayList<Patient>();
            //把从实体类对象信息添加到List中
            patientList.add(patient);
            //把List转换成JSON字符串
            String request= JSONUtil.listToJson(patientList);
            //调用webservice接口来给his传注册信息。
            String reply= WebServiceUtil.requestPatient("requestPatient",request);
            //如果收到success,证明his保存用户信息成功,不成功的话返回his给我们的错误
            if(reply.equals("success")){
                count= patientService1.savePatient(patient);
            }else {
                result.setSuccess(false);
                result.setMessage(reply);
            }
            result.setSuccess(count==1);
        }catch (Exception e){
            result.setSuccess(false);
            e.printStackTrace();
            result.setMessage("注册失败!");
        }
        return result;
    }

这样就写好了,但是事情并没有简单,我们发现数据传到第三方系统,在我写的解析数据方法出了问题,
我之前写了

JSONArray jsonArray=JSONArray.fromObject(patientInfo);

我以为得到的是JSONArray,结果里面剥开看,是JSONObject,导致我用数组下标取不了数据库

jsonArray.getJSONArray(0).get(0).toString();

后来在调试的过程中发现了是JSONObject就用

jsonArray.getJSONObject(0).get("username").toString()

来找对应的key的值。
然后就可以

iRegisterService.addPatientInfor(patientInforReqVO);

保存数据库了,iRegisterService是后来更改在Controller层调用了,不在new一个了。

标签:从本,String,get,jsonArray,系统,patientInforReqVO,toString,return,第三方
来源: https://blog.csdn.net/weixin_41262132/article/details/116354945

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有