精华内容
下载资源
问答
  • 钉钉服务端api接口使用

    千次阅读 2018-11-20 21:03:00
    ... 第二步:创建应用 ...还需要授权一个开发人员,并获取CorpSecret,需要把corpId和CorpSecret作为参数请求api接口获取AccessToken,后面的所有接口都需要AccessToken 第三步:接入接口 一、获取toke...

    第一步:注册钉钉企业账号

    打开链接:https://oa.dingtalk.com/#/login,注册账号即可

     

    第二步:创建应用

    以创建e应用为例:

     

    还需要授权一个开发人员,并获取CorpSecret,需要把corpId和CorpSecret作为参数请求api接口获取AccessToken,后面的所有接口都需要AccessToken

    第三步:接入接口

    一、获取token

     1 const corpid = 'dingd***587da6ee21d35c2f4657eb63***';
     2 const corpsecret = '*********';
     3 const requestPromise = require("request-promise");
     4 
     5 const getAccessToken = async (corpid, corpsecret) => {
     6   // https://oapi.dingtalk.com/gettoken?corpid={corpid}&corpsecret={corpSecret或开发授权码}
     7   const result = await requestPromise({ uri: 'https://oapi.dingtalk.com/gettoken', qs: { corpid, corpsecret } });
     8   console.log(result);
     9 };
    10 getAccessToken(corpid, corpsecret);

    二、promise请求接口封装

    function request(url, method, params, headers = {}) {
      const options = {
        url,
        method,
        // timeout: 3000,
        headers: Object.assign(headers, {
          'content-type': 'application/json',
        }),
        rejectUnauthorized: false, // https
        json: true,
      };
      switch (method) {
        case 'POST':
        case 'PUT':
          options.body = params;
          break;
        case 'GET':
        case 'DELETE':
          options.qs = params;
          break;
        default:
          break;
      }
      return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
          if (!error) {
            resolve(body);
          } else {
            reject(error);
          }
        });
      });
       .catch (error => ({
    
         msg: error.message,
       }));
    }
    

      

    三、接口见代码(后端使用koa.js)

    const host = 'https://oapi.dingtalk.com/';
    /*
     *发送工作通知消息
     */
    router.post('/api/dingtalkserve/asyncsend_v2', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['userid_list'] && !body['dept_id_list'] && !body['to_all_user']) {
          return response.fail({
            'msg': "userid_list,dept_id_list, to_all_user必须有一个不能为空"
          });
        }
        if (!body['msg']) {
          return response.fail({
            'msg': "msg不能为空"
          });
        }
    
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          agent_id: parseInt(agentId4EP),
          msg: {
            "msgtype": "text",
            "text": {
              "content": body['msg']
            }
          }
        };
        body['to_all_user'] ? params['to_all_user'] = true : false;
        body['dept_id_list'] ? params['dept_id_list'] = body['dept_id_list'] : "";
        body['userid_list'] ? params['userid_list'] = body['userid_list'] : "";
        let messageRes = await request(`${host}topapi/message/corpconversation/asyncsend_v2?access_token=${accessToken}`, 'POST', params);
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取工作通知消息的发送进度
     */
    router.post('/api/dingtalkserve/getsendprogress', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['task_id']) {
          return response.fail({
            'msg': "task_id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          agent_id: parseInt(agentId4EP),
          task_id: body['task_id']
        };
        let messageRes = await request(`${host}topapi/message/corpconversation/getsendprogress?access_token=${accessToken}`, 'POST', params);
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取工作通知消息的发送结果
     */
    router.post('/api/dingtalkserve/getsendresult', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['task_id']) {
          return response.fail({
            'msg': "task_id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          agent_id: parseInt(agentId4EP),
          task_id: body['task_id']
        };
        let messageRes = await request(`${host}topapi/message/corpconversation/getsendresult?access_token=${accessToken}`, 'POST', params);
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取子部门ID列表
     */
    router.post('/api/dingtalkserve/list_ids', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['id']) {
          return response.fail({
            'msg': "父部门id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          id: body['id']
        };
        let messageRes = await request(`${host}department/list_ids`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取部门列表
     */
    router.post('/api/dingtalkserve/list', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['id']) {
          return response.fail({
            'msg': "父部门id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          id: body['id']
        };
        body['lang'] ? params['lang'] = body['lang'] : "";
        body['fetch_child'] ? params['fetch_child'] = true : false;
        let messageRes = await request(`${host}department/list`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取部门详情
     */
    router.post('/api/dingtalkserve/departmentget', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['id']) {
          return response.fail({
            'msg': "部门id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          id: body['id']
        };
        body['lang'] ? params['lang'] = body['lang'] : "";
        let messageRes = await request(`${host}department/get`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 查询部门的所有上级父部门路径
     */
    router.post('/api/dingtalkserve/list_parent_depts_by_dept', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['id']) {
          return response.fail({
            'msg': "部门id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          id: body['id']
        };
        let messageRes = await request(`${host}department/list_parent_depts_by_dept`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    /*
     * 查询指定用户的所有上级父部门路径
     */
    router.post('/api/dingtalkserve/list_parent_depts', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['userId']) {
          return response.fail({
            'msg': "用户id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          userId: body['userId']
        };
        let messageRes = await request(`${host}department/list_parent_depts`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取企业员工人数
     */
    router.post('/api/dingtalkserve/get_org_user_count', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['onlyActive']) {
          return response.fail({
            'msg': "激活钉钉状态不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          onlyActive: body['onlyActive']
        };
        let messageRes = await request(`${host}user/get_org_user_count`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取用户详情
     */
    router.post('/api/dingtalkserve/userinfo', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['userid']) {
          return response.fail({
            'msg': "userid不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          userid: body['userid']
        };
        body['lang'] ? params['lang'] = body['lang'] : "";
        let messageRes = await request(`${host}user/get`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取部门用户userid列表
     */
    router.post('/api/dingtalkserve/getDeptMember', async ({ request, response, session }) => {
      try {
        let body = request.fields;
        if (!body['deptId']) {
          return response.fail({
            'msg': "部门id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          deptId: body['deptId']
        };
        let messageRes = await request(`${host}user/getDeptMember`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取部门用户(详情)
     */
    router.post('/api/dingtalkserve/listbypage', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['department_id']) {
          return response.fail({
            'msg': "部门id不能为空"
          });
        }
        if (!body['offset']) {
          return response.fail({
            'msg': "偏移量不能为空"
          });
        }
        if (!body['size']) {
          return response.fail({
            'msg': "每页数量不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          department_id: body['department_id'],
          offset: parseInt(body['offset']),
          size: parseInt(body['size'])
        };
        let messageRes = await request(`${host}user/listbypage`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 根据unionid获取userid
     */
    router.post('/api/dingtalkserve/getUseridByUnionid', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['unionid']) {
          return response.fail({
            'msg': "unionid不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          unionid: body['unionid']
        };
        let messageRes = await request(`${host}user/getUseridByUnionid`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取通讯录权限范围
     */
    router.post('/api/dingtalkserve/authScopes', async ({ request, response, session }) => {
      try {
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken
        };
        let messageRes = await request(`${host}/auth/scopes`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 创建群
     */
    router.post('/api/dingtalkserve/createChat', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['name']) {
          return response.fail({
            'msg': "群名称不能为空"
          });
        }
        if (!body['owner']) {
          return response.fail({
            'msg': "群主userid不能为空"
          });
        }
        if (!body['useridlist']) {
          return response.fail({
            'msg': "群成员不能为空"
          });
        }
        if (body['useridlist'].indexOf(body['owner']) < 0) {
          return response.fail({
            'msg': "群主必须为群成员"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          name: body['name'],
          owner: body['owner'],
          useridlist: body['useridlist'].split(",")
        };
        let messageRes = await request(`${host}chat/create?access_token=${accessToken}`, 'POST', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 获取群聊会话信息
     */
    router.post('/api/dingtalkserve/chatInfo', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['chatid']) {
          return response.fail({
            'msg': "群id不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          chatid: body['chatid']
        };
        let messageRes = await request(`${host}chat/get`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 发送群消息
     */
    router.post('/api/dingtalkserve/chatSend', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['chatid']) {
          return response.fail({
            'msg': "群id不能为空"
          });
        }
        if (!body['msg']) {
          return response.fail({
            'msg': "群消息不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          chatid: body['chatid'],
          msg: {
            "msgtype": "text",
            "text": {
              "content": body['msg']
            }
          }
        };
        let messageRes = await request(`${host}chat/send?access_token=${accessToken}`, 'POST', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });
    
    /*
     * 查询群消息已读人员列表
     */
    router.post('/api/dingtalkserve/getReadList', async ({ request, response, session }) => {
      try {
    
        let body = request.fields;
        if (!body['messageId']) {
          return response.fail({
            'msg': "messageId不能为空"
          });
        }
        if (!body['cursor']) {
          return response.fail({
            'msg': "cursor不能为空"
          });
        }
        if (!body['size']) {
          return response.fail({
            'msg': "每页数量不能为空"
          });
        }
        // 获取TOKEN
        let accessToken = await getAccessToken();
        let params = {
          access_token: accessToken,
          messageId: body['messageId'],
          cursor: body['cursor'],
          size: parseInt(body['size']),
        };
        let messageRes = await request(`${host}chat/getReadList`, 'GET', params);
        console.log("messageRes", messageRes)
        return response.success({ 'data': messageRes });
      } catch (e) {
        console.log(e);
        return response.fail({
          'msg': e
        });
      }
    });

    以上针对的是钉钉企业内部应用

    如果是ISV开发者应用,则需要通过接口获取企业的基本信息

    nodejs签名实现

    /*
     * 把timestamp + "\n" + suiteTicket当做签名字符串, suiteSecret做为签名秘钥,
     *  使用HmacSHA256算法计算签名, 然后进行Base64 encode获取最后结果。
     *  然后把签名参数再进行urlconde, 加到请求url后面。
     */
    const crypto = require('crypto');
    const accessKey = 'suiteqh0ljtdheuee****'; // suiteKey
    const suiteSecret = '******';
    const suiteTicket = 'TestSuiteTicket';
    const timestamp = Date.now();
    const stringToSign = timestamp + "\n" + suiteTicket;
    
    const hash = crypto.createHmac('sha256', suiteSecret)
      .update(stringToSign, 'utf8')
      .digest().toString('base64');
    console.log(hash);
    var request = require("request");
    var urlencode = require('urlencode');
    
    var options = {
      method: 'POST',
      url: 'https://oapi.dingtalk.com/service/get_auth_info',
      qs: {
        signature: hash,
        timestamp: timestamp,
        suiteTicket: suiteTicket,
        accessKey: accessKey
      },
      headers: {
        'Cache-Control': 'no-cache',
        'Content-Type': 'application/json'
      },
      body: { auth_corpid: 'dingd142a587da6ee21d35c2f4657eb6378f' },
      json: true
    };
    
    request(options, function (error, response, body) {
      if (error) throw new Error(error);
    
      console.log(body);
    });
    

      

    钉钉文档开发者链接 :https://open-doc.dingtalk.com/microapp/serverapi2/isu6nk

     

     

     

     

    转载于:https://www.cnblogs.com/xiaosongJiang/p/9991573.html

    展开全文
  • 目标接口地址 https://api.q.qq.com/sns/jscode2session?appid=' + qq.APPID + '&secret=' + qq.APPSECRET + '&js_code=' + req.query.code + '&grant_type=authorization_code 请求实现 // ....
    • 方法一:

    • 目标接口地址

    https://api.q.qq.com/sns/jscode2session?appid=' + qq.APPID + '&secret=' + qq.APPSECRET + '&js_code=' + req.query.code + '&grant_type=authorization_code
    • 请求实现

    // QQ小程序配置信息
    const qq = require('../config/Config')
    
    router.get('/onLogin', function (req, res) {
      const url = 'https://api.q.qq.com/sns/jscode2session?appid=' + qq.APPID + '&secret=' + qq.APPSECRET + '&js_code=' + req.query.code + '&grant_type=authorization_code'
      request.get(url, function (req,resp, res) {
        console.log(res)
      })

    方法二:推荐

    npm install -g xd-synchttp
    const sync = require('xd-synchttp');
    
    let content = "";
    const url = 'www.baidu.com';
    try{
        content = sync.http_get(url,0);
        //0为不超时,其他数值为超时秒数
    }
    catch(err)
    {
        console.log(err);
    }

     

    展开全文
  • MVC 服务端Api接口的开发

    千次阅读 2019-05-13 21:00:49
    总结上一个项目的服务器API开发的流程:(附带源码下载) 实现效果:存储客户端上传的订单数据到数据表,并展示到前端界面,共分为两个模块,此模块主要显示服务端如何存储数据,如何发送数据到前端界面。前后端...

    总结上一个项目的服务器API开发的流程:(附带源码下载)

    实现效果:存储客户端上传的订单数据到数据表,并展示到前端界面,共分为两个模块,此模块主要显示服务端如何存储数据,如何发送数据到前端界面。前后端建立的都是MVC项目,使用DTO模式传输数据。前端获取数据的模块将在下一篇博客介绍。

    第一步:使用VS新建MVC项目,本文展示的项目名称为CSDNTest,进行OrderInformation数据表的数据存储;

    第二步:Model模块(CodeFirst模式,建的类既是数据表的名称)

    namespace CSDNTest.Models
    {
        public class Test
        {
        }
        public class OrderInformation {
            [Key]
            [Required]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int OrderID { get; set; }
            [Required]
            public string UserName { get; set; }
            [Required]
            public string Size { get; set; }
            [Required]
            public int OrderNum { get; set; }
            [Required]
            public DateTime OrderCreateTime { get; set; }
            [Required]
            public DateTime DeliveryTime { get; set; }

        }

        public class CSDNTestData : DbContext {
            public CSDNTestData() : base("name = CSDNTestData")
            {

            }
            public DbSet<OrderInformation> OrderInformations { get; set; }
        }
        /// <summary>
        /// 用于上传参数的返回
        /// </summary>
        public class ResultData
        {
            public string Result { get; set; }
            public ErrorCode Code { get; set; }

        }

        public enum ErrorCode
        {
            OK,
            UserNotLogined,
            WrongParameter,
            UserNameExisted,
            PhoneNumberExisted,
            Exception //异常
        }
    }

    第三步:Controller模块

    namespace CSDNTest.Controllers
    {
        public class XXTestController : Controller
        {
            OrderService orderServcie = new OrderService();
            // GET: XXTest
            public ActionResult Index()
            {
                return View();
            }
            [HttpPost]
            public ActionResult UpdateOrderInfo(OrderInformation state)
            {
                var data = orderServcie.UpdateOrderInfos(state);
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }
    }

    第四步:Service模块(此处是处理客户端上传的数据到数据表)

    namespace CSDNTest.Services
    {
        public class OrderService
        {
            private readonly CSDNTestData _testDB = new CSDNTestData();
            /// <summary>
            /// 订单状态更新
            /// </summary>
            /// <returns></returns>
            public ResultData UpdateOrderInfos(OrderInformation state)
            {
                try
                {
                    var searchResult = _testDB.OrderInformations.Where(p => p.OrderID == state.OrderID).AsNoTracking().FirstOrDefault();
                    //客户追加产品,并假设下单时间、交货时间和规格仍依第一次下单为基准,只叠加数量
                    if (searchResult != null)
                    {
                        var sumNum = searchResult.OrderNum + state.OrderNum;
                        OrderInformation order = new OrderInformation() {
                            OrderID = searchResult.OrderID,
                            Size = searchResult.Size,
                            DeliveryTime = searchResult.DeliveryTime,
                            OrderCreateTime = searchResult.OrderCreateTime,
                            OrderNum = sumNum,
                            UserName = searchResult.UserName,
                        };
                        _testDB.Entry<OrderInformation>(order).State = EntityState.Modified;
                    }
                    //客户第一次下单
                    else {
                        _testDB.OrderInformations.Add(state);
                    }
                    _testDB.SaveChanges();
                    return new ResultData()
                    {
                        Result = "OK",
                        Code = ErrorCode.OK
                    };
                }
                catch (Exception ex)
                {
                    return new ResultData()
                    {
                        Result = "Error",
                        Code = ErrorCode.Exception
                    };
                }
            }
        }
    }

    第五步:web.config模块(Password为自己数据库的sa用户对应的密码)

    <connectionStrings>
        <add name="CSDNTestData" connectionString="Data Source=.;Initial Catalog=CSDNTest;User ID=sa;Password=*******;" providerName="System.Data.SqlClient" />
      </connectionStrings>

    第六步:Global.asax模块(添加CodeFirst初始化数据表,一旦运行程序,数据库就会生成相应的数据表,否则运行程序只有调用数据表的逻辑时,才会CodeFirst生成数据表)

    public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                using (var context = new CSDNTestData()) {
                    context.Database.Initialize(true);
                }

                AreaRegistration.RegisterAllAreas();
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }
        }

    至此服务器端的API接口:http://localhost:58903/XXTest/UpdateOrderInfo就建立好了,此处XXTest是指MVC相应的Controller的名称,UpdateOrderInfo是指相应Controller下的ActionResult。客户端访问该接口,就可以将OrderInformation类型的数据传给服务端。

    源码下载链接:https://github.com/jiangchen521/MVCApi.git

    展开全文
  • iOS的服务端api接口怎么写

    万次阅读 2014-11-26 17:17:49
    在业余时间得到了同事的帮助,了解了下服务端api接口的相关知识。这里当做一个笔记给那些刚刚接触iOS开发的新朋友了解下。PS:想当初我想了解web service的东西的时候,四处都找不到资料,要么就是soap的东东,太老...

           作为一名iOS 码农还是有两年多的时间了,一共换过两家公司,现在的公司主要是做.net相关的产品。在业余时间得到了同事的帮助,了解了下服务端的api接口的相关知识。这里当做一个笔记给那些刚刚接触iOS开发的新朋友了解下。PS:想当初我想了解web service的东西的时候,四处都找不到资料,要么就是soap的东东,太老,反正各种你找不到。

        采用.Net平台的实现api的方式有很多,刚来公司时用的是一般处理程序后缀为*.ashx 或者一面程序*.aspx来返回json;然后是MVC的框架返回json,好吧最后终于迎来了Web api。抛开.net这个框架,其实api的实质不外乎就是返回你需要的数据信息(以json格式展示、或者xml格式)。而这些数据信息可以是在服务后台做了一些逻辑处理a,服务端的c#代码处理逻辑(操作实体);b,用sql代码级别直接在筛选数据的时就做过滤。 当拿到这些数据后,.Net能帮我们做的事情就是序列化为json格式的东东了,然后当你请求的时候返回给客户端而已。而要弄清楚,每个环节当然有其书面的名称,建议有兴趣的可以在www.asp.net的相关章节学习。


    对于iOS客户端开发人员直接面对的是前面两个框框的内容,至于后面的服务端是怎么返回json的看下面的代码吧。


    using BooksApi.DTOs;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Web.Http;
    using System.Web.Script.Serialization;
    
    namespace BooksApi.Controllers
    {
        [RoutePrefix("api/students")]
        public class StudentsController : ApiController
        {
    
            private static readonly Expression<Func<Classmates_T, StudentDto>> AsStudentDto =
        x => new StudentDto
        {
            Name = x.Name,
            Address = x.Address,
            Phone = x.Phone
        };
            MobileVersionEntities dbctx = new MobileVersionEntities();
    
            [Route("{id?}")]
            // GET api/<controller>/5
            public IQueryable<StudentDto> Get(string id = null)
            {
    
                //  var result = (from u in dbctx.Classmates_T select u).ToList<Classmates_T>();
                var res = id != null ?
                    dbctx.Classmates_T.Where(o => o.Name.Contains(id) ||
                        o.Phone.Contains(id)).
                    Select(AsStudentDto) :
                    dbctx.Classmates_T.Select(AsStudentDto).AsQueryable();
                return res;
            }
    
    
    
            // POST api/<controller>
            public void Post([FromBody]string value)
            {
    
            }
    
    
        }
    }

    那么我访问 http://192.168.20.189:6900/bk/api/students?$select=Name,Address 时候就会返回(StudentDto模型)中的两个字段,而Phone这个字段我这里并没有查

    [{"Address":"四川成都高新西","Name":"段叔佑"},{"Address":"深圳","Name":"罗林"}]

    的json数据。

        [RoutePrefix("api/students")] 为特性路由,当你访问xxxx/api/students就会对应找到该WebApi的Controller,默认会运行Get方法,然后数据库中的表Classmate_T包含的字段太多了,这里我现在代码层进行了一次筛选。建立了一个StudentDto的Model来装Classmate_T对应Model中的部分值。
    然后就是操作数据库中得到<span style="font-family: Arial, Helvetica, sans-serif;">Classmates_T,对其中得到你数据进行一次类似策略模式的处理——把Classmate_T对应的实体变成StudentDto实体。</span>

    就是这么简单的几句话,即可完成一个webapi。在代码部分做了一些扩展1,根据id 模糊查询 2,web api odata的query扩展。如果不考虑这些扩展,你写web api在后期可能无法满足等你功能变化的需求,但是总的来说.Net web api这个框架让我们更多专注逻辑的东西,而至于怎么序列化的事情我们就没有必要那么关心了。


    http://download.csdn.net/detail/duanhai189/8201173

    展开全文
  • 服务端 API 接口设计最佳实践

    千次阅读 2015-09-07 16:49:46
    在移动互联网开发领域,我们经常需要针对移动设备,提供数据访问接口。在移动时代以前,接口设计并没有面对这么大的挑战,因为那时期的应用开发,前后端的区分并没有那么明显,需要专门设计接口的场景并不是很多。 ...
  • 2 服务端实现白名单功能,也就是写一个过滤器只允许白名单配置的机器才能访问这个API接口 3post 请求实现 4 服务端接收json格式的数据请求,并返回 json格式数据结果集 5 客户端实现调用服务端接口 6 这是一...
  • 一、移动端开发相关概念 1、APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件。 原生APP 是针对IOS、Android、Windows等不同的手机操作系统要采用不同的语言和框架进行开发出来的,通常...
  • 服务端短信接口API.rar

    2021-05-01 15:31:00
    java短信发送
  • 服务端短信接口API

    2009-03-23 16:35:11
    企业服务器短信接口API描述文档,针对短信发送接收都有描述
  •  之前有介绍过HttpClient作为爬虫的简单使用,那么今天在简单的介绍一下它的另一个用途:在服务端调用接口API进行交互。之所以整理这个呢,是因为前几天在测试云之家待办消息接口的时候,有使用云之家外出登记Light...
  • API接口 模型类 系统的文件信息(图片、文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类。 1) 模型如下: package com.learn.framework.domain.filesystem; import lombok.Data; import lombok....
  • 文章目录RestAPIContent-TypeServletHttpServletRequest请求行请求头请求参数HttpServletResponse状态码SpringBoot中支持Controller与MethodRequestMappingExceptionHandler统一异常捕捉参数自动验证API接口示例Form...
  • 记录一下学习过程中,vuejs 前后端api接口定义的范例,供后面学习参考: import request from "@/utils/request"; import axios from "axios"; const BASE_URL="http://192.168.1.1:39090/api/v1";//定义公共url,...
  • API接口服务端

    2013-07-30 22:13:00
    <?php /** * API接口服务端 * * */ require 'mysql_class.php'; header('Content-Type:text/html;charset=utf-8'); $action = $_GET['action']; switch ($action) { ...
  • 7、客户端与服务端的肥瘦平衡 8、隐式用户与显式用户 9、安全问题 10、良好的接口说明文档和测试程序 11、版本的维护 详细分析请参考 :https://www.hutuseng.com/article/how-to-design-api 转载于:htt...
  • import com.learn.api.filesystem.FileSystemControllerApi; import com.learn.filesystem.service.FileSystemService; import com.learn.framework.domain.filesystem.response.UploadFileResult; import org....
  • 前言:在移动互联网、分布式和微服务盛行的今天,现在好多大点的项目都会采用的微服务框架,前后端...因为这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。 1、前后端接口交互 前端和后端进

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,133
精华内容 1,253
关键字:

服务端api接口