我使用了一个用 Sinatra 编写并使用非关系数据库 (MongoDB) 的网络服务 API。
有这样存储的东西:
article:{
"title:"foo",
"comments": ["first comment", "lolz", "fake comment"],
"foo", "bar"
}
更新方法要求我再次发送所有具有修改值的数据。所以,如果我想添加评论,我需要发送:
article: {
"title:"foo",
"comments": ["first comment", "lolz", "fake comment", "another comment"],
"foo", "bar"
}
这可能会导致数据丢失。例如:
Bob 在他的 iPhone 上获取了这篇文章。爱丽丝在她的 iPad 上收到了同样的文章。他们读了。 Bob 决定留下一个长评论。 Alice 留下了简短的评论并在 Bob(提出更新请求)之前完成。一段时间后 Bob 完成并发表评论 - 提出更新请求重写 Alice 的评论。
我认为这是一个问题。这样做的结果是一个新的 API 调用,用于向具有特定 ID 的文章添加评论 - 而不是再次发送所有现有参数。
这仍然不行(如果我确实更新了一个参数,我仍然必须发送数组)。我猜想在执行 POST 或 PUT 时,模型的数组字段不应该可用。 应该有另一个称为 URL 的资源(如果数据库中的模型保持不变,至少对于最终用户而言)。
我不知道这方面的好方法。
最佳答案
这只是一个示例 - 我不知道您使用的是 Mongoid 还是什么。这些都是即兴的,如果有什么不对的地方,我们深表歉意。
假设您有一个文章模型,其方法如下:
class Article
# Stuff
def add_comment(comment)
@comments.push comment
end
# More stuff.
end
我不明白为什么不能有这样的路线:
post '/api/article/:article_id/comment/:comment' do
# retrieve an article by its ID.
article.add_comment params[:comment]
article.save
end
即使您没有模型,也只是一个查询问题,例如:
article_collection.update(
{_id: BSON::ObjectId.from_string(params[:article_id])},
{"$push" => {comments: {params[:comment]}},
{w: 1} # Or 0 if you like to live dangerously.
)
关于mongodb - Sinatra + MongoDB 导致 unRESTful API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17191344/