
# 通用接口使用概述
token为login以后返回的登录信息，每次调用新的接口都需要使用登录后的token
stringHashMap记录了访问接口的命令和接口名称的关联的键值对，后续有详细使用介绍。
```
private static String baseUrl = "https://192.168.32.77";
private static String token;  
private static HashMap<String, String> stringHashMap = new HashMap<String, String>();
```
![](https://support.huaweicloud.com/ideahub-api/public_sys-resources/note_3.0-zh-cn.png)
main函数的成员变量需要修改成此次需要访问环境的IP地址。这里IP地址https://192.168.32.77仅为格式举例
主函数调用四个基础接口，initSeesionId, login, changeSeesionId 和 callMethodByName.
前三个接口分别为3.3小节登录认证的请求会话ID， 登录Login 和 改变SessionId 三个模块 ， 第四个接口为反射方法， 通过反射调用Main中对应的函数接口。
![](https://support.huaweicloud.com/ideahub-api/public_sys-resources/note_3.0-zh-cn.png)
每一个接口使用前都必须有initSeesionId和login的操作。
```
/**
     * 主函数入口
     *
     * @param args 用户输入的参数
     */
 public static void main(String[] args) {
        args = new String[]{"WEB_CallSiteAPI","api","Change_Me"};
        if(args.length<=2){
             return;
        }
        initSeesionId();
        token = login(HttpClientUtil.sessionId, args);
        if (TextUtils.isEmpty(token)) {
            systemPrint("login failed");
            return;
        }
        changeSeesionId();
        callMethodByName(args);
    }
```
callMethodByName 内容如下，参数args中带有了需要访问的method名称，所有的method需要在Main的成员变量[stringHashMap]中。
以访问LogOut方法举例说明如下，args中带有Method参数名Logout, 则for循环中遍历stringHashMap中的所有键值对，找到LogOut中对应的Main
的成员函数名称为LogOut. 下面则是一系列反射操作，先通过路径com.device.terminal.Main获取类对象。
```
Method mth = obj.getClass().getDeclaredMethod(methodName, String[].class);//为需要被反射的方法，可以有参数可以无参数。
mth.invoke(obj, (Object) args);//为调用反射方法的调用逻辑。
```
```
/**
     * 通过参数找到方法  通过方法名调用方法
     *
     * @param args 用户输入的参数
     */
    private static void callMethodByName(String[] args) {
        if (!(args.length == 3 || args.length == 4)) {
            systemPrint("Parameter error");
            return;
        }
        String methodName = null;
        for (String key : stringHashMap.keySet()) {
            if (key.contains(args[0])) {
                methodName = stringHashMap.get(key);
            }
        }
        if (TextUtils.isEmpty(methodName)) {
            systemPrint("Parameter error");
            return;
        }
        try {
            Class clz = Class.forName("com.device.terminal.Main");
            Object obj = clz.newInstance();
            if (args.length == 3) {
                // 获取无参方法
                Method mth = obj.getClass().getDeclaredMethod(methodName);
                mth.invoke(obj);
            } else if (args.length == 4) {
                // 获取有参方法
                Method mth = obj.getClass().getDeclaredMethod(methodName, String[].class);
            }
        } catch (Exception e) {
            systemPrint("Parameter error");
        }
    }
```
 #### stringHashMap
```
private static HashMap<String, String> stringHashMap = new HashMap<String, String>();
     static {
        stringHashMap.put("WEB_CallSiteAPI", "WEB_CallSiteAPI");
        stringHashMap.put("CancelCallAPI", "CancelCallAPI");
        stringHashMap.put("Logout", "Logout");
        stringHashMap.put("WEB_ScheduleConfAPI", "WEB_ScheduleConfAPI");
        stringHashMap.put("BaseMess", "BaseMess");
    }
```
由此，调用一个通用接口的使用方法总结如下。
1. 修改main函数中args = new String\[\] {"","",""}中的调用命令。
2. 添加一个被调用成员函数，在其中写函数接口。
3. 在stringHashMap中新增一个键值对。键需要和main函数中的args = new String\[\] {"","",""} 的第一个参数保持一致，值需要与被调用成员函数的名称保持一致。
 
