精华内容
下载资源
问答
  • Web API接口开发和测试

    2020-07-10 09:16:01
    上面我们定义了一般的Web API接口,以及实现相应的业务实现,如果我们需要创建Web API层,还需要构建一个Web API项目的。 创建好相应的项目后,可以为项目添加一个Web API基类,方便控制共同的接口。 ...

    4、ASP.NET Web API的开发

     上面我们定义了一般的Web API接口,以及实现相应的业务实现,如果我们需要创建Web API层,还需要构建一个Web API项目的。

     

     

    创建好相应的项目后,可以为项目添加一个Web API基类,方便控制共同的接口。

     

    然后我们就可以在Controller目录上创建更多的应用API控制器了。

     

    最后我们为了统一所有的API接口都是返回JSON方式,我们需要对WebApiConfig里面的代码进行设置下。

    public static class WebApiConfig

        {

            public static void Register(HttpConfiguration config)

            {

                // Web API 配置和服务

                config.SetCorsPolicyProviderFactory(new CorsPolicyFactory());

                config.EnableCors();

     

                // Web API 路由

                config.MapHttpAttributeRoutes();

     

                config.Routes.MapHttpRoute(

                    name: "DefaultApi",

                    routeTemplate: "api/{controller}/{action}/{id}",

                    defaults: new { action = "post", id = RouteParameter.Optional }

                );

     

                // Remove the JSON formatter

                //config.Formatters.Remove(config.Formatters.JsonFormatter);

     

                // Remove the XML formatter

                config.Formatters.Remove(config.Formatters.XmlFormatter);

            }

        }

    5、Web API 接口的测试

    接下来我们要做的就是需要增加业务接口,以便进行具体的测试了,建议使用Winform项目,对每个接口进行一个测试,或者也可以考虑使用单元测试的方式,看个人喜好吧。

    例如我们如果要测试用户登陆的接口的话,我们的测试代码如下所示。

    /// <summary>

            /// 生成签名字符串

            /// </summary>

            /// <param name="appSecret">接入秘钥</param>

            /// <param name="timestamp">时间戳</param>

            /// <param name="nonce">随机数</param>

            private string SignatureString(string appSecret, string timestamp, string nonce)

            {

                string[] ArrTmp = { appSecret, timestamp, nonce };

     

                Array.Sort(ArrTmp);

                string tmpStr = string.Join("", ArrTmp);

                tmpStr=FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");

                return tmpStr.ToLower();

            }

     

            private TokenResult GetTokenResult()

            {

                string timestamp = DateTime.Now.DateTimeToInt().ToString();

                string nonce = new Random().NextDouble().ToString();

                string signature = SignatureString(appSecret, timestamp, nonce);

     

                string appended = string.Format("&signature={0}×tamp={1}&nonce={2}&appid={3}", signature, timestamp, nonce, appId);

                string queryUrl = url + "Auth/GetAccessToken?username=test&password=123456" + appended;

     

                HttpHelper helper = new HttpHelper();

                string token = helper.GetHtml(queryUrl);

                Console.WriteLine(token);

                TokenResult tokenResult = JsonConvert.DeserializeObject<TokenResult>(token);

                return tokenResult;

            }

     

    如果我们已经获得了令牌,我们根据令牌传递参数给连接,并获取其他数据的测试处理代码如下所示。

     

    //获取访问令牌

                TokenResult tokenResult = GetTokenResult();

     

                string queryUrl = url + "/Contact/get?token=" + tokenResult.access_token;

                HttpHelper helper = new HttpHelper();

                string result = helper.GetHtml(queryUrl);

                Console.WriteLine(result);

     

    如果需要POST数据的话,那么调用代码如下所示。

    //使用POST方式

                var data = new

                {

                    name = "张三",

                    certno = "123456789",

                };

                var postData = data.ToJson();

     

                queryUrl = url + "/Contact/Add?token=" + tokenResult.access_token;

                helper = new HttpHelper();

                helper.ContentType = "application/json";

                result = helper.GetHtml(queryUrl, postData, true);

                Console.WriteLine(result);

     

    Web API后台,会自动把POST的JSON数据转换为对应的对象的。

     

    如果是GET方式,我们可能可以直接通过浏览器进行调试,如果是POST方式,我们需要使用一些协助工具,如Fiddler等处理工具,但是最好的方式是自己根据需要弄一个测试工具,方便测试。

    以下就是我为了自己Web API 接口开发的需要,专门弄的一个调试工具,可以自动组装相关的参数,包括使用安全签名的参数,还可以把所有参数数据进行存储。

     

    博客 https://www.cnblogs.com/yelanggu/p/10002346.html

    展开全文
  • 接口功能说明: 前端提交学生学号(sno)给Api,Api接口返回此学生的基本信息API接口端namespace appindexcontroller;use thinkController;use appindexmodelStudent;class User{public function index() {return $...

    接口功能说明: 前端提交学生学号(sno)给Api,Api接口返回此学生的基本信息

    API接口端

    namespace appindexcontroller;use thinkController;use appindexmodelStudent;class User{public function index() {return $this->fetch();}// 客户端提交学生学号(sno)给api,api返回此学生的基本信息public function api($sno='0001') {// 查询 并把数据赋值给 $data$data = Student::getBysno($sno);// 返回数据return json($data);}}

    (请求端) HTML

    TP5通过API查询数据

    (请求端) C层控制器

    namespace appindexcontroller;use thinkController;class User extends Controller {public function index() {return $this->fetch();}public function capi() {// http协议请求$url = 'http://localhost/index.php/index/index/api/';// input('sno') 是前端的from传过来的name值$ch = curl_init($url.'?sno='.input('sno'));curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行 并把执行后的数据赋值给 $data$data = curl_exec($ch);// 关闭curl_close($ch);// 返回数据return $data;}}

    你是否有这样的烦恼,想学习高级技术,缺乏好的高级学习资料,收集了部分12年网站架构师授课的TP5、laravel、swoole、swoft、高并发、分布式等资料,现在免费分享给大家。

    获取地址:

    d66183f5fac3a1ebbda147650e20922b.png
    展开全文
  • WebAPI接口开发实践

    千次阅读 2020-02-02 16:29:53
    背景 在团队两年多陆续负责了几个项目的开发上线已经代码的...WebAPI开发流程 第一步首先设计接口文档,公司内部有一套自研的多人协作文档系统,可以很好的做到这一步,并能很好的做好版本控制。如果公司内部没...

    背景

    在团队两年多陆续负责了几个项目的开发上线已经代码的review,特别是对老项目的重构过程中,发现之前的API设计是没有任何规范和约定的,不同的开发同学有不同的习惯,因此需要一套规范去约定,现在分享一下我们目前试运行的一套规范,一起交流完善下。

    WebAPI开发流程

    • 第一步首先设计接口文档,公司内部有一套自研的多人协作文档系统,可以很好的做到这一步,并能很好的做好版本控制。如果公司内部没有可以基于showdoc搭建一套
    • 第二步有技术负责人确认接口以及字段的命名规范
    • 第三步找对应API对接人,确认接口是否符合要求

      这三步其实是个闭环,只有等到全部通过后才会正式开始开发API

    命名规范

    • 所有接口中不能出现拼音,统一用英语
    • 不能有特殊字符,例如/
    • 接口命名遵循像个原则: 简单 易懂

      出入参规范

    • 命名规范参考之前的一篇文章
    • 若需要使用分割符,只可以使用中划线 -
    • 禁止把所有数据库字段全部返回,统一使用Dto,只返回调用方需要的字段

      HTTP 请求方法使用规范

    根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
    HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
    这里统一只是用 GET, POST,PUT,DELETE,PATCH

    GET(SELECT): 从服务器获取单个资源或者资源列表
    POST(CREATE):发送请求创建一个新的资源
    PUT(UPDATE):通过接口更新服务器上的资源信息,资源内容全量更新,提供资源全部字段信息
    DELETE(DELETE):通过删除服务器上的资源
    PATCH(UPDATE) :通过接口更新服务器上的资源信息,资源内容增量更新,仅提供更新的属性信息
    具体使用规范,使用GET查询获取信息,POST创建新的资源,PUT修改已存在资源信息,DELETE删除服务器资源信息,不强制要求使用Patch。

    HTTP码状态使用规范

    • 200 OK :成功
    • 201 CREATED:成功创建数据 不强制使用,可以使用200
    • 400 Bad Request:提交的参数错误。错误信息中要能体现哪个parameter没有通过validation,为什么
    • 401 Unauthorized:客户端传入了一个无效的auth token。客户端需要更新token进行重试,包括让用户重新登陆
    • 403 Forbidden:访问被拒绝。最常见的case为水平越权。和401的区别是:如果改接口需要用户登陆,无有效的登陆token,则返回401,表示登陆验证未通过。登陆验证通过后,但是因为要操作的资源没有权限,则返回403.比如用户更新或者删除不属于自己的resource
    • 404 Not Found: 资源为找到
    • 429 Too Many Requests:对于限频接口请求次数超频
    • 500 Internal Server Error:应用服务器内部错误
    • 502 Bad Gateway:网关或者代理处理请求错误
    • 503 Service Unavailable:应用服务器暂时不可用
    • 504 Gateway Timeout: 网关超时。网关从上游服务没有在设定的时长内获取到数据。

    自定义Header规范,

    x-[应用英文缩写]-[语义化英文单词说明用途]

    示例:
    X-Test-Authorization: qwaszxerdfcvtyghbn

    返回规范

    全部统一使用 Content-Type = application/json 格式返回

    请求失败的Response

    • Http码的状态为200或者201
    • code统一为 200,message 为success
    • isSuccess为true
    • 有返回值时,统一通过data返回,无返回值时为{},禁止使用null返回
    • 返回的header中追加标记本次请求的唯一值的 X-[项目英文缩写]-ResponseId
    {
      "isSuccess": true,
      "code": 200,
      "message": "success",
      "data": {
        "id": 0,
        "value": "Default"
      },
      "timestamp": "02/02/2020 13:19:22"
    }

    请求异常的Response

    • Http码的状态根据上一小节介绍的按需使用
    • code和http码对应,message 为对应异常说明
    • isSuccess为false
    • data统一返回为{}
    • 返回的header中追加标记本次请求的唯一值的 X-[项目英文缩写]-ResponseId
    {
      "isSuccess": false,
      "code": 400,
      "message": "Bad Request",
      "value": {},
      "timestamp": "02/02/2020 13:35:33"
    }

    接口注释说明

    约定

    • 项目统一使用swagger
    • 接口相关的文档地址
    • 相关jira.$ 分割 XXX-XXX $ XXX-XXX
    • 可能的返回的状态码
    • 对应参数说明
    /// <summary>
    /// PUT api/values/5
    /// </summary>
    /// <param name="id">id</param>
    /// <param name="dto">dto</param>
    /// <remarks>
    /// <url>doc: https://www.cnblogs.com/sagecheng/</url> <br/>
    /// <br/>
    /// <br/>
    /// <jira>jira: XXX-XXX</jira>
    /// </remarks>
    /// <returns></returns>
    /// <response code="200"> success </response>
    /// <response code="400">If the id is null</response>
    /// <response code="404">If the id is not found</response>
    [HttpPut("{id}")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    public ApiResult Put(int id, [FromBody] ValueDto dto)
    {
        var info = values.FirstOrDefault(o => o.Id == id);
        if (info == null)
        {
            throw new ApiException(StatusCodes.Status404NotFound, "Not Found");
        }
        info.Value = dto.Value;
        return ApiResult.GetSuccessResult();
    }

    Swagger相关效果

    整体效果
    avatar_www.wityx.com

    注释效果
    avatar_www.wityx.com

    参考文章

    Swashbuckle 和 ASP.NET Core 入门

    展开全文
  • C# 物联网开发API接口系列(四)#久爱物联网#MQTT#【提纲】1)获取设备列表(某用户的)2)单独检查设备是否存在合法【正文】 /// /// 获取设备列表 /// /// 令牌 /// private string getDevList(string _token) { string ...

    C# 物联网开发API接口系列(四)

    #久爱物联网#MQTT#

    【提纲】

    1)获取设备列表(某用户的)

    2)单独检查设备是否存在合法

    【正文】

        ///     /// 获取设备列表    ///     /// 令牌    ///     private string getDevList(string _token)    {        string result = "";        int listnum = 0;        StringBuilder sb = new StringBuilder();        try        {            if (SqlHelper.isConnected)            {                SqlConnection SqlConn = new SqlConnection(SqlHelper.ConnString);                if (SqlConn.State != ConnectionState.Connecting)                {                    SqlConn.Open();// 打开数据库连接                }                //注意:参数是token查询用的是 uid 之前有一方法已经调用了 uid = getUidbyToken(token);                SqlCommand sqlCmd = new SqlCommand("SELECT * FROM box_List WHERE bForUid=" + uid, SqlConn);                SqlDataReader rd = sqlCmd.ExecuteReader();//返回的是记录集                if (rd.HasRows)                {                    while (rd.Read())                    {                        listnum++;                        sb.AppendFormat("{" + string.Format(""regpacket":"{0}","boxname":"{1}","actived":{2}", rd["bRegpacket"].ToString(), rd["bName"].ToString(),Convert.ToInt16(rd["bStatus"])) + "}");//可继续扩展其他属性                        sb.AppendFormat(",");//最后一条需要处理此符号                    }                    sb.Remove(sb.ToString().LastIndexOf(','), 1);//处理最后一位符号(如何处理最后一个逗号)                }                                rd.Close();//统一释放资源                rd = null;                sqlCmd = null;                SqlConn.Close();//关闭数据库连接                   SqlConn = null;//否则不更新原内容             }            //当data为数组时加[] 非数组及json格式写法            if(listnum>0)                result = string.Format(""data":[{0}],"code":{1},"time":"{2}"", sb.ToString().Replace("{", "{").Replace("}", "}"), 200, svrNowTime());            else                result = string.Format(""data":"{0}","code":{1},"time":"{2}"", "请检查参数的合法性:" + _token, 0, svrNowTime());                    }        catch (Exception ex)        {            result = string.Format(""data":"[ERROR]:{0}","code":{1},"time":"{2}"", ex.Message.ToString(), -1, DateTime.Now);        }        return "{"+result+"}";//组合成标准的json格式的头尾    }    ///     /// 验证智能模块的合法性    ///     /// 注册包    ///     private string checkDevValidity(string reg)    {        string _retu = "";        try        {            SqlConnection SqlConn = new SqlConnection(SqlHelper.ConnString);            if (SqlConn.State != ConnectionState.Connecting)            {                SqlConn.Open();// 打开数据库连接            }            //bStatus 1启用0禁用-1列黑            SqlCommand sqlCmd = new SqlCommand("SELECT * FROM  box_List WHERE bStatus=1 AND bForUid=" + uid + " AND bRegpacket='" + reg + "'", SqlConn);            SqlDataReader rd = sqlCmd.ExecuteReader();            if (rd.HasRows)            {                rd.Read();                _retu = string.Format(""data":"[OK]{0}","code":{1},"time":"{2}"", rd["bRegpacket"], 200, DateTime.Now);            }            else            {                _retu = string.Format(""data":"[SORRY]{0}","code":{1},"time":"{2}"", "验证失败,请检查参数是否正确!", 0, DateTime.Now);            }        }        catch (Exception ex)        {            _retu = string.Format(""data":"[ERROR]:{0}","code":{1},"time":"{2}"", ex.Message.ToString(), -1, DateTime.Now);        }        return "{" + _retu + "}"; //重新组合标准json格式头尾{}            }     //通过token获取uid    private int getUidbyToken(string tok)    {        int _uid;        try        {            SqlConnection SqlConn = new SqlConnection(SqlHelper.ConnString);            if (SqlConn.State != ConnectionState.Connecting)            {                SqlConn.Open();// 打开数据库连接            }            SqlCommand sqlCmd = new SqlCommand("SELECT top 1 uid,fuid,uToken,uTel,uName FROM user_List WHERE uToken='" + tok + "' AND uStatus=1", SqlConn);//uRole=8            SqlDataReader rd = sqlCmd.ExecuteReader();//返回的是记录集   AND uStatus=1            if (rd.HasRows)            {                if (rd.Read())                {                    uid = Convert.ToInt16(rd["uid"]);//***主要查询这个                    fuid = Convert.ToInt16(rd["fuid"]);                    utoken = rd["uToken"].ToString();                    utel = rd["uTel"].ToString();                    uname = rd["uName"].ToString();                    //                    ujson = "{"uid":" + uid + ","fuid":" + fuid + ","utoken":"" + utoken + "","uname":"" + uname + "","utel":"" + utel + ""}";                }                _uid = uid;//返回这个            }            else            {                _uid = -1;//没找到            }        }        catch (Exception ex)        {            _uid = 0;//错误异常时0        }        return _uid;    }
    09a4934e91e1ea060d7e988ced443f20.png

    合法验证通过返回[OK]注册包格式 条件注册包

    fb66f8224526f084bdc5ec9c97547e0f.png

    获取设备列表(条件:令牌)

    e22fb1c1f7fc900c17f7e9278ada03a1.png

    成功获取令牌

    c2f5b7ee1fb36451c75646ee050109b9.png

    获取令牌失败

    c6a0a600811529bada2e8212c445c44e.png

    获取用户信息(令牌)

    到此为止,主要接口及方法已经讲解一遍!举一反三,触类旁通,学会学习 就很快了!

    下一步,将接口部署到服务器下,进行访问即可!

    在管理客户端调用接口,根据返回json数据进行解析(了解json前端知识ajax)

    进行各种操作即可!

    有机会时间 会继续分享如何前端验证(ajax)解析数据并展现到页面上(H5)

    0dfe6ab6363297ae5a4a84e43a8d227b.png

    最终实现在此模块上所有功能

    d728f020ad4492fad8b9d28a400d8d57.png

    内嵌WEB模拟发送串口指令

    展开全文
  • 一、先简单回答两个问题:(学习视频分享:编程视频)1、PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发。(别去纠结 GTK、WinBinder)2、为什么选择 ...
  • C# 物联网开发API接口系列(二)【提纲】1、如何写验证登录(参数:账号,密码)2、switch方法的使用3、json格式的使用方法,一些函数的使用注意事项【开始】/******************************************* * 功能:管理...
  • 导语 这篇文章是我使用 Laravel 开发 Web Api 总结的自己一套开发流程。 记录在此,方便回顾。 同时,将自己的经验分享给大家。...模型式 Web Api 接口开发。 先理一下概念,模型式的意思是指:将控制器逻辑做高度封...
  • API 调用是开发者在小程序开发过程中经常会遇到的问题,本期我们以为调用豆瓣电影 API 为例具体来看 API 的调用过程以及常见的一些问题。测试用到的小程序是「电影周周看」,内容来自清华大学软件学院刘强副教授在「...
  • 因为是接口框架,首先要做的就是制定接口规范,好的接口规范能约束开发人员,能降低前后端人员之间的沟通协调,能避免后期联调带来的一系列问题。 1.接口规范 接口规范包含以下内容: 1、请求类型及参数 2、返回值及...
  • 我在网上百度没找到合适的。我要写一个 httpserver。然后第三方通过http请求后,(可以是get或post),返回一个纯json格式的数据。请指一下方向如何写,或给点技术文档。
  • 本课程使用案例讲解,适用于需要快速上手webapi 接口开发的学员,帮助无接口开发基础的学员快速入 适用人群 迫切需要完成接口开发功能学员,接口开发无基础学员,开发兴趣者 课程地址:...
  • 最近公司想把现有的java项目开发成web接口,做成...对于接口开发还不是很熟悉,具体选什么框架比较好,有例子最好了。。。。。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/2.gif][/img]
  • ASP.NET 使用Swagger开发Web API接口项目

    千次阅读 2018-05-15 13:08:49
    ASP.NET 使用Swagger开发WebApi接口项目:项目使用Web API创建自动提供了API文档,采用mvc方式创建项目稍麻烦点需要手动添加WebApiConfig配置,而采用Web API项目这些都已经生成好了。创建Web API项目添加Swagger...
  • WebApi接口平台

    2020-09-19 17:13:31
    在面向服务开发的时代,WebApi使 .Net 的接口开发脱离IIS束缚,更加灵活,轻量 实现功能: 通过搭建Windows服务构造WebApi站点 透过 http://*/api/v1/controller 的方式访问对应版本的 API 插件式开发,将写好接口的dll...
  • WebAPI 是一种用来开发系统间接口、设备接口 API 的技术,... 本教程将通过一个网站后台管理模块接口处理,让大家了解服务器端WebApi接口开发实现过程,并在实际操作中掌握WebApi编程模式的一些重要知识点及开发技巧。
  • 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗。由于接口个数有点多,每个接口都要详细说明接口...
  • Web API 接口

    2016-09-10 23:06:00
    您可以使用下面的接口(也称为对象的类型)列表,开发 Web 应用程序或网站。 关于包含这些接口API 列表,请参阅 Web API 参考 。 转载于:https://www.cnblogs.com/gongshunkai/p/5860619.html...
  • Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点:1.url:长得像返回数据的url链接2.请求方式:get、post、put、patch、delete3.请求参数:json或xml格式的key-value类型数据4.响应结果...
  • Web API 开发接口

    千次阅读 2016-10-18 15:30:53
    目前系统开发不仅要为iOS暴露API、为Android、Web站点、AngularJS应用前端,还要为各种机顶盒以及乱七八糟的移动平台或使用你API的第三方公司都暴露各自的API,各种API消费者会有不同且固守的关注点。
  • 前言:WebApi接口开发完毕后,交付给前端人员或手机端开发者时接口说明文档是必不可少的配套设备,如果公司流程不规范大家使用口口相传的交接方式,而且没有改进的欲望,那你可以到此为止了。Swagger是方便测试接口...
  • web安全措施.你写的WEB API接口如何预防黑客攻击 现在WEB开发都是动静分离 后端编写API接口 那如何防止黑客攻击你的HTTP API接口
  • CRUD程序员的福音-零代码WebAPI快速开发系统,零代码开发API接口(QQ:2914709646 有需要请联系)一、数据库管理:可以创建、删除,查询数据库表二、API管理:可以创建、修改、删除、查询API接口,自定义API接口查询...
  • 在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序、Web网站、移动端APP等多种接入方式,Web API的处理方式和微信提供的接口...
  • 以下是所有对象、类型等接口的列表,你在开发网页应用程序或站点时使用它们。 API文档地址:https://developer.mozilla.org/zh-CN/docs/Web/API A ANGLE_instanced_arrays AbstractWorker AmbientLight...
  • MixPHP 是一款基于 Swoole 的常驻内存型 PHP 高性能...下面做一个开发 API 接口的简单实例:从 articles 表,通过 id 获取一篇文章。访问该接口的 URL:http://www.e.com/articles/details?id=1数据库表结构如下:C...
  • 新秀WebApi接口 v1.01.zip

    2019-07-14 05:33:59
    新秀WebApi接口主要用于其他内嵌api接口的软件、web、app程序进行整合开发使用。 新秀WebApi接口主要功能 1、 可以通过本接口,开发更加强大网络应用软件,快速的调用会员数据、信息数据,与discuz系统无缝整合...
  • 我觉的java的Web API接口就是 Servlet接口啊 1.增加实例化bean的class类 import java.io.IOException; import javax.servlet.GenericServlet; import jav...
  • API接口开发

    2020-08-06 21:16:02
    API接口开发 接口文档 一、什么是接口文档 在项目开发中,web项目的前后端分离开发,app开发,需要由前后端工程师共同定义接口,编写接口文档。 二、接口规范是什么? 首先接口分为四部分:方法、URL、请求参数、...
  • 利用SpringMVC 开发一个webapi接口是十分简便和快速的 只需要简单的两步: 1,在controller层写一个接口,可以是post, get, delete 等 /** * 远洋会 物业客户信息认证接口 * @param mobPhone 联系方式1 * @...

空空如也

空空如也

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

webapi接口开发