CouchDB's RESTful API

阅读更多

实验环境:   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/ CouchDB's RESTful API_第1张图片
    • 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"}

      • 新增(更新)文档
      • 删除文档
  • CouchDB's RESTful API_第2张图片
  • 大小: 21.2 KB
  • 查看图片附件

你可能感兴趣的:(CouchDB,json,Ajax,jQuery,Apache)