文档章节

Actframework中如何灵活控制JSON响应

罗格林
 罗格林
发布于 2017/02/17 08:59
字数 613
阅读 385
收藏 3

@DiamondFsd 昨天写了一篇关于如何在Spring MVC中灵活控制JSON返回的博客,其中@JSON注解的思路和我在actframework的处理方式非常相似。

刚好昨天把actframework放上码云了,就这个话题写下 如何在ActFramework中控制JSON返回

首先是资源和服务。我将就@DiamondFsd的article的例子来做讲解

@Entity("article")
public class Article extends MorphiaAdaptiveRecord<Article> {

    @Controller("article")
    public static class Service extends MorphiaDao<Article> {

        @GetAction
        public Iterable<Article> list() {
            return findAll();
        }

        @GetAction("{id}")
        public Article show(String id) {
            return findById(id);
        }

        @PostAction
        public Article create(Article article) {
            return save(article);
        }
        ...
    }

}

这里我们看到可以通过 POST /article向服务提交article数据。假设我提交的数据是:

{
	"title": "How to control JSON view in Actframework",
	"content": "BlahBlah",
	"author": "Gelin Luo",
	"language": "Java",
	"framework": "Actframework",
	"tags" : [
		{"name": "java"},
		{"name": "mvc"},
		{"name": "json"}
	]
}

我可以得到类似下面的返回:

{
  "id": "58a6409ab6c6fe2138b67f10",
  "_created": "17/02/2017 11:15:22 AM",
  "content": "BlahBlah",
  "v": 1,
  "language": "Java",
  "author": "Gelin Luo",
  "title": "How to control JSON view in Actframework",
  "_modified": "17/02/2017 11:15:22 AM",
  "framework": "Actframework",
  "tags": [
    {
      "name": "java"
    },
    {
      "name": "mvc"
    },
    {
      "name": "json"
    }
  ]
}

当我发出GET /article请求时,Article.Service.list()方法会响应并返回所有的article列表:

[
  {
    "id": "58a6409ab6c6fe2138b67f10",
    "_created": "17/02/2017 11:15:22 AM",
    "content": "BlahBlah",
    "v": 1,
    "language": "Java",
    "author": "Gelin Luo",
    "title": "How to control JSON view in Actframework",
    "_modified": "17/02/2017 11:15:22 AM",
    "framework": "Actframework",
    "tags": [
      {
        "name": "java"
      },
      {
        "name": "mvc"
      },
      {
        "name": "json"
      }
    ]
  }
]

那如果我想控制返回列表的数据,让每项只返回authortitle,我可以在list()方法上面添加注解PropertySpec

@GetAction
@act.util.PropertySpec("author,title")
public Iterable<Article> list() {
    return findAll();
}

然后再发出GET /article请求,就可以得到下面的响应了:

[
  {
    "author": "Gelin Luo",
    "title": "How to control JSON view in Actframework"
  }
]

我可以在Article.Service.show(String)方法上采用类似的方法来定义需要返回的字段。有人提到过如果想让前端向后端在请求中传递需要的字段该怎么办,下面是Actframework提供的方法:

show(String)方法做一点改动

@GetAction("{id}")
public Article show(String id) {
    return findById(id);
}

变为

@GetAction("{id}")
public Article show(String id, String fields) {
    PropertySpec.current.set(fields);
    return findById(id);
}

然后就可以从前端在请求中加载fields参数了:

GET /article/58a6409ab6c6fe2138b67f10?fields=-tags,-content,-_created

上面的请求表示从返回JSON结果中去掉tags, content,和_created三个字段

返回结果将会是:

{
  "id": "58a6409ab6c6fe2138b67f10",
  "v": 1,
  "language": "Java",
  "author": "Gelin Luo",
  "title": "How to control JSON view in Actframework",
  "_modified": "17/02/2017 11:15:22 AM",
  "framework": "Actframework"
}

该博客的完整源码在码云

ActFramework: https://www.oschina.net/p/actframework

© 著作权归作者所有

共有 人打赏支持
罗格林

罗格林

粉丝 289
博文 43
码字总数 41912
作品 4
其他
架构师
私信 提问
加载中

评论(4)

罗格林
罗格林

引用来自“TonyLiu13”的评论

github 上面有一个类似的 jackson 插件跟这个思路很像: https://github.com/Antibrumm/jackson-antpathfilter

支持通配, 减(-), 级联

回复@TonyLiu13 : Act 的JSON支持建立在FastJSON上面的。不过是自己写的Path filter
TonyLiu13
TonyLiu13
github 上面有一个类似的 jackson 插件跟这个思路很像: https://github.com/Antibrumm/jackson-antpathfilter

支持通配, 减(-), 级联
罗格林
罗格林

引用来自“李嘉图”的评论

思路虽然相似,约定以后更灵活了,而且-号竟然是减去的意思😆😆
除了减号,还能支持正则表达式用于复杂对象结构的情况😆
李嘉图
李嘉图
思路虽然相似,约定以后更灵活了,而且-号竟然是减去的意思😆😆
ActFramework-1.3.0 - 页面缓存,模板路径等多项更新

猛戳 此处 立刻查看激动人心的特性 ActFramework 是一个功能强大易用的 Java 全栈 Web 开发框架. 依托于 undertow 提供的网络层服务, ActFramework 摈弃了老式难用的 Servlet 框架, 并提供了...

罗格林
2017/05/03
808
9
Act-starter 1.8.8.0 强势发布 - 带来端到端自动化测试支持

Act-starter 1.8.8.0 是以 act-1.8.8-RC4 为核心的多个 starters 项目集合. 这个版本带来超过 40 项修改或增强: [act-e2e] 新的插件带来端到端自动化测试支持 [act-ebean]注册全局映射过滤器...

罗格林
05/14
644
2
精心打磨的 Act-1.8.8 出炉了

11 个 RC 版本, 6个月的精心打磨, ActFramework 1.8.8 终于出炉了. 这次版本带来了 220 个错误修复或改进, 其中最主要的特性是 自动化测试支持 数据库访问的增强,包括简化事务的使用以及对 ...

罗格林
11/01
2.2K
28
ActFramework R1.4.0 带来 WebSocket 支持

ActFramework R1.4.0 发布了,R1.4.0版最重要的更新是 WebSocket 的支持 #17 WebSocket 支持 ActFramework 终于支持 WebSocket 了 聊天室应用: Echo 应用: 关于更详细的 websocket 支持, 可参...

罗格林
2017/06/13
1K
3
ACT 1.8.3 发布 - 包含多项有趣更新

本来昨天就该发布的,难得 sonatype 的同步故障让我给赶上了,于是拖到了今天。 重要的事情先说 act-ebean 更名为 act-ebean-java7 act-ebean2 更名为 act-ebean act-starter-ebean-aaa 更名...

罗格林
03/27
1K
23

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部