`

CouchDB's RESTful API

    博客分类:
  • Lab
阅读更多

实验环境:   Ubuntu 7.10,  CouchDB 0.8.0, Curl in shell, Httpheader plugin for firefox

 

 

  • CouchDB以及商业应用, Reference URL:   http://couchdb.apache.org/  && http://wiki.apache.org/couchdb/CouchDB_in_the_wild
  • 启动和打开后台管理
    • $ sudo /usr/local/bin/couchdb start
      Apache CouchDB 0.8.0-incubating (LogLevel=info)
      Apache CouchDB is starting.
    • 在browser(i.e. FF) 输入 http://localhost:5984/_utils/
    • www目录(作简单的测试,你可以在这里):  $  /usr/local/share/couchdb/www,   $ ls;
      browse  CouchDbToDo  couch_tests.html  favicon.ico  grid.css  image  index.html  jquery.editable-1.3.3.js  myTodo.html  replicator.html  script  style  todo.css  todo.html
  • CouchDB's javascript API
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License.  You may obtain a copy
// of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
// License for the specific language governing permissions and limitations under
// the License.

(function($) {
  $.couch = $.couch || {};
  $.fn.extend($.couch, {

    allDbs: function(options) {
      options = options || {};
      $.ajax({
        type: "GET", url: "/_all_dbs",
        complete: function(req) {
          var resp = $.httpData(req, "json");
          if (req.status == 200) {
            if (options.success) options.success(resp);
          } else if (options.error) {
            options.error(req.status, resp.error, resp.reason);
          } else {
            alert("An error occurred retrieving the list of all databases: " +
              resp.reason);
          }
        }
      });
    },

    db: function(name) {
      return {
        name: name,
        uri: "/" + encodeURIComponent(name) + "/",

        compact: function(options) {
          options = options || {};
          $.ajax({
            type: "POST", url: this.uri + "_compact",
            contentType: "application/json",
            dataType: "json", data: "", processData: false, 
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 202) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The database could not be compacted: " + resp.reason);
              }
            }
          });
        },
        create: function(options) {
          options = options || {};
          $.ajax({
            type: "PUT", url: this.uri, contentType: "application/json",
            dataType: "json", data: "", processData: false, 
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 201) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The database could not be created: " + resp.reason);
              }
            }
          });
        },
        drop: function(options) {
          options = options || {};
          $.ajax({
            type: "DELETE", url: this.uri, dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The database could not be deleted: " + resp.reason);
              }
            }
          });
        },
        info: function(options) {
          options = options || {};
          $.ajax({
            type: "GET", url: this.uri, dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else  if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("Database information could not be retrieved: " +
                  resp.reason);
              }
            }
          });
        },
        allDocs: function(options) {
          options = options || {};
          $.ajax({
            type: "GET", url: this.uri + "_all_docs" + encodeOptions(options),
            dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("An error occurred retrieving a list of all documents: " +
                  resp.reason);
              }
            }
          });
        },
        openDoc: function(docId, options) {
          options = options || {};
          $.ajax({
            type: "GET",
            url: this.uri + encodeURIComponent(docId) + encodeOptions(options),
            dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The document could not be retrieved: " + resp.reason);
              }
            }
          });
        },
        saveDoc: function(doc, options) {
          options = options || {};
          if (doc._id === undefined) {
            var method = "POST";
            var uri = this.uri;
          } else {
            var method = "PUT";
            var uri = this.uri  + encodeURIComponent(doc._id);
          }
          $.ajax({
            type: method, url: uri + encodeOptions(options),
            contentType: "application/json",
            dataType: "json", data: toJSON(doc),
            complete: function(req) {
              var resp = $.httpData(req, "json")
              doc._id = resp.id;
              doc._rev = resp.rev;
              if (req.status == 201) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The document could not be saved: " + resp.reason);
              }
            }
          });
        },
        removeDoc: function(doc, options) {
          options = options || {};
          $.ajax({
            type: "DELETE",
            url: this.uri + encodeURIComponent(doc._id) + encodeOptions({rev: doc._rev}),
            dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("The document could not be deleted: " + resp.reason);
              }
            }
          });
        },
        query: function(mapFun, reduceFun, language, options) {
          options = options || {};
          language = language || "javascript"
          if (typeof(mapFun) != "string") {
            mapFun = mapFun.toSource ? mapFun.toSource() : "(" + mapFun.toString() + ")";
          }
          var body = {language: language, map: mapFun};
          if (reduceFun != null) {
            if (typeof(reduceFun) != "string")
              reduceFun = reduceFun.toSource ? reduceFun.toSource() : "(" + reduceFun.toString() + ")";
            body.reduce = reduceFun;
          }
          $.ajax({
            type: "POST", url: this.uri + "_temp_view" + encodeOptions(options),
            contentType: "application/json",
            data: toJSON(body), dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("An error occurred querying the database: " + resp.reason);
              }
            }
          });
        },
        view: function(name, options) {
          options = options || {};
          $.ajax({
            type: "GET", url: this.uri + "_view/" + name + encodeOptions(options),
            dataType: "json",
            complete: function(req) {
              var resp = $.httpData(req, "json");
              if (req.status == 200) {
                if (options.success) options.success(resp);
              } else if (options.error) {
                options.error(req.status, resp.error, resp.reason);
              } else {
                alert("An error occurred accessing the view: " + resp.reason);
              }
            }
          });
        }
      };
    },

    info: function(options) {
      options = options || {};
      $.ajax({
        type: "GET", url: "/", dataType: "json",
        complete: function(req) {
          var resp = $.httpData(req, "json");
          if (req.status == 200) {
            if (options.success) options.success(resp);
          } else if (options.error) {
            options.error(req.status, resp.error, resp.reason);
          } else {
            alert("Server information could not be retrieved: " + resp.reason);
          }
        }
      });
    },

    replicate: function(source, target, options) {
      options = options || {};
      $.ajax({
        type: "POST", url: "/_replicate", dataType: "json",
        data: JSON.stringify({source: source, target: target}),
        contentType: "application/json",
        complete: function(req) {
          var resp = $.httpData(req, "json");
          if (req.status == 200) {
            if (options.success) options.success(resp);
          } else if (options.error) {
            options.error(req.status, resp.error, resp.reason);
          } else {
            alert("Replication failed: " + resp.reason);
          }
        }
      });
    }

  });

  // Convert a options object to an url query string.
  // ex: {key:'value',key2:'value2'} becomes '?key="value"&key2="value2"'
  function encodeOptions(options) {
    var buf = []
    if (typeof(options) == "object" && options !== null) {
      for (var name in options) {
        if (name == "error" || name == "success") continue;
        var value = options[name];
        if (name == "key" || name == "startkey" || name == "endkey") {
          value = toJSON(value);
        }
        buf.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
      }
    }
    return buf.length ? "?" + buf.join("&") : "";
  }

  function toJSON(obj) {
    return obj !== null ? JSON.stringify(obj) : null;
  }

})(jQuery);

  • CouchDB's  RESTful  API

文档库操作

    • 查看所有库( 描述信息)

      1. curl -X GET  "http://localhost:5984/_all_dbs" ;   Response:      ["survey","test_suite_db_b","test_suite_db","test_suite_db_a","fruit","test","todo"]

    • 查看单个库( 描述信息)

      1. curl -X GET  "http://localhost:5984/test/";   Response:  {"db_name":"test","doc_count":0,"doc_del_count":0,"update_seq":112,"compact_running":false,"disk_size":15889}

    • 创建

      1. curl -X PUT "http://localhost:5984/testdb";   Response: {"ok":true}

    • 删除

      1. curl -X DELETE "http://localhost:5984/testdb";   Response: {"ok":true}

    • 压缩

      1. curl -X POST http://localhost:5984/test/_compact  -H 'Content-Type: application/json' -d '';   Response: {"ok":true}

    • 库同步或复制

    • [ 分布式] 查询(采用Map/Reduce)

    • 视图( 即文档可视化)

    • 文档操作(对当前库的)

      • 查看所有文档
        • curl -X GET "http://localhost:5984/test/_all_docs";   Response:
          {"total_rows":1,"offset":0,"rows":[
          {"id":"test","key":"test","value":{"rev":"4100948714"}},
          {"id":"test2","key":"test2","value":{"rev":"107550922"}}
          ]}
      • 打开文档
        • 打开最新版本: 

          curl -X GET "http://localhost:5984/fruit/apple?revs_info=true";  Response:
          {"_id":"apple","_rev":"2755175234","_revs_info":[{"rev":"2755175234","status":"available"}]}

        • 打开一个历史版本:

          curl -X GET "http://localhost:5984/survey/_design/company?rev=2543967448"; Response: {"_id":"_design\/company","_rev":"2543967448"}

      • 新增(更新)文档
      • 删除文档
  • 大小: 21.2 KB
分享到:
评论

相关推荐

    couchdb-cheat-sheet:描述 CouchDB 的 RESTful API 的 CouchDB 备忘单

    这是 CouchDB 的 RESTful API 的备忘单。 它显示了最常见和最常用的请求命令,并显示了每个部分的示例。 制作这份备忘单的动机实际上是在我在 SinnerSchrader 的工作中推动的(没有更多的内部结构......抱歉;-))...

    CouchDB的MongoDBAPI层CloudantMango.zip

    Mango 是源自 MongoDB 的 Apache CouchDB 查询语言接口,也就是 CouchDB 的 MongoDB API 层。 标签:Cloudant

    Beginning CouchDB.pdf

    2. **Web应用**:CouchDB的RESTful API使其成为构建现代Web应用的理想选择。 3. **物联网**:CouchDB的轻量级特性和分布式特性使得它在物联网领域有着广泛的应用前景。 4. **大数据分析**:CouchDB的数据存储方式...

    CouchDB资料整理

    作为分布式数据库,CouchDB具备多版本并发控制(MVCC)、水平扩展性、RESTful API、不支持动态查询、原子性操作、数据可靠性、最终一致性和离线支持等特点。 多版本并发控制(MVCC)是CouchDB的显著特点之一,它允...

    CouchDB权威指南(带详细目录)PDF

    通过《CouchDB权威指南》,你将学会如何通过CouchDB的RESTful Web接口来使用它,此外你还会熟悉CouchDB的一些主要特性,比如简单的文档的CRUD(创建、读取、更新、删除); 高级的MapReduce,部署优化等更多的内容...

    hapi-couchdb-store:CouchDB REST和前端API

    hapi-couchdb商店CouchDB REST和前端API范围目标是为静态应用程序创建非常简单的服务器,该服务器只能通过安全ID来存储,同步和共享数据。 在/api公开 *,并在/store.js公开一个预初始化的 。 * CouchDB在管理方中,...

    jcouchdb jar 1.0 couchdb

    CouchDB是一款开源的文档型数据库,支持分布式、RESTful API和JSON数据格式,特别适合于那些需要高度可用性和数据一致性的项目。 CouchDB的主要特点包括: 1. **JSON数据存储**:CouchDB以JSON格式存储文档,易于...

    Node.js-复制整个CouchDB集群的一种容错方法

    这通常涉及设置HTTP请求以访问CouchDB的RESTful API。 2. **配置复制**:在CouchDB中,复制是通过发送HTTP请求到源数据库,指定目标数据库来启动的。我们需要为每个源节点配置复制规则,使其向集群中的其他节点复制...

    Ektorp:CouchDB的Java API

    埃克托普 Ektorp是使用作为存储引擎的持久性API。 Ektorp的目标是将类似JPA的功能与CouchDB提供的简单性和灵活性相结合。特征以下是您应该在项目中考虑使用Ektorp的一些很好的理由: 丰富的领域模型。 利用提供的...

    数据库CouchDB入门到精通.txt打包整理.zip

    CouchDB提供了基于HTTP的RESTful API,用户可以通过HTTP请求操作数据库。主要的HTTP方法有GET、PUT、POST、DELETE,分别对应查看、创建、更新和删除文档。通过URL和请求体,可以实现对数据库的全面管理。 四、文档...

    couchdb源码

    CouchDB是一款开源的文档数据库管理系统,以其独特的JSON数据模型、RESTful API和分布式系统设计而闻名。在深入探讨CouchDB源码之前,我们首先理解CouchDB的基本概念和工作原理。 CouchDB的核心是基于JSON...

    couchdb1.1+json处理+php连接数据库

    标题中的"CouchDB 1.1"指的是一个特定版本的开源文档数据库系统,它使用JSON作为数据存储格式,并且支持RESTful API进行交互。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读性和易于解析...

    CippyDB:您自己的 CouchDB 的实时 API

    CouchDB 是一个开源、分布式文档型数据库,它使用 JSON 作为数据格式,并支持 RESTful API 和多版本控制,非常适合用于 web 应用程序。CippyDB 提供了额外的功能,使得开发者可以实时监听数据库的变化,极大地提高了...

    Apache-CouchDB.zip

    CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母缩写,它反映了 CouchDB...

    CouchDB

    它采用JSON来存储数据,使用JavaScript作为MapReduce查询语言,并通过HTTP/RESTful API进行数据交互。CouchDB的主要特性包括:易于复制、分布式处理能力以及强大的故障恢复机制等。 #### 二、MapReduce在CouchDB中...

    apache-couchdb-2.3.1.zip

    6. **HTTP API**:CouchDB完全基于HTTP协议,这意味着你可以通过简单的RESTful接口与数据库进行交互,这极大地简化了开发和集成过程。 7. **_replication_**:CouchDB的复制功能使其能够在不同的服务器之间无缝地...

    apache-couchdb-2.3.1.msi

    CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母缩写,它反映了 CouchDB...

    CouchDB权威指南

    - **RESTful API**:CouchDB使用HTTP协议进行通信,遵循REST原则,使得通过Web服务与数据库交互变得简单。 - **视图和MapReduce**:CouchDB使用MapReduce函数进行数据索引和查询,用户可以自定义视图逻辑,实现...

Global site tag (gtag.js) - Google Analytics