医院系统接口对接实战:从 WSDL 到 HTTP 的全流程解析
在医院信息化系统对接中,经常会遇到 “两个接口地址”“WebService 与 HTTP 联网”“代理类使用” 等问题。比如为什么医院和我们各自要提供一个接口地址?WebService 的代理类到底起什么作用?HTTP 联网和 WebService 联网有什么区别?本文结合实际场景,用通俗的语言讲清这些核心问题。
一、为什么有两个接口地址?各自是干什么的?
在医院系统对接中,你会遇到两个关键地址,这两个地址本质是 “双向通信的出入口”,分工不同:
1. 医院提供的接口地址(如 C13 系统调用地址)
医院给的地址是一个 WSDL(Web Services Description Language)地址,比如:https://IP/XXX/XXX/XXX.XXXXXXXXXXXXX?WSDL=1
作用:这是医院系统对外开放的 “服务入口”,供我们的系统调用医院的功能。医院在这个地址里定义了可调用的方法(比如HIPMessageServer),以及方法需要的参数(action功能码和messageXML 数据)。
- 比如我们要给医院回传检查状态(MES0003)或注册文档(MES0006),就需要调用这个地址的
HIPMessageServer方法,传入对应的功能码和 XML 数据。
2. 我们提供的接口地址(如申请单推送地址)
我们给医院的地址也是一个 WSDL 地址,比如:
http://IP:port/XXXXXXXXX?wsdl
作用:这是我们系统对外开放的 “服务入口”,供医院向我们推送数据。这个地址里定义了我们能接收的方法(比如AddRisAppBillService),医院会按照这个 WSDL 的规范,将患者的检查申请单数据推送到我们的系统。
简单说:两个地址是 “双向车道”—— 医院的地址是 “我们给医院发数据的入口”,我们的地址是 “医院给我们发数据的入口”,缺一不可。
二、WSDL 地址是怎么来的?为什么能自动生成?
你提到 “自己的 WSDL 地址是自动生成的”,这个理解是对的。WSDL 本质是 “接口说明书”,它的生成和部署密切相关:
- 我们先写代码定义接收逻辑:比如我们要接收医院的申请单,会写一个服务类(如
AddRisAppBillService),定义好接收数据的方法和参数(比如申请单号、患者信息等)。 - 部署到服务器:将代码部署到服务器(比如 Tomcat),服务器会自动根据代码中的服务类和方法,生成对应的 WSDL “说明书”。
- 生成地址:服务器的 IP、端口(如 8080)、项目上下文路径(如 /webService)加上服务名(如 myService),再加上
?wsdl,就构成了完整的 WSDL 地址。
医院提供的 WSDL 地址也是同样的道理:他们开发好服务代码并部署后,服务器自动生成 WSDL,供我们调用。
三、WebService 对接核心:代理类到底怎么用?
WebService 对接的关键是 “代理类”,很多人觉得它抽象,其实它的作用很简单:帮你搞定复杂的网络传输和数据格式转换,让你像调用本地方法一样调用远程服务。
1. 代理类是怎么来的?
医院给我们 WSDL 地址后,我们可以用工具(如 Axis2、CXF)解析这个 WSDL,自动生成一批 Java 类 —— 这些就是 “代理类”。比如解析医院的HIPMessageServer方法后,会生成包含该方法的代理类,以及对应的请求参数类(如HIPMessageServerRequest)和响应类(如HIPMessageServerResponse)。
2. 代理类的作用:简化调用流程
没有代理类时,你需要手动处理网络连接、XML 打包、数据发送等复杂操作;有了代理类,这些工作全由它代劳。比如用代理类调用医院的HIPMessageServer方法,流程是这样的:
// 1. 创建代理类实例(自动连接医院的服务地址)
HIPMessageServerProxy proxy = new HIPMessageServerProxy();// 2. 构建请求参数:功能码(action)和XML数据(message)
String action = "MES0003"; // 闭环状态回传
String message = "<XML>...</XML>"; // 按医院接口文档构建的XML// 3. 调用代理类的方法(底层自动处理网络传输、XML发送)
HIPMessageServerResponse response = proxy.HIPMessageServer(action, message);// 4. 处理响应(代理类已自动解析返回的XML)
if ("0".equals(response.getRetCode())) {System.out.println("回传成功");
} else {System.out.println("回传失败:" + response.getRetMsg());
}
核心:你只需要关注 “传什么参数” 和 “怎么处理结果”,网络交互的细节全由代理类搞定。
3. 获取信息和回传信息的逻辑:大同小异
无论是getBookInfo(获取申请单信息)还是uploadResult(回传检查结果),用 WebService 对接的逻辑是一致的,差异仅在于 “发送的 XML 内容” 和 “功能码”:
获取信息(如查询申请单):你需要构建一个包含 “查询条件” 的 XML(比如患者 ID、申请单号),指定功能码(比如医院定义的 “查询功能码”),通过代理类发送给医院。医院返回包含申请单详情的 XML,你解析后存入
BookInfo实体类。回传信息(如闭环状态):你需要构建一个包含 “检查结果” 的 XML(比如患者 ID、检查值、状态),指定功能码(如 MES0003),通过代理类发送给医院。医院返回 “成功 / 失败” 的响应,你根据响应处理后续逻辑。
四、HTTP 联网和 WebService 联网有什么区别?
你之前提到过 HTTP 联网的代码(传 JSON),它和 WebService(传 XML,用代理类)是两种不同的联网方式,核心区别如下:
1. 医院需要提供什么?
- WebService:只需要提供 WSDL 地址,里面已经包含了所有信息(方法名、参数、数据格式)。
- HTTP:需要提供更详细的规则:
- 接口 URL(如
http://医院IP:端口/接口路径); - 请求方法(如 POST);
- 请求头(如
Content-Type: application/json); - 数据格式(如 JSON 的字段规范);
- 响应格式(如返回 JSON 中的
code代表成功 / 失败)。
- 接口 URL(如
2. 代码实现有什么不同?
WebService(用代理类):重点是 “解析 WSDL 生成代理类→调用代理方法→处理响应”,无需手动处理网络细节。
HTTP(用 HttpURLConnection 等):需手动处理所有步骤:
// 1. 创建连接 URL url = new URL("医院提供的HTTP地址"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 2. 设置请求信息 conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json");// 3. 发送JSON数据 String json = "{\"patientId\":\"123\",\"type\":\"查询\"}"; conn.getOutputStream().write(json.getBytes());// 4. 读取响应 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String response = reader.readLine();// 5. 解析JSON到BookInfo BookInfo bookInfo = parseJsonToBookInfo(response);
3. 什么时候用哪种方式?
- 医院提供 WSDL 地址时,优先用WebService(代理类简化调用);
- 医院只提供 HTTP 接口规则(URL、JSON 格式等)时,用HTTP 联网。
五、常见问题总结
为什么获取信息和回传信息都需要 XML?XML 是 WebService 约定的数据格式:获取信息时,XML 是 “查询条件”(告诉医院查什么);回传时,XML 是 “结果数据”(告诉医院检查结果)。
代理类的方法都一样吗?方法名可能相同(比如都叫
HIPMessageServer),但通过不同的action功能码和 XML 内容区分不同操作(查询 / 回传)。我们的 WSDL 地址需要自己写吗?不需要。只要你写好接收医院数据的服务代码(如
AddRisAppBillService),部署到服务器后,服务器会自动生成 WSDL 地址,你只需把这个地址提供给医院即可。
六、一句话总结
医院和我们的两个 WSDL 地址是 “双向通信的出入口”;WebService 的代理类是 “简化远程调用的工具人”;HTTP 联网则是 “更手动的直接通信方式”。无论用哪种方式,核心都是 “按对方的规则传数据,解析返回的结果”—— 理解了这一点,医院系统对接就清晰多了。
