Skip to main content

MongoDB HTTP 接口初探

RESTful(Representational State Transfer,即表现层状态转化) API,是一种统一的机制,方便不同的前端设备与后端进行通信。本周简单介绍一下MongoDB的一些REST API框架,翻译自MongoDB官方文档

 
00:00/00:00

Eve (Python)

Eve是一个开源的Python REST API框架。 它允许大家轻松地构建和部署MongoDB提供的、高级定制、功能完备的RESTful Web服务。

代码库已经在Python 2.6,2.7,3.3,3.4和Pypy的环境下完全测试通过。

所有你需要将REST Web服务联网的是一个MongoDB数据库、一个配置文件和一个启动脚本。总的说来,我们会发现:配置和调优API是一个非常简单的流程。

  • 强调REST
  • CRUD操作的全部范围
  • 可定制的资源终端
  • 可定义的多个物品终端
  • 过滤和排序
  • 分页
  • HATEOAS
  • JSON和XML绘制
  • 条件的请求
  • 数据集成和一致性控制
  • 批量插入
  • 数据验证
  • 可扩展的数据验证
  • 资源级别的缓存控制
  • API版本
  • 文档版本
  • 验证
  • 其它许多…

RESTHeart(Java)

MongoDB 的 RESTHeart Java REST API服务器,基于Undertow非堵塞的HTTP服务器。许可证: GNU AFFERO GENERAL PUBLIC LICENSE 版本3。

  • 数据上的CRUD操作API
  • 数据模型操作API:创建数据库、集合、索引和数据结构
  • 超级简单的配置、配置方法的约定
  • 用户管理和ACL的可插拔安全性
  • HAL超媒体类型
  • 超级轻量的管道架构,大约6Mb的footprint,大约200M的内存峰值使用,以毫秒开始计
  • 高吞吐量:MongoDB性能方面的非常小的花销
  • 水平扩展:完全无状态的架构,以支持MongoDB复制集和分片
  • Undertow运行非阻塞的HTTP服务器上构建
  • 嵌入Mike Kelly(HAL说明的作者)提供的优异的HAL浏览器
  • 支持Cross-Origin Resource Sharding(CORS),让你的一页网站应用可以处理在不同域名上运行的RESTHeart。换句话说,CORS是JSONP的一个改进。
  • 作为AngularJS后端(或其它任何MVW JavaScript框架)的思想

DrowsyDromedary (Ruby)

DrowsyDromedary 是MongoDB基于Ruby的一个REST层。

Crest (Node.jS)

Crest是MongoDB基于node.js使用MongoDB Node Native driver 的一个REST API服务器。

AMID

AMID是MongoDB的一个REST接口。使用 Node.js进行编写,支持多线程和模块化架构以自信个性化的检索操作。AMID也提供了一个可用的extjs GUI用于查询:AMIDGUI

MongoDB Java REST 服务器

MongoDB 基于 JettyJava REST服务器

Kule

Kule是MongoDB基于Python的定制化REST接口。

DreamFactory

DreamFactory是一个MongoDB的REST API开源后台。DreamFactory on Github

HTTP 接口

Sleepy Mongoose (Python)

Sleepy Mongoose是一个功能完备的MongoDB HTTP接口。

HTTP状态接口

从3.2开始,MongoDB的HTTP接口已经过期。

MongoDB提供了一个简单的HTTP接口,列举管理员关心的信息。如果你在mongod--rest选项启用接口,你可以通过一个端口来访问这些信息,这个端口值为配置的mongod端口大1000的数值。例如,HTTP接口的默认端口是 28017。如果想要使用管理员的方式访问HTTP接口,例如,如果mongod 在本地机器上的默认端口上运行,我们就可以直接在浏览器访问 http://localhost:28017

下面是HTTP接口一些信息元素的描述:

