对于 restfulAPI,一般如何选择交换数据的格式呢?

2015-09-17 08:31:19 +08:00
 temberature
主要想请教类似 a=1&b=2 和{ a : 1 , b : 2 }这两种的区别
11207 次点击
所在节点    程序员
64 条回复
matthewgao
2015-09-17 08:55:57 +08:00
通常用 json
crs0910
2015-09-17 08:56:33 +08:00
这是什么意思?不是 GET 和 POST 吗?
vainly
2015-09-17 08:57:09 +08:00
如果是 GET 请求,请求参数要在请求地址后"http://ip:port/doman?a=1&b=1&c=1"
如果是 POST 请求,而且交互使用 JSON 数据格式的话,参数传递会是这样的"{a:1,b=2,c=3,...}"
mithvv
2015-09-17 09:22:22 +08:00
get
a=1&b=2&arr[]=3&arr[]=4
post
{
a:1,b:2,c:[3,4]
}
morethansean
2015-09-17 09:24:52 +08:00
POST 传出去不还是 a=1&b=c
除非你是自定义的 value 值是 json 格式比如 a=1&b=%7Bc%3A%205%7D

> decodeURIComponent ('%7Bc%3A%205%7D')
> "{c: 5}"
jhaohai
2015-09-17 09:32:03 +08:00
json ,感觉已经成为标准了
wshcdr
2015-09-17 09:33:13 +08:00
json 已经是事实上的标准了
learnshare
2015-09-17 10:00:16 +08:00
JSON 几乎作为标准存在了,虽然数据量会大一些
temberature
2015-09-17 10:04:03 +08:00
相关的帖子
Json VS Protobuf https://www.v2ex.com/t/186561
IOS 开发怎么处理数据类型问题? https://www.v2ex.com/t/140470
为什么……不拿另一个 HTTP 服务器来当作数据库来给一个 Web App 使用? https://www.v2ex.com/t/120678
morethansean
2015-09-17 10:08:42 +08:00
不管你提交是否是 JSON ,转换总是需要的,特别是提交数据肯定是需要经过服务器端校验和安全处理的。
而且大多时候提交的数据又不是直接丢数据库去储存的,增删查找需要的字段,和返回的结果本来有些时候就相差甚远,处理逻辑也完全不一样,没必要强行 JSON 格式。
temberature
2015-09-17 10:15:40 +08:00
@morethansean 我说的转换是指这两种字符串能表达的数据结构是等价的,如果只有一种,只需要在一种交换数据和程序变量之间转换。我没有说一定要用什么,只是想知道请教下是否有区别,以及各自的利弊又是什么?
temberature
2015-09-17 10:23:26 +08:00
@learnshare 感觉都浪费在双引号上了
matthewgao
2015-09-17 10:33:15 +08:00
@vainly ”如果是 GET 请求,请求参数要在请求地址后"http://ip:port/doman?a=1&b=1&c=1" “ 这个似乎不是很符合 RESTful 的建议吧
lyz1990
2015-09-17 10:36:19 +08:00
json ,事实标准
temberature
2015-09-17 10:40:55 +08:00
用 JSON 构建 API 的标准指南
http://jsonapi.org/
http://jsonapi.org.cn/
hantsy
2015-09-17 10:46:29 +08:00
@temberature 首先搞清楚什么是 REST 。

InfoQ 上有 Fielding 博士的原始论文的中文翻译版本。

广泛的讲 REST 不限于 HTTP 协议,数据交换格式可以是文本也可以是二进制。狭义的讲,我们通常将 REST 限于 HTTP , JSON 是取常用的数据交换格式, XML 也没问题。

REST 的几个要素:
1. 用一个唯一的 URI 代表资源的定位
2. 用 HTTP 语义( GET , POST , PUT , PATCH , DELETE , HEAD , OPTION 等)操作资源
3. 用 HTTP 状态标志操作结果

常用的 CRUD REST API 可以这样设计:

比如常见的 BLOG 程序,定义一个 /posts 入口。

/posts , GET , 取得所有 POST ,结果是一个 [{},{}]数组,可以接查询参数?page=XXX 等,返回 200 状态。
/posts , POST , 发布新 POST , Request Body 为{title:"text", body:"test body"}, 返回 201 状态。

/posts /{id}, GET , 取得所有单个 POST , URI 需要接 id, 成功返回 200 状态,失败 404 。
/posts /{id} , PUT , 更新 POST , Request Body 为{title:"text", body:"test body"}, 返回 204 状态。
/posts /{id} , DELETE , 删除 POST , 成功 返回 204 状态。

/posts 是对资源集合操作,/posts/{id}对单个资源操作。操作的结果有的有返回数据,更直接的表达结果是 HTTP Status 。

我写的简单的例子, https://github.com/hantsy/angularjs-springmvc-sample
这个例子,目前没写任何 Notes 来描述。

要了解 REST API 实现,可以看另外一个类似的例子 https://github.com/hantsy/angularjs-grails-sample , 这个项目的 WIKI 上的详细介绍。

@temberature 从 REST API 设计角度,你的问题和 REST 一点关系都没有。从设计上角度,查询数据?a=1 仅适用条件过滤,也就是上面第一个 /posts GET 方式。

另外,关于 REST API 设计好坏,有一个 Rechardson 成熟度模型来衡量。它定义了三个级别。国内几个一线大公司的 API 基本都是 Level 0 , 按这个标准衡量来讲,都不是 REST API ,虽然他们 Developer 网站都喜欢写上 REST 的字样。反而一些不大的公司做得不错,比如 JPUSH 等。

当我们考虑 Level3 ( Self-document, Self-Discovery ) 的时候,在交换格式上就有很多细节要去实现。这方面有一些行业标准或者正在标准化的交换格式。

如: HAL , Collection+JSON , JSON API 。
hantsy
2015-09-17 10:51:09 +08:00
@matthewgao GET 是用于查询操作,是可以使用 query parameters 的。
hantsy
2015-09-17 10:52:31 +08:00
@temberature JSON API 目前应用范围不广,不如 HAL 流行, Spring 目前只支持 HAL 。
refear99
2015-09-17 10:52:57 +08:00
取就用 get+query
增删改就用 POST DELETE PUT + json body
temberature
2015-09-17 11:06:18 +08:00
@hantsy 博士的论文我翻过几次,我知道数据交换并不是 rest 的主要关注点,只要想请教下在实际的做法以及如何取舍,感谢分享~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/221304

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX