精华内容
下载资源
问答
  • Jmockit对接口与基类的mock

    千次阅读 2016-06-07 18:51:10
    Jmockit对接口与基类的mock对一个类或接口使用@Capturing,那么该类的所有子类或接口所有实现都将处于mocked状态,即使是临时定义的实现或子类也会是mocked状态接口示例://接口 public interface JInterface { ...

    Jmockit对接口与基类的mock

    对一个类或接口使用@Capturing,那么该类的所有子类或接口所有实现都将处于mocked状态,即使是临时定义的实现或子类也会是mocked状态

    接口示例:

    //接口
    public interface JInterface
    {
        public String methodA(String para);
    }
    //实现
    public class ImplA implements JInterface
    {
        public String methodA(String para)
        {
            return "oringinal methodA " + para;
        }
    }
    

    Mock测试

    @Test
    public void test1(@Capturing final JInterface jInterface)//JInterface接口被mocked
    {
        JInterface i = new ImplA();
        System.out.println(i.methodA("d"));//null 因为被mocked
    
        new NonStrictExpectations()
        {
            {
                jInterface.methodA(anyString);
                returns("first mocked impl method", "second mocked impl method");//
            }
        };
    
        System.out.println(i.methodA("ohad")); //record的第一个结果first mocked impl method
    
        //新定义的实现也将处于mocked状态
        JInterface i3 = new JInterface()
        {
    
            public String methodA(String para)
            {
                // TODO Auto-generated method stub
                return null;
            }
        };
    
        System.out.println(i3.methodA("dpfiojaoifh")); //record的第二个结果second mocked impl method
    }
    

    继承示例:

    //父类
    public abstract class Base
    {
        abstract public String methodA();
    }
    //子类
    public class ExtendA extends Base
    {
        @Override
        public String methodA()
        {
            return "original method";
        }
    

    Mock测试

    @Test
    public void test4(@Capturing final Base base)
    {
        Base obj = new ExtendA();
        System.out.println(obj.methodA());//null
    
        new NonStrictExpectations()
        {
            {
                base.methodA();
                //这里相当于returns(Object firstValue, Object... remainingValues)
                result = "mocked method1";
                result = "mocked method2";
            }
        };
    
        System.out.println(obj.methodA());//mocked method1
    
        Base obj1 = new Base()
        {
    
            @Override
            public String methodA()
            {
                return null;
            }
        };
    
        System.out.println(obj1.methodA());//mocked method2
    }
    
    展开全文
  • 最近实现一个功能,在访问dao层方法前...由此做了以下总结:一、关于注解继承问题对于接口,在接口中的注解无论如何都不能被继承,不论是子接口继承父接口的情况还是接口的实现类的情况,不论是对接口上还是接口中的...

    最近实现一个功能,在访问dao层方法前需要切换数据源,通过自定义注解+AOP实现:AOP中拦截被注解的方法,实现数据源切换。Dao层用mybatis实现,注解加在Mapper接口中的方法上。但是AOP无法对加了自定义注解的方法进行拦截。由此做了以下总结:

    一、关于注解继承问题

    对于接口,在接口中的注解无论如何都不能被继承,不论是子接口继承父接口的情况还是接口的实现类的情况,不论是对接口上还是接口中的方法上的注解,都不能,以上经过测试所得。

    对于类,注解上使用@Inherited标注,类上的注解可以被继承。 @Inherited表示该类上的注解可以被注解,与方法上的注解的继承性无关。

    对于类中方法上的注解,若子类覆写了父类带注解方法,从子类无法获取到注解。子类未覆写父类带注解方法,可以通过子类获得注解。与注解是否标注@Inherited无关。

    其实,注解在方法中,没有所谓继承问题,只有重写问题。如果注解在父类方法中,如果方法没有被子类重写,那么调用的是父类的方法,那么注解是存在的,如果方法被子类重写,子类方法没有注解,那么调用子类方法就获取不了注解

    二、关于在接口的方法中加注解作为拦截点,拦截失败的原因:

    1、AOP使用jdk动态代理的情况

    接口中的注解无法被实现类继承,AOP中的切点无法匹配上实现类,所以并不会为实现类创建代理(根据是否被满足注解条件来判断是否创建代理,标红部分经过测试所得),所以我们使用的还是原始的未被代理的对象,所以就不会被拦截到了。

    2、AOP使用cglib动态代理的情况

    在不存在切点注解继承的情况,AOP可进行有效拦截(cglib动态代理)。但是考虑以下存在注解继承的情况

    有类Parent,类Sub,Sub继承自Parent。根据注解的继承原则,切点注解在父类方法,

    若Sub覆写了父类所有带注解方法,实际Sub中并未被AOP标识,所有spring并不会为Sub创建代理类,也就不会被拦截。

    若Sub覆写了父类部分带注解方法,spring会为Sub创建代理类,对于覆写了父类的方法,由于注解未被继承,不会被拦截;未覆写的方法,可以被拦截。

    所以,对于我遇到的问题:在mybatis中,加在Mapper接口方法上的注解无法被拦截可以做以下解释

    mybatis本身会使用jdk动态代理来为我们生成一个Mapper接口的实现类,实际上我们的aop是在对这个Mapper的实现类创建代理(使用cglib代理)。由注解继承规则,该实现类的方法并不能继承接口方法上的注解,因而spring也就无法为该实现类生成代理,aop也就拦截失败。


    展开全文
  • 前端如何与后端对接口

    千次阅读 2021-03-05 16:12:11
    接口状态码: http://10.1.240.200:8080/swagger-ui.html 接口文档

    导语:前端写好了页面如何与后端对接口,下面是一篇看图步骤说明,更方便大家去理解操作。

    调接口的步骤:

    1、serve定义请求的url
    2、action里面定义方法
    3、页面调用action方法
    4、接口通了返回数据就绑定数据到页面

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    接口状态码:
    在这里插入图片描述
    如何找接口:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • react对接口-获取数据篇

    千次阅读 2018-10-23 12:05:01
    一、在src目录下创建的api.js文件,里面写你需要接口,api文件名取名最好规范一点 import { stringify } from 'qs';//这里都是固定的 import request from '../utils/request';//这里都是固定的 // 接口调用 /...

    基于antd的后台管理系统数据接口对接

    一、在src目录下创建的api.js文件,里面写你需要对的接口,api文件名取名最好规范一点

    import { stringify } from 'qs';//这里都是固定的
    import request from '../utils/request';//这里都是固定的
    
    // 接口调用
    
    // 更新
    export async function upCategorySet(params) {
      return request(`/api/user/city/CategorySet/update`, {
        method: 'PUT',
        body: params,
      });
    }
    // 添加
    export async function addCategorySet(params) {
      return request(`/api/user/city/CategorySet/store`, {
        method: 'POST',
        body: params,
      });
    }
    // 获取数据
    export async function getRecordList(params) {
      return request(`/api/user/marketAction/getRecordList?${stringify(params)}`, {
        method: 'GET',
      });
    }
    // 获取数据
    export async function getRecordList(params) {
      return request(`/api/user/marketAction/getRecordList?${stringify(params)}`);
    }
    // 删除
    export async function delCategorySet(params) {
      return request(`/api/user/city/CategorySet/destroy`, {
        method: 'DELETE',
        body: params,
      });
    }
    复制代码

    以上是调接口的方式,默认情况下是get请求,get请求可以直接写接口,因为$后面是发送请求携带的参数。

    二、在models层下面创建一个文件夹,文件夹下面创建一个.js文件,如cityInformation/cityInformation,其实取名也是有规范的。

    import { message } from 'antd';
    import {
    getRecordList,
    delCategorySet,
    } from '../../services/cityInformation'; //cityInformation就是api文件,{}里面的内容就是接口名
    
    export default {
      namespace: 'cityInformation',//命名空间,与文件名最好一直,方便其他地方直接调用
      state: { // 初始数据
        msg: null,
        data: {},
      },
      // 一定要有一个effects还有一个reducers
      // effects里面放接口
      // reducers里面放接口返回的数据
      effects: {
        *getRecordList({ payload }, { call, put }) {//*后面的名字与call的第一个参数一致,这里可以说就是真正的接口吧
          const response = yield call(getRecordList, payload); // payload调接口所需的数据
          yield put({
            type: 'dataState', //获取的数据存在dataState
            payload: response, // 返回的数据
          });
          return response; // response就是code msg 的返回,告诉调用接口是否成功,其实这里就是一个promise ,在下面有.then 
        },
        *delCategorySet({ payload }, { call, put }) {
          const response = yield call(delCategorySet, payload);
          yield put({
            type: 'dataState',
            payload: response,
          });
          return response;
        },
      reducers: {
        msgState(state, action) { //除了获取数据不放在这里,其他接口都要写在这里,其他接口返回的数据都放在msgState里面
          let { msg } = action.payload;
          if (!msg) {
            msg = JSON.parse(action.payload).msg;
          }
          if (typeof msg !== 'string') {
            msg = '操作失败';
          }
          message.info(msg);
          return {
            ...state,
            msg,
          };
        },
        dataState(state, action) {//只供获取数据的接口,返回的数据存储在dataStat里面,state里面就是旧的值,这里就是初始值
          const { data } = action.payload; // action就是个对象,里面有很多东西,获取到的data从中解构出来
          return {
            ...state, //获取到的data会覆盖初始值state里面的data
            data,
          };
        },
      },
      所以,reducers里面只要写一个 msgState以及一个dataState
    复制代码

    在我的认知里面,models下面的这个文件就是把接口封装一下,方便其他地方调用

    三、到达src/common/router.js文件下面找到具体页面,从浏览器地址栏复制路由,直接搜索,如下

        '/cityInformation/citySetting': { //浏览器地址路由
          component: dynamicWrapper(app, ['chart'], () =>
            import('../routes/CityInformation/CitySetting/CitySetting')//看这个地址找到roters目录下具体页面
          ),
        },
       // 里面chart是一个参数,这就跟命名空间有关系啦,下面就跟我们接口页面联系起来啦
       // 如果在model里面没有文件夹包着,chart就写成'cityInformation'
       // 如果这个页面的多个接口写在不同的Models里面,直接在[]里面加就行
           '/cityInformation/citySetting': { //浏览器地址路由
          component: dynamicWrapper(app, ['cityInformation/cityInformation'], () =>
            import('../routes/CityInformation/CitySetting/CitySetting')//看这个地址找到routers目录下具体页面
          ),
        },
    复制代码

    四、找到具体页面啦,接口调用就从这里开始啦

    第一步

    // 后面会用到
    const getValue = obj =>
      Object.keys(obj)
        .map(key => obj[key])
        .join(',');
    // 建立连接
    @connect(({ cityInformation, loading }) => ({ //@connect就是装饰器,注意,这里面有三个地方都有命名空间
      cityInformation,
      loading: loading.models.cityInformation,
    }))
    // 装饰器作用就是把当前页面与接口正式联系起来啦
    // 如果当前页面调用的接口存在另外一个models层里的文件,直接在后面加,除了loading: loading.models.cityInformation,不变
    @Form.create()
    复制代码

    第二步

    // 定义初始值
    export default class UserManagement extends PureComponent {
      state = { //state里面就是初始值,调接口携带的参数数据也是从这里获取的
        id:null,
        newVisible: false,
        visible: false,
        selectedRows: [],//选中的某一条数据
        formValues: {},
        page: 1, 
        pageNum: 10,
        data: { //所有数据都是以数组的形式包着的,每组里面有很多数据
          list: [],
          pagination: {//定义页码
            current: 1, //当前页
            pageSize: 10,//每页的条数
            total: 0,//总的数据条数
          },
        },
      };
    复制代码

    第三步

    // 其实获取数据的接口不一定要写在生命周期函数里,只是我个人习惯
    componentDidMount() {
        const { page, pageNum } = this.state;//page, pageNum是从state里面解构出来的
        const { dispatch } = this.props; //dispatch这才是调接口的方法,从props里面解构出来的
        const later = dispatch({ //这里开始调接口啦,封装成一个函数
          type: 'cityInformation/getUserLists',// 这里就是 命名空间/*后面的名字
          payload: { // 参数以对象的形式书写 原本page:page,这里写成page,减少代码量
            page,
            page_num: pageNum,
          },
        });
        later.then(() => {//因为调用了数据接口,数据货地了,页面数据更新
          const {
            cityInformation: { data },
          } = this.props; //data是获取的数据,后台返回的,数据获取到了,更新页面
          this.setState({
            data: {
              list: data.lists,
              pagination: {
                current: page,
                pageSize: pageNum,
                total: data.total,
              },
            },
          });
        });
      }
    复制代码

    第四步

    // 页面刷新,数据也会重新获取
    handleStandardTableChange = (pagination, filtersArg, sorter) => {
        const { formValues } = this.state;
        const filters = Object.keys(filtersArg).reduce((obj, key) => {
          const newObj = { ...obj };
          newObj[key] = getValue(filtersArg[key]);
          return newObj;
        }, {});
    
        const params = {
          currentPage: pagination.current,
          pageSize: pagination.pageSize,
          ...formValues,
          ...filters,
        };
        if (sorter.field) {
          params.sorter = `${sorter.field}_${sorter.order}`;
        }
        // 因为pagination发生变化的话,页面会刷新,数据会重新获取,所以会调用接口
        this.setState(
          {
            page: pagination.current,
            pageNum: pagination.pageSize,
          },
          () => {
            this.componentDidMount();
          }
        );
      };
    复制代码
      handleSelectRows = rows => { //选中某行获取某行的数据
        this.setState({
          selectedRows: rows,
        });
      };
    复制代码

    第五步

    // 页面渲染  
     render() {
        const { loading } = this.props;
        const { selectedRows } = this.state;
        // 下面{}里面的dataIndex一定要与接口返回的属性名一致
        const columns = [
        // 正常情况下跟id这里一样写的
          {
            title: 'ID',
            dataIndex: 'id',
          },
          // img 写成标签才能显示,因为ing返回的是一个图片地址
          // text 是当前dataIndex对应的值,record是整条数据所有的值
          {
            title: '头像',
            dataIndex: 'headimg',
            render: (text, record) => (
              <img src={record.tc_user.headimg} alt="头像" style={{ width: 30, height: 30 }} />
            ),
          },
          {
            title: '昵称',
            dataIndex: 'name',
            render: (text, record) => <span>{record.tc_user.name}</span>,
          },
          {
            title: '内容',
            dataIndex: 'content',
          },
          {
            title: '已拉黑',
            dataIndex: 'is_black',
            render: text => <span>{text === 0 ? '未拉黑' : '已拉黑'}</span>,
          },
          {
            title: '分类',
            dataIndex: 'category',
            render:(text)=>(
              <span>{text.name}</span>
            ),
          },
          // 返回的菜品是一个数组,里面单独的一项是text ,map一定要一个key,key里面的值保证唯一就行
          {
            title: '菜品列表',
            dataIndex: 'cart',
            render:(arr)=>{
              return arr.map((text)=>(<span key={text}>{text}<br /></span>)) 
            },
          },
          // 返回的是一个对象
          {
            title: '配送地址',
            dataIndex: 'address',
            render:(text)=>(
              <div>
                <span>{text.userName}<br /></span>
                <span>{text.telNumber}<br /></span>
                <span>{text.provinceName+text.cityName+text.countyName+text.detailInfo}<br /></span>//拼接
              </div>
            ),
          },
          // 三元运算
          {
            title: '是否显示',
            dataIndex: 'is_show',
            render:(text)=>(
              <span>{ text === 1? '显示' : '隐藏'}</span>
            ),
          },
          {
            title: '操作',
            dataIndex: 'operation',
            render: (text,obj) => ( // obj 就是个参数,写成record也行
              <div>
                {obj.is_black === 0 ? <Button onClick={()=>this.shielding(obj.id,1)}>拉黑</Button> : <Button onClick={()=>this.shielding(obj.id,0)}>取消拉黑</Button>}
              </div>
            ),
          },
        ];
        const { data } = this.state;//在此时data已经获取了,存在state里面
        return (
          <PageHeaderLayout title="用户管理">
            <StandardTable
              rowKey="id"  //这个一定要写,每条数据都有一个id
              selectedRows={selectedRows}
              loading={loading}
              data={data}//这是的data是上面解构出来的,因为要呈现在页面上
              columns={columns}
              onSelectRow={this.handleSelectRows}
            />
          </PageHeaderLayout>
        );
      }
    
    复制代码

    步骤 dispatch -> effects -> api.js -> reducers,这是我自己的理解

    以上都是根据我自己理解所整理的,作为一个前端菜鸟,刚学会调接口,所有的东西都带有我自己个人理解的方式,希望这篇文章能对于有需要的的朋友带来一定的帮助,同时也希望前辈们指出我的不足,我会继续努力的。

    转载于:https://juejin.im/post/5bcedcd06fb9a05d02613179

    展开全文
  • 我们为什么需要使用接口 比如说,我定义了一个Animal父类。 class Animal { public virtual void likeFood() { Console.WriteLine("我是Animal类"); } } 现在,有3个子类。子类继承父类Animal,分别叫:Dog, ...
  • postman带上token对接口进行测试

    万次阅读 2018-05-08 09:49:27
    根据验证码进行登陆,登录之后返回token、然后请求其他接口时在header头中带上token访问其他接口进行测试账户信息输入验证码登陆成功,看到返回的token我们这个项目可以刷新一下token,将上表中的token复制粘贴进...
  • JMeter对接口进行压力测试

    万次阅读 2016-05-09 14:49:19
    用于软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以...
  • 案例:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成之后,打印“请求完成”。实现代码:/** * 目标:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成后,打印...
  • QueryInfoController.java文件提供查询数据的接口; QueryService.java调用Dao层查询数据; QueryInfoControllerTest.javaQueryInfoController.java进行单元测试; 现分情况Mock进行说明: 1、...
  • 接口测试工具Postman接口测试图文教程

    万次阅读 多人点赞 2018-07-11 13:10:03
    市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。
  • 接口测试简介以及接口测试用例设计思路

    万次阅读 多人点赞 2018-09-07 11:50:27
    接口测试简介 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的...开发所谓的接口是模块模块之间的一种连接,而测试眼中的接口是一种协议(对接口的功能的一种定义) 2.接口的种类和分类 外部接...
  • Dubbo是Alibaba开源的分布式服务框架,它大的特点是按照分层的方式来架构,使用这种方式可以使各个...从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,那么如何它进行接口和性能测试呢?让我们一起学习一下
  • 异步处理的http接口进行性能测试

    千次阅读 2018-10-17 16:38:32
    以前对接口做性能测试,接口都是同步处理的,请求之后等待响应结果就知道处理结果了,这样只要看这个接口是否异常,如果无异常无报错记录这个接口的响应时间、TPS等性能指标进行分析就可以了,最近在工作中遇到了...
  • 压力测试就是要同时模拟多个用户同时对接口进行请求,最终看聚合报告来分析用户所需响应的时间。 Ramp-up Period(in seconds)字段代表的意思是运行所有线程数(Number if Threads)所需要的时间,并发的话就是设置0...
  • 接口

    万次阅读 2018-06-10 00:10:12
    接口(核心)基本概念:在之前讲解的类结构都包含有:普通属性,常量(全局常量),构造方法,抽象方法,但是如果说设计一个类的时候发现这个类的内部只存有全局常量和抽象方法的话,则这个类就能将其定义为接口接口...
  • JAVA基础——接口(全网最详细教程)

    万次阅读 多人点赞 2018-05-10 09:46:42
    Java基础——接口 接口概念 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的...
  • 接口测试用例和接口测试模板

    千次阅读 2019-05-05 17:25:00
     当今社会在测试领域,接口测试已经越来越多的被提及,被重视,而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试,很多测试人员在接触到接口测试的时候,也许对测试执行还可以比较顺利的...
  • Java接口详解

    千次阅读 多人点赞 2016-08-03 12:40:22
    Java 8对接口进行了改进,允许在接口中定义默认方法,默认方法可以提供方法实现。一、接口的概念 我们经常在生活中听到接口这个词,比如PCI接口、AGP接口,因此很多人认为接口相当于主板上一个插槽,这其实是一种...
  • 自动化接口测试之Postman(一篇搞定)

    万次阅读 多人点赞 2018-07-13 14:17:33
    该篇文章针对已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境: Window 7 - 64 Postman 版本(免费版): Chrome App v5.5.3 ...
  • 中高端飞塔防火墙,默认每个内网接口都是独立的,但有时我们需要某些接口合并运行,例如指定多个接口为同一网段,这样就需要对接口进行合并操作。
  • 几款常见接口管理平台对比

    万次阅读 2020-05-11 22:59:16
    EOLINKER(广州银云信息科技有限公司)是国内API接口管理解决方案的领军者,是国内最大的在线API接口管理服务供应商,致力于满足各行业客户在不同应用环境中对接口管理全生命周期的个性化需求,提供API开发管理、...
  • java8 BiFunction接口

    千次阅读 2019-01-31 16:10:26
    这篇文章是对BiFunction函数式接口的学习...这种做法不会影响以前代码对接口的实现,也对原有的接口进行了扩展。 传递行为给方法,而不是传递值。 /** * BiFunction是一个函数式接口,它接口两个参数并产生一个结...
  • 接口隔离原则

    万次阅读 多人点赞 2014-07-22 04:01:02
    对接口的理解  这里的接口,不是java语言内部的interface的意思,在这里,可以将接口理解为一个类提供的所有的方法的特征集合,通俗点说就是所有可见方法和可见变量(java的说法, c++的说法是可见函数和可见属性...
  • 统一接口服务

    千次阅读 2015-05-31 13:48:02
    在与其他部门、三方合作完成产品研发的过程中,接口是相互之间完成数据交互的主要手段,为了统一对接口进行管理,以满足本部门不同业务的需求,统一接口服务应运而生。 作用: 1.统一接口转换,参数适配。 2....
  • 什么是接口测试?怎样做接口测试?

    万次阅读 多人点赞 2018-08-20 11:17:31
    1.什么是接口? 2.接口都有哪些类型? 3.接口的本质是什么? 4.什么是接口测试? 5.问什么要做接口测试? 6.怎样做接口测试? 7.接口测测试点是什么? 8.接口测试都要掌握哪些知识? 9.其他相关知识? 1....
  • 接口diff即接口对比,就是对接口的返回结果进行对比,找出结果的差异之处。广泛意义上说,接口diff不局限于接口的个数(1/2/3/4/...个接口),也不局限于接口的返回形式(json/string/xml....) ,当然也不局限与接口的...
  • 接口&接口文档

    万次阅读 2018-09-02 23:16:41
    一、接口简介 API(Application Programming Interface)即应用程序接口,可以任务是一个软件组件或一个Web服务与外界进行交互的接口,在这里接口可以和API划等号。 接口可以简单的理解为一个黑盒子,从一边输入...
  • 接口接口回调

    万次阅读 多人点赞 2017-11-29 16:36:47
      关键字interface声明一个接口接口不是类,而是一组类的需求描述。接口使抽象的概念更进一步,接口就像是一个成产类的工厂模具,实现类都必须按照他的要求去编译,或者说接口是建立类的协议。 接口的特性 ...
  • 高速硬件接口

    千次阅读 2018-06-11 09:21:15
    DLM: dual-lane modules, 是双差分收和发对接口,共有4对差分总线,收和发各两对, 可以复用的总线: sgmii, qsgmii, rxaui,pcie,sata, 在cavium 的CPU中较常见QLM: quad-lane modules, 是4差分收和发对接口,共有8对差分...
  • python3 接口获取数据

    万次阅读 多人点赞 2018-12-06 13:59:12
    自己对接口学习了一段时间,对学到的东西做个记录。 那么接口是什么? 接口分为两种:程序内部接口 和 系统对外接口。1 程序内部接口指的是,在程序内部的各方法、各模块之间进行信息传递和交互的函数、变量等都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,164,030
精华内容 1,265,612
关键字:

对接口