API开发第四篇:定义客户端/服务端接口协议

在进行API开发的时候,需要事先定义好app与server交互的数据格式,这样前端人员与服务端人员才能够事先决定好如何获取数据、如何解析数据、如何传输协议。
在我看来目前接口协议无外乎这三种情况:
     1. json数据进行交互
     2. xml数据进行交互
     3. 自定义数据格式交互
     自定义数据格式进行前后端的数据交互,需要花费较大的精力,而且需要很有经验的人设计的协议才会确保各个平台的兼容以及良好的可阅读性。并且解析、封装都需要自己来用代码实现,很多第三方库都没办法用上。因为这里我不进行讨论。主要说说json与xml作为交互数据。
     我在我的response中封装了json与xml。客户端可以根据自己的需要进行选择是获取json数据还是xml。指定方法是在请求的url中指定format=json/xml。这里为了程序的健壮,我会默认指定一种数据格式的返回,也就是如果客户端没有或者忘记设置format时,默认返回json数据。
     **json数据的封装,在php中用json来进行数据交互是非常方便。实现代码:**
    private static function jsonSucEncode($code, $msg, $datas){
        if(!is_numeric($code)){
            return ‘‘;
        }

        $ret = array(
                ‘succode‘   => $code,
                ‘sucmsg‘    => $msg,
                ‘datas‘     => $datas,
        );

        echo json_encode($ret);
    }
$code表示返回的状态码,这个状态码应该在文档中进行说明含义,并事先定义好
$msg表示返回的信息,我觉得这个字段是有必要的,至少方便客户端开发人员进行错误定位。备注:我最开始就没有设计这个字段,而只是设计了$code这个状态吗,前端人员每次都要到文档中进行查看这个状态码是什么含义,很影响开发速度。
$datas:这个就是返回给前端的业务数据了。
然后使用json_encode()对这个数据编码后,就是json数据了。
xml数据的封装相对来说比较麻烦,方法有很多,我使用的是用字符串进行拼接:
    private static function xmlSucEncode($code, $msg, $datas){
        if(!is_numeric($code)){
            return ‘‘;
        }

        $ret = array(
                ‘succode‘   => $code,
                ‘sucmsg‘    => $msg,
                ‘datas‘     => $datas,
        );

        echo self::xml($ret);
    }
    private static function xml($datas){
        header("Content-Type:text/xml");

        $xml = "<?xml version=‘1.0‘ encoding=‘UTF-8‘?>";

        $xml .= ‘<root>‘;
        $xml .= self::createXML($datas);
        $xml .= ‘</root>‘;

        return $xml;
    }
    private static function createXML($datas){
        $xml = $attr = "";

        foreach ($datas as $k=>$v){
            if(is_numeric($k)) {// 如果k是数字,则将其作为一个属性来使用
                $attr = " id=‘{$k}‘";
                $k = "item";
            }

            $xml .= "<{$k}{$attr}>";
            $xml .= is_array($v) ? self::createXML($v) : $v;
            $xml .="</{$k}>";
        }

        return $xml;
    }

然后现在xml数据、json数据的封装方式都有了,此时应该提供一个统一的接口,供前台来调用,通过参数进行控制,返回xml数据还是json数据。而不是这样子抛出去两个接口,让客户端的人自己选择。同时抛出去两个接口还有一个问题:如果要更换,更换的就是接口的名称以及它的参数。

这里我定义的统一接口:

    public static function sendEncode($code, $msg, $state, $datas=array(), $type=self::JSON){
        // 如果请求参数设置了请求类型,则返回请求的类型,否则使用参数中的类型,默认为json
        $type = isset($_GET[‘format‘]) ? $_GET[‘format‘] : $type;

        switch ($type){
            // json格式数据
            case self::JSON :
                if($state == self::SUCCESS){
                    self::jsonSucEncode($code, $msg, $datas);
                }else{
                    self::jsonErrEncode($code, $msg);
                }
                exit;
                break;
            // xml数据
            case self::XML :
                if($state == self::SUCCESS){
                    self::xmlSucEncode($code, $msg, $datas);
                }else{
                    self::xmlErrEncode($code, $msg);
                }
                exit;
                break;
            // 其他数据格式请求
            default:
                self::jsonErrEncode(self::ILLEGAL_CODE, self::ILLEGAL_MSG);
                exit;
                break;
        }
    }

这里边有一些常量,我是定义在response这个类里边的,这里就不写出来了,相信大家应该可以猜到。如果有人需要这个工具的完整实现方式,可以留下邮箱,我发给您,共同学习进步。

第五篇我会分享一下我在接口设计中APP注册这一部分的实例。

时间: 2024-10-10 23:15:24

API开发第四篇:定义客户端/服务端接口协议的相关文章

api服务端接口安全

api服务端接口安全性解析 http://blog.csdn.net/tenfyguo/article/details/8225279 常用的基于token的实现方案 http://blog.csdn.net/tenfyguo/article/details/8225279 token常常用在各种应用中,如下场景: 1,用户输入密码和帐号后,系统进行验证后,生成一个session,分配一个sessionid给使用者,后续服务使用者就无需每次都输入密码和验证密码了,只需把对应的帐户和session

api服务端接口安全性解析针对

针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录才能访问: 4.有点接口不需要用户登录就可访问: 针对以上特点,移动端与服务端的通信就需要2把钥匙,即2个token.第一个token是针对接口的(api_token):第二个token是针对用户的(user_token): 先说第一个token(

基于CXF框架下的SOAP Webservice服务端接口开发

最近对webservice 进行入门学习,网上也是找了很多的学习资料.总得感觉就是这了解点,那了解点.感觉不够系统,不够容易入门.差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了.我先写服务端,在说客户端. 框架:服务端webservice是spring+cxf的maven工程. 环境:jdk1.7+maven3.3.9+tomcat7 新建maven工程可以参考我之前的博客:使用eclips创建Maven项目. 1.引入开发的依赖.pom.xml<project xmlns

移动端与PHP服务端接口通信流程设计(增强版)

增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/"作为分割线,如 blog/Index/addBlog api_domain varchar(256) 所属领域 is_enabled tinyint(1) 是否可用  1:可用 0:不可用 add_time int 添加时间(戳) (注:只列出了核心字段,其它的再扩展吧!!!) 授权表 字段名 字

API开发第五篇:服务端整合支付宝快捷移动支付接口

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>在开发中需要使用支付宝的快捷移动支付接口,通过文档知道,当完成客户端请求完成后,支付宝服务器会异步通知客户端的服务器.这里的关键是提供给支付宝的这个用于异步通知的con

(C/C++)基于SharpUI控件库的插件式框架开发--第三篇框架基础服务库

一个框架基础的东西,一般也是操作的最基础的类,比如char.int.bool等,有时出现内存泄露的问题导致错误的抛出,但是C++开发有的时候就算是抛出异常,那也是靠经验来积累才能非常快速准确的找出错误所在,这就需要在框架中需要添加日志管理的接口,日志管理的好处就是开发者自身在找异常时提供参考,另一个就是如果用户操作时出现问题,也可将日志反馈,帮助快速解决问题:总之了为了更好的扩展完善我的框架,我详细列一下这个基础服务库(XPCore)包含内容: 虽说sharpui控件库内封闭好string类,但

Android Studio开发第四篇版本管理Git(下)

前面一片介绍了在as下如何关联远程仓库,这篇就介绍在开发过程中怎么应用. 提交+Push 如果本地开发代码有改动了或者你觉得某功能做完了,你打算把改动代码提交到远程仓库,这个时候很简单, 还是在工具栏找到VSC箭头朝上的按钮. 这时首先会弹出commit changes对话框,然后再下面的蓝色Commit按钮点右边下拉三角形,选中Commit and push 本地commit成功之后就会弹出push commit对话框,点push就推送到远程仓库了. 更新+Pull 我们直接在远程仓库更改代码

基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现

原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件libGBT28181SipComponent.so实现Linux 32平台的UAS和UAC,因为该组件采用很多新的技术,所以采用该组件效率无疑是很高的.但是对于想学习SIP协议,或者想了解eXosip2开发流程的程序员,是不能从根本上了解学习的.因为所有的功能都封装在libGBT28181SipCo

微信开发第四篇----已关注用户管理

公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求. 接口调用请求说明 http请求方式: GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID 参数 是否必须