元素 描述
db version 数据库版本信息
git hash 数据库版本开发者tag
sys info mongod 编译环境
dblocked 指示主节点 mongod是否占用互斥锁
uptime mongod示例启动已花时间
assertions mongod实例导致的所有软件assertions
replInfo 复制集配置的信息
currentOp 最近的客户请求
#databases 当前mongod实例能够存取的数据库数目
curclient 当前mongod实例最近存取的数据库
Cursors 描述未处理的客户端游标
master 当前mongod实例是否已经被分配给主节点
slave 当前mongod实例是否已经被分配给从节点
initialSyncCompleted 该从节点或复制集节点是否已经完成了其正在复制的mongod实例
DBTOP 显示mongod实例花在每个显示集合上的总是讲,以及最近该节点分配给各列出集合的可用时间比例、读写数以及最近的调用数等
dt 关于主节点mongod互斥锁的时间信息

HTTP状态接口的安全性

警告:请保证在生产环境中禁止HTTP状态接口、REST API以及JSON API,以防止数据泄露的可能性以及被黑客攻击的脆弱。请查阅 安全性以及MongoDB API接口 了解更多信息。

如果为一个mongod实例已经配置了安全性,那么对于客户端而言就需要得到授权才能从其它机器上获取HTTP状态接口。

注意:尽管MongoDB企业版支持 Kerberos 授权,但是在任何版本的MongoDB的HTTP状态接口都不支持 Kerberos 。

3.0版本中的修改

HTTP状态接口和REST API都不支持 SCRARM-SHA-1,从3.0版本开始引入请求-响应用户授权机制。

简单的REST API

为了方便,mongod 进程包括一个简单的REST API。它不支持插入、更新或者删除操作,一般只用于监控、警告脚本以及管理性任务。如果想使用完整的REST功能的话,可以考虑使用外部的REST 接口,例如 Sleepy Mongoose

v1.4+:该API默认关闭,因为它可能会提供未授权读取数据。在命令行使用 -rest 来开启该API,但是请特别注意安全提醒。

可以通过下面的网址获取某个集合的内容(注意后面的斜杠):
http://127.0.0.1:28017/databaseName/collectionName/

增加一个返回条数限制:
http://127.0.0.1:28017/databaseName/collectionName/?limit=-10
跳过前面几条数据:
http://127.0.0.1:28017/databaseName/collectionName/?skip=5
查询条件满足 {a:1}的文档:
http://127.0.0.1:28017/databaseName/collectionName/?filter_a=1
使用&来分割条件:
http://127.0.0.1:28017/databaseName/collectionName/?filter_a=1&limit=-10
统计集合中的文档数目:
http://host:port/db/$cmd/?filter_count=collection&limit=1
执行任意命令:下面的命令类似于在shell中在admin数据库上运行db.$cmd.findOne({listDatabase:1})
http://localhost:28017/admin/$cmd/?filter_listDatabases=1&limit=1

简单REST API中的JSON

与shell相反,简单的REST API使用严格的JSON,前者使用日期、正则表达等。为了展示费JSON类型。web接口将它们包装在对象中,并且使用键来作为类型,例如:

  1. # ObjectIds just become strings
  2. "_id" : "4a8acf6e7fbadc242de5b4f3"
  3. # dates
  4. "date" : { "$date" : 1250609897802 }
  5. # regular expressions
  6. "match" : { "$regex" : "foo", "$options" : "ig" }

如果我们试图在浏览器中展示这些类型的话,由于代码类型仍然未被实现,将会导致数据库崩溃。

请查阅 Mongo拓展JSON 了解更多细节。

复制集管理界面

mongod进程包含一个简单的管理界面用来监控复制集的状态。

如果需要使用的话,首先在mongod命令行允许--rest选项。rest端口为加上1000(因此,默认端口为28017)。在启动这个选项之前,请确认该端口是安全的。

然后我们可以在web浏览器中访问:http://<hostname>:28017/,接着点击复制集状态(/_replSet)以跳转到复制集状态页面。

 

其它

之前也有官方讲座介绍过如何使用MEAN stack来创建一个REST API,用于使用MongoDB搭建第一个应用:讲座地址

打赏
微信扫一扫支付
微信logo微信扫一扫, 打赏作者吧~

mickey

记录生活,写给几十年后的自己。