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

在开发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来写接口就很快了。

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

  1. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  2. Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

    摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...

  3. gRPC helloworld service, RESTful JSON API gateway and swagger UI

    概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...

  4. 免费json API

    免费json API http://www.bejson.com/knownjson/webInterface/

  5. JSON API:用 JSON 构建 API 的标准指南中文版

    译文地址:https://github.com/justjavac/json-api-zh_CN 假设你和你的团队以前争论过使用什么方式构建合理 JSON 响应格式, 那么 JSON API 就是你的 ...

  6. [译]试用新的System.Text.Json API

    译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...

  7. .NET Core 3.0 里新的JSON API

    为什么需要新的JSON API? JSON.NET 大家都用过,老版本的ASP.NET Core也依赖于JSON.NET. 然而这个依赖就会引起一些版本问题:例如ASP.NET Core某个版本需要使 ...

  8. 在.Net Core 3.0中尝试新的System.Text.Json API

    .NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...

  9. ETCD:HTTP JSON API通过gRPC网关

    原文地址:HTTP JSON API through the gRPC gateway etcd v3 使用 gRPC 作为消息协议.etcd项目包括一个基于gRPC的Go客户端和一个命令行工具,et ...

随机推荐

  1. 算法:POJ1006 三重峰值问题

    这题有直接套公式的解法 这里提供一个O(n)的解法. package practice; import java.io.BufferedInputStream; import java.util.Sc ...

  2. Java设计模式9:代理模式

    代理模式 代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构 有些情况下,一个客户不想活着不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间 ...

  3. 一个App完成入门篇(一)-从Hello world开始

    程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...

  4. 浅谈Excel开发:五 Excel RTD函数

        上文介绍了Excel中的UDF函数,本文介绍一下同样重要的RTD函数.从Excel 2002开始,Excel引入了一种新的查看和更新实时数据的机制,即real-time data简称RTD函数 ...

  5. C# 获取当前日期在指定日期范围内是第几周

    public static int GetWeekOfDay(DateTime start, DateTime end) { //总周数 )); //用于存储日期 var weekDic = new ...

  6. Effective Java 创建和销毁对象

    <Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...

  7. JavaScript高级-定义函数(类)方法

    1.定义普通函数(常用) //1.普通函数 function defineFun1(p1, p2) { return p1 + p2; } 2.定义匿名函数(最常用) //2.匿名函数 var def ...

  8. java 堆栈分析2

    有了mat.同时我们发现Java有提供jvisualvm, jvisualvm是一个不错的工具: heap dump . thread dump. cpu/mem profile 无所不能. 不过观察 ...

  9. Python内建的对象列表

    Python内建的对象列表 刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起... 在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多 ...

  10. 为什么说基于TCP的移动端IM仍然需要心跳保活?

    1.前言 很多人认为,TCP协议自身先天就有KeepAlive机制,为何基于它的通讯链接,仍然需要在应用层实现额外的心跳保活?本文将从移动端IM实践的角度告诉你,即使使用的是TCP协议,应用层的心跳保 ...