Actframework中如何靈活控制JSON響應

@DiamondFsd 昨天寫了一篇關於如何在Spring MVC中靈活控制JSON返回的博客,其中@JSON註解的思路和我在actframework的處理方式很是類似。前端

恰好昨天把actframework放上碼雲了,就這個話題寫下 如何在ActFramework中控制JSON返回java

首先是資源和服務。我將就@DiamondFsd的article的例子來作講解git

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

    @UrlContext("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數據。假設我提交的數據是:json

{
	"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列表:mvc

[
  {
    "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.net

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

而後再發出GET /article請求,就能夠獲得下面的響應了:code

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

我能夠在Article.Service.show(String)方法上採用相似的方法來定義須要返回的字段。有人提到過若是想讓前端向後端在請求中傳遞須要的字段該怎麼辦,下面是Actframework提供的方法:blog

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

相關文章
相關標籤/搜索