Laravel5设计json api时候的一些道道

对于返回数据格式没规整的问题

在开发api的时候,这个问题是和客户端交涉最多的问题,比如一个user结构,返回的字段原本是个user_name的,它应该是string类型。但是呢,由于数据库设计这个字段的时候允许为null,那么这个字段获取回来,就可能返回null,这个对于弱类型语言是没什么问题的,但是对于强类型的语言,可能就要增加字符的类型判断了。

或者是数据库中的text字段,里面存放的是json数据,现在取出来的时候我要做一些转换等。

所以对这个问题,我们会想到做一个类的格式方法。这个方法自然就是写在model中,在laravel5中,我使用这种方法:

model中:

class Inbox extends Model {

    protected $table = 'inbox';

    public static function format()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);

            return $tmp;
        };
    }

    public static function formatRaw()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];

            return $tmp;
        };
    }
}

这里的Inbox设计了两种返回格式,每种返回格式都是返回的闭包函数,然后在controller中

$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$data = $inboxs->transform(Inbox::formatRaw());

好了,这样返回的$data就是进行结构化好的数据了。

这里主要想说laravel的Collection中的transfrom函数太好用了,参数是一个闭包,然后这个闭包封装在model中,好处是一旦客户端想要修改或者更新某个输出字段,我们就可以只要修改format函数就行。

对于返回外带外键的问题

比如上面一个例子中,往往inbox有个uid,接口需要它返回user的信息。那么这个时候,model的foreign key就起到很好的作用

class Inbox extends Model {

    protected $table = 'inbox';

    public function user()
    {
        return $this->hasOne('User', 'id', 'uid');
    }

    public static function format()
    {
        return function($item) {
            $user = $item->user;
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);
            $tmp['user'] = $user;
            return $tmp;
        };
    }
}

但是这里切记别让每个数据循环获取user,我们应该显示地使用load或者with:

$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$inboxs->load('user');
$data = $inboxs->transform(Inbox::formatRaw());

总结

基本将这样两个问题解决,设计好orm,使用laravel来写接口就很快了。

时间: 2024-10-31 23:11:40

Laravel5设计json api时候的一些道道的相关文章

如何更好的设计RESTful API

当您的数据模型已开始稳定,您可以为您的网络应用程序创建公共API. 你意识到,很难对你的API进行重大更改,一旦它发布,并希望尽可能得到尽可能多的前面. 现在,互联网对API设计的意见有很多. 但是,因为没有一个广泛采用的标准在所有情况下都有效,所以你前面有一堆选择:你应该接受什么格式? 你应该如何认证? 你的API是否应该版本化?构建API是您可以做的最重要的事情之一,以提高您的服务的价值. 通过使用API,您的服务/核心应用程序有可能成为其他服务增长的平台. 看看当前巨大的科技公司:Face

ios-IOS- ImageShack JSON API上传图片

问题描述 IOS- ImageShack JSON API上传图片 想要使用上传图片到ImageShack,使用它们的API 代码: - (void)uploadImage2:(UIImage *)image { NSData *imageToUpload = UIImagePNGRepresentation(image); if (imageToUpload) { NSMutableDictionary *parameters = [[NSMutableDictionary alloc] in

Java Json API:Gson使用简单入门

GSON是Google开发的Java API,用于转换Java对象和Json对象.本文讨论并提供了使用API的简单代码示例.更多关于GSON的API可以访问:http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇.本文是其他文章的基础,因此不需要任何GSON或JSON经验.第二篇文章提供了关于GSON反序列化(从JSON到Java)的示例,第三篇文章提供了关于GSON序列化(从Java到JSON)的示例. 下面列出的所有代码都可以在https://

设计云API管理策略

云API管理是监督企业云布局的IT专家面对的最重要任务之一.一天结束时,云实际上只是API和服务的收集.基于基础设施的API执行放置数据到存储设备之类的功能,同时基于应用的API控制其他任务,比如为银行计算利率等.它们会顺着任务表单逐条执行. 基础资源库和API跟踪技术允许你把策略放在周围,然后控制访问云API.这些策略是小型过程式的程序,帮助你定义限制条件.比如,企业可以限制在一天的特定时间才能进行API访问,或者控制用户角色访问权限.云API管理工具是可扩展的,有一套它们自己的API供选择.

JSON API in Javascript

1. Serialize JavaScript object  to JSON var messageObject = { title: 'Hello World!', body: 'It\'s great!' }; var serializedJSON = JSON.stringify( messageObject ); });   2. Parse JSON to Javascript Object var serializedJSON = '{"title":"Hell

浅谈关于JavaScript API设计的一些建议和准则

  这篇文章主要介绍了浅谈关于JavaScript API设计的一些建议和准则,文中列举了许多知名的JS API进行辅助说明,极力推荐!需要的朋友可以参考下 设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为

设计并实现超媒体API

本文(这一系列的第二篇文章)的主题是超媒体服务器的实现.本文用到的消息设计和问题领域描述已经 在之前的文章中介绍过.在本文中,我们首先会简要介绍超媒体服务器的角色(路由.评估和执行),然后会 讨论它的基础实现,包括组件层.展现层和连接层.最后,我们将简要介绍一个超媒体API的客户端浏览器: 特别是常见的Web浏览器和命令行工具的限制以及"媒体类型浏览器"的优点. 本文详细介绍了使用 Node.js构建一个完整功能的服务器所需的高层细节信息.为了让事情相对简单一些,本文中的示例实现并没

从达标到卓越 —— API 设计之道

新技术层出不穷,长江后浪推前浪.在浪潮褪去后,能留下来的,是一些经典的设计思想. 在前端界,以前有远近闻名的 jQuery,近来有声名鹊起的 Vue.js.这两者叫好又叫座的原因固然有很多,但是其中有一个共同特质不可忽视,那便是它们的 API 设计 非常优雅. 因此这次我想来谈个大课题 -- API 设计之道. 讨论内容的定义域 本文并不是<jQuery API 赏析>,当我们谈论 API 的设计时,不只局限于讨论「某个框架应该如何设计暴露出来的方法」.作为程序世界分治复杂逻辑的基本协作手段,

我所理解的RESTful Web API [设计篇]

<我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建REST风格的Web服务是最近两三年风行的潮流,所以很多人以为REST是一个事物.而事实却是:REST自其诞生之日起到现在(2014年)已经有14年了,它为什么叫这么一个"奇怪"的名字呢? 目录 一.为什么叫这个"奇怪"的名字?二.采用URI标识资源 二.采用URI标识