1

我正在使用json-server将 json 数据作为 REST api 推送。

服务器返回(上图)获取请求,如下所示:

http://localhost:3000/items?itemid=534

返回:

[
  {
    "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
  }
]

回报是JSON array,但不是JSON object

我该怎么办,返回 json 对象

数据文件为:data.json

{
  "items": [
    {
      "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
    },
    {
      "itemid": 234,
    "type": "textcontent",
    "icon": "http://exampple.com/2png",
    "title": "Smith",
    "description": "Description2",
    "url": "http://example.net/project/doSomething2"
    }
    ]
}
4

3 回答 3

1

如果您将数据更改为如下所示:

{
  "items": [
    {
      "id": 534,
      "type": "textcontent",
      "icon": "http://exampple.com/1png",
      "title": "John",
      "description": "Description",
      "url": "http://example.net/project/doSomething"
    },
    {
      "id": 234,
      "type": "textcontent",
      "icon": "http://exampple.com/2png",
      "title": "Smith",
      "description": "Description2",
      "url": "http://example.net/project/doSomething2"
    }
  ]
}

然后您可以使用以下网址访问各个项目: http://localhost:3000/items/534

于 2016-03-01T20:35:47.163 回答
0

我认为这是您正在使用的 URL 方案的期望行为。如果您使用标识单个资源的 URL,服务器应该只返回一个对象。

当您使用查询参数时,您的请求会显示“请返回所有 item_id 为 534 的匹配项目”。这意味着 json-server 当然会返回一个项目数组。没有特别的知识表明这itemid是一个独特的。如果您想指定一个特殊项目,您应该使用该特定项目的 URL,该 URL 应该看起来像http://localhost:3000/items/534.

这篇文章很好地解释了这些概念:http: //www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

更新

我把你的问题弄错了。您希望将所有结果数据包含在一个特殊键下,而不是直接包含在数组值下。查看它的文档json-server似乎很容易扩展现有行为。该router.render()功能可以帮助您实现目标吗?https://github.com/typicode/json-server#module

router.render = function (req, res) {
  res.jsonp({
    yourkey: res.locals.data
  })
}

如果您希望键与您正在查询的资源类型相匹配,您可能需要查看req对象以找出请求的实体类型。

于 2016-03-01T21:07:38.847 回答
0

这很简单。您需要做的就是将数据映射到客户端上。我使用了 Rx.Observable.from 方法,但这将适用于其他方法,如 fromPromise。

const data = [{
    "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
  }
];

const data$ = Rx.Observable.from(data)
  .map(arr=> {
     return JSON.stringify({
       "items": arr
     });
  });

 data$.subscribe(x=> console.log(x));
 // this will print out something like this
//{"items":{"itemid":534,"type":"textcontent","icon":"http://exampple.com/1png","title":"John","description":"Description","url":"http://example.net/project/doSomething"}}

另请注意,如果事后只需要一个对象,则可以只返回 {'items':arr} 。

于 2016-03-01T20:54:53.440 回答