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

在开发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. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  2. A Silverlight Bug ?

    昨日在写Silverlight程序的时候,遇到一个问题,感觉是Silverlight的Bug.使用版本是Silverlight5.异常信息如下: 行: 56错误: Silverlight 应用程序中未 ...

  3. Restful.Data v2.0发布,谢谢你们的支持和鼓励

    v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力. v2.0在除了细枝末节外,在功能上主要做了一下更新 ...

  4. 淘宝UWP桌面版公测-谁需要邀请码?

    今天taobaoUWP桌面版上线beta测试了.哪位朋友需要邀请码的,请与我联系. 前提是,您的PC已经升级到Windows 10 10586版本了,否则无法使用. 邀请码数量有限,一人一枚,共20枚 ...

  5. Web 架构师的能力(转)

    文/刘如鸿 最近和几个朋友在谈到时下流行的Web 2.0,也提到了其中最重要的角色——架构师.多方各有争执,不外乎是因为背景和视角的缘故,包括架构一词,本身就从建筑学借鉴而来,至于架构师,则可以 简单 ...

  6. js实现DOM结构

    /* 编写一段js脚本生成下面的DOM结构.要求使用标准的DOM方法或属性 <div id='example'> <p class='slogan'>淘,你喜欢</p&g ...

  7. 线程池ThreadPool知识碎片和使用经验速记

    ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...

  8. ubuntu:activate root

    You must activate the usr of root,when using a pc with a new os of ubuntu. This command: sudo passwd ...

  9. MySQL 5.7新特性之Generated Column(函数索引)

    MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  10. struts2学习笔记之五:表单数据收集的几种方式

    方法一:struts2对ModelDriven模式的支持(模型驱动模式) Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式 Acti ...