智能医学工程-计算机程序设计-实验10:接口程序设计

289 阅读8分钟

一、实验目的

1、通过安装使用Postman发送请求测试API,了解网络请求的定义以及网络请求的基本步骤;

2、掌握通过Java程序来访问第三方API。

二、实验学时

2学时

三、实验类型

验证性

四、实验需求

1、硬件

每人配备计算机1台,建议优先使用个人计算机开展实验。

2、软件

安装Postman,用于API测试。

安装IntelliJ IDEA,以及Java运行所需要的相关基础环境。

3、网络

本地主机能够访问互联网和实验中心网络。

4、工具

无。

五、实验任务

1、在本地电脑上下载安装Postman工具;

2、通过Postman工具发送请求来测试API;

3、编写一段Java程序,通过该程序来访问上一步任务中所请求的API地址;

4、验证通过不同方式来发送请求,服务器端返回的结果是否符合预期。

六、实验内容及步骤

1、安装Postman

  1. Postman安装程序可通过以下地址进行下载(根据不同的操作系统下载不同的安装包)。

www.postman.com/downloads/

  1. 执行安装程序并依照向导完成软件安装。

2、通过Postman工具发送请求来测试API

  1. 验证不带参数的POST请求
{
    "inputDrugLists": [
        {
            "EXAM_SUBCLASS_NAME": "妇科门诊",
            "chander": [
                {
                    "DEPT_NAME": "妇科门诊",
                    "EXAM_SUBCLASS_NAME": "妇科彩超",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "2020"
                },
                {
                    "DEPT_NAME": "妇科门诊",
                    "EXAM_SUBCLASS_NAME": "心电图",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "2020"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "16排CT",
            "chander": [
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "腹部",
                    "SERIAL_NO": 4,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "公共",
                    "SERIAL_NO": 7,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "颈部",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "四肢",
                    "SERIAL_NO": 6,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "头颅",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "胸部",
                    "SERIAL_NO": 3,
                    "DEPT_CODE": "3010"
                },
                {
                    "DEPT_NAME": "16排CT室",
                    "EXAM_SUBCLASS_NAME": "腰、骶",
                    "SERIAL_NO": 5,
                    "DEPT_CODE": "3010"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "彩超",
            "chander": [
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "产科彩超",
                    "SERIAL_NO": 13,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "腹部脏器",
                    "SERIAL_NO": 3,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "公共",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "浅表器官",
                    "SERIAL_NO": 4,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "心脏彩超",
                    "SERIAL_NO": 14,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "血管彩超",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "3003"
                },
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "子宫附件",
                    "SERIAL_NO": 12,
                    "DEPT_CODE": "3003"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "心电图",
            "chander": [
                {
                    "DEPT_NAME": "彩超室",
                    "EXAM_SUBCLASS_NAME": "心电图",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3003"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "DR",
            "chander": [
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "尺桡骨",
                    "SERIAL_NO": 12,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "腹部",
                    "SERIAL_NO": 4,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "跟骨",
                    "SERIAL_NO": 22,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "骨盆",
                    "SERIAL_NO": 8,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "股骨",
                    "SERIAL_NO": 17,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "肩关节",
                    "SERIAL_NO": 9,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "脚",
                    "SERIAL_NO": 21,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "颈椎",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "手",
                    "SERIAL_NO": 14,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "锁骨",
                    "SERIAL_NO": 23,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "头部",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "腕关节",
                    "SERIAL_NO": 13,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "膝关节",
                    "SERIAL_NO": 18,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "胸部",
                    "SERIAL_NO": 3,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "胸椎",
                    "SERIAL_NO": 5,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "腰椎",
                    "SERIAL_NO": 6,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "肘关节",
                    "SERIAL_NO": 11,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "子宫造影",
                    "SERIAL_NO": 24,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "肱骨",
                    "SERIAL_NO": 10,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "胫腓骨",
                    "SERIAL_NO": 19,
                    "DEPT_CODE": "3001"
                },
                {
                    "DEPT_NAME": "放射科1",
                    "EXAM_SUBCLASS_NAME": "踝关节",
                    "SERIAL_NO": 20,
                    "DEPT_CODE": "3001"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "MRI",
            "chander": [
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "颈椎",
                    "SERIAL_NO": 7,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "头颅",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "膝关节",
                    "SERIAL_NO": 8,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "下肢",
                    "SERIAL_NO": 6,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "胸",
                    "SERIAL_NO": 3,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "腰、骶",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "3009"
                },
                {
                    "DEPT_NAME": "核磁共振",
                    "EXAM_SUBCLASS_NAME": "髋",
                    "SERIAL_NO": 4,
                    "DEPT_CODE": "3009"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "胃肠镜",
            "chander": [
                {
                    "DEPT_NAME": "胃镜室",
                    "EXAM_SUBCLASS_NAME": "14碳",
                    "SERIAL_NO": 2,
                    "DEPT_CODE": "3007"
                },
                {
                    "DEPT_NAME": "胃镜室",
                    "EXAM_SUBCLASS_NAME": "公共",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "3007"
                }
            ]
        },
        {
            "EXAM_SUBCLASS_NAME": "常规体检",
            "chander": [
                {
                    "DEPT_NAME": "急诊科",
                    "EXAM_SUBCLASS_NAME": "健康证体检",
                    "SERIAL_NO": 1,
                    "DEPT_CODE": "2001"
                }
            ]
        }
    ],
    "resultCode": "0",
    "resultDesc": "查询成功"
}
    • 操作步骤

  1. 验证带参数的POST请求
{
    "ExamClass": "彩超",
    "ExamSubClass": "血管彩超"
}
    • 出参示例:
{
    "inputDrugLists": [
        {
            "DESCRIPTION_CODE": "CCSZYD001",
            "PRICE": 108.3,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "左上肢血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 108.3,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCSZYD003",
            "PRICE": 108.3,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "右上肢血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 108.3,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "220400002",
            "PRICE": 40.5,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "四肢多普勒血流图",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 40.5,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCSZYD002",
            "PRICE": 108.3,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "左下肢血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 108.3,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCHK00022",
            "PRICE": 216.6,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "双上肢静脉彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 216.6,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCHK00021",
            "PRICE": 216.6,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "双上肢动脉彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 216.6,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCHK00023",
            "PRICE": 216.6,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "双下肢动脉彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 216.6,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCHK00025",
            "PRICE": 135.4,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "颈部血管",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 135.4,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCSZYD0012",
            "PRICE": 108.3,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "四肢血管彩超(单肢)",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 108.3,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCHK00024",
            "PRICE": 216.6,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "双下肢静脉彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 216.6,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCSZYD004",
            "PRICE": 108.3,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "右下肢血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 108.3,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCFBYD0008",
            "PRICE": 90,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "腹部大血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 90,
            "EXAM_SUB_CLASS": "血管彩超"
        },
        {
            "DESCRIPTION_CODE": "CCSSYD0006",
            "PRICE": 117,
            "CLINIC_ITEM_CLASS": "D",
            "DESCRIPTION": "双肾及肾血管彩超",
            "EXAM_CLASS": "彩超",
            "PERFORM_BY": "3003",
            "CHARGES": 117,
            "EXAM_SUB_CLASS": "血管彩超"
        }
    ],
    "resultCode": "0",
    "resultDesc": "查询成功"
}
    • 操作步骤

3、编写一段Java程序来发送Http请求访问上一步任务中的API地址

  1. 以下示例代码中模拟了客户端发送请求并打印输出返回结果,该示例中使用的为Java8版本,Java11及以上版本也可引用HttpClient所封装好的方法来实现,或者引用其他第三方如org.apache.http也可以。
  2. 该示例代码中引用了JSONObject,需要在项目pom.xml文件中进行配置。

import org.json.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpDemo {

    public static void main(String[] args) throws IOException {
        // 创建HttpURLConnection对象
        // http://123.56.60.184:8888/examine
        // http://123.56.60.184:8888/examRptPattern
        String url = "http://123.56.60.184:8888/examine";

        URL obj = new URL(url);
        // 打开连接
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // 设置请求方法为POST
        con.setRequestMethod("POST");

        // 设置请求头
        con.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        con.setRequestProperty("Accept", "application/json");

        // 设置请求体
        // JSONObject jsonObject = new JSONObject();
        // jsonObject.put("ExamClass", "彩超");
        // jsonObject.put("ExamSubClass", "血管彩超");
        // String jsonData = jsonObject.toString();
        // byte[] postDataJson = jsonData.getBytes(StandardCharsets.UTF_8);

        // 发送POST请求并获取返回数据
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.write(postDataJson);
        wr.flush();
        wr.close();

        // 获取响应码
        int responseCode = con.getResponseCode();
        System.out.println("\n发送'POST'请求到: " + url);
        System.out.println("Post请求入参: " + jsonObject);
        System.out.println("出参: " + responseCode);

        // 读取服务器返回的数据
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        // 关闭连接
        in.close();

        // 打印结果
        System.out.println(response.toString());

    }
}
  1. 观察打印输出的出参结果是否与Postman测试的结果一致。

七、实验考核

本实验考核采用【实验随堂查】方式开展。

每个实验完成后,在实验课上通过现场演示的方式向实验指导教师进行汇报,并完成现场问答交流。

每个实验考核满分100分,其中实验成果汇报60分,现场提问交流40分。

实验考核流程:

(1)学生演示汇报实验内容的完成情况,实验指导老师现场打分。

(2)指导老师结合实验内容进行提问,每位学生提问2-3个问题,根据回答的情况现场打分。

(3)实验考核结束后,进行公布成绩。