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

2021/5/2 18:28:58

本文主要是介绍WebService接口学习(二):如何从本系统调用第三方系统的方法(适合本系统做第三方的代理),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

首先我们要知道第三方系统是怎么实现的方法,得找到该方法,从而我们才能调用,通过网页的按钮调试来找到。
因为我想挂号,我找到对应的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一个了。



这篇关于WebService接口学习(二):如何从本系统调用第三方系统的方法(适合本系统做第三方的代理)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程