首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

RESTful 项目中对 Cloudant 服务的封装使用(5)

RESTful 项目中对 Cloudant 服务的封装使用(5)

服务器端对 Cloudant 基本操作的封装Cloudant 数据库提供的 API 不能直接去访问 cloudant.com 域名,因为你的 web 项目是部署在自己的服务器上的,如果你直接去访问 cloudant.com 域名,就会造成跨域访问,浏览器对跨域有安全上的限制。虽然可以通过 JSONP 的方式,获取跨域的资源,但只能实现 HTTP 的 GET 请求,不能满足你访问 Cloudant 数据库的所有操作。因此在 web 项目中需要将从页面上的 Cloudant 请求在服务器端进行封装,封装后访问 Cloudant 的 API,再把从 Cloudant 获取的结果数据返回给浏览器。这就实现了 web 项目通过页面访问 Cloudant 数据库。
本节介绍如何对 Cloudant 基本操作进行分装,主要包括增删改查(CRUD)。在 Cloudant 中存储的文件格式都是 JSON 格式。每一个文档必须要有一个_id 键值和一个_rev 键值,其中_id 表示文档唯一的 id 值,_rev 表示该文档的版本号。
Cloudant 的 API 为如下信息:
表 2.Cloudant 数据库基本操作的 APIHTTP请求方式URL 路径描述POST/db创建一个新的文档GET/db/doc返回最新版本的文档PUT/db/doc插入一个新的文档,或者修改已经存在文档DELETE/db/doc删除一个已经存在的文档
如何增加一个 JSON 格式文档,根据 Cloudant 提供的 API,可以手动指定该文档的 id,如果不指定文档 id,那么 id 会由 Cloudant 自动产生。
首先设置 web 服务器的访问访问 Cloudant 数据库路径,指定对应的访问数据库,初始化一个 JSON 格式的文档变量,调用 saveDoc 函数,通过 POST 方法把 doc 发送到 web 服务器上。
清单 4.浏览器端创建文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$('#create').click(function() {
var doc = $.parseJSON('{"title":"HTML and CSS: Design and Build Websites",'
+'"price":20,"authors":["Jon Duckett"],"language":"html"}');
$.couch.urlPrefix = '../jaxrs/cloudant';
var db = $.couch.db('crud');
db.saveDoc(doc,{
success : function(response, textStatus, jqXHR) {
console.log('success');
// do something if the save works
},
error : function(jqXHR, textStatus, errorThrown) {
// do something else if it goes wrong
console.log('error');
}
});
  });




设置 cloudant.com 的路径,获取初始化后 CloseableHttpResponse 对象,把浏览器端传过来的 JSON 对象转化为 StringEntity 对象,再把其放入 HttpPost,并调用 execute 函数,把返回的 httpresponse 转为 JSON 格式封装后的 response。
清单 5.服务器段创建文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@POST
@Produces(value = MediaType.)
@Path(value = "/{db}")
public Response SaveDoc(@PathParam("db") String db, JSONObject json) {
HttpPost httpPost = new HttpPost(cloudantURL + db);
System..println(cloudantURL + db);
CloseableHttpResponse response = null;
CloseableHttpClient client = getClient();
try {
StringEntity entity = new StringEntity(json.toString());
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Connection", "keep-alive");
response = client.execute(httpPost);
HttpEntity ReEntity = response.getEntity();
String responseString = EntityUtils.toString(ReEntity, "UTF-8");
int status = response.getStatusLine().getStatusCode();
Header[] headers = response.getAllHeaders();
client.close();
return httpResponse2JsonRespone(status, responseString, headers);
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Response.serverError().build();
  }




查找一个文档,这里使用一个最简单方式,通过文档的 id 来查找对应的文档。
先设置 web 服务器的访问 Cloudant 数据库路径,指定对应的访问数据库,并调用 openDoc 方法,传入对应的文档 id 和请求返回之后的回调函数。
清单 6.浏览器查找文档
1
2
3
4
5
6
7
8
9
10
$('#read').click(function() {      
        $.couch.urlPrefix = '../jaxrs/cloudant';
        var db = $.couch.db('crud');
        db.openDoc(id,{
            success:function(data){
                $('#read').innerhtml
                console.log(data);
            }
        });
    });




设置 cloudant.com 的路径,获取初始化后 CloseableHttpResponse 对象,把浏览器端传过来 JSON 对象转化为 StringEntity 对象,再把其放入 HttpPost,并调用 execute 函数。把返回的 httpresponse 转为 JSON 格式封装后的 response。
清单 7.服务器端查找文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@GET
@Produces(value = MediaType.APPLICATION_JSON)
@Path(value = "/{db}/{docid}")
public Response getDocById(@PathParam("db") String db,
      @PathParam("docid") String docid) {
    HttpGet httpGet = new HttpGet(cloudantURL + db + "/" + docid);
    System.out.println(cloudantURL + db + "/" + docid);
    HttpResponse response = null;
    CloseableHttpClient client = getClient();
    try {
      response = client.execute(httpGet);
      HttpEntity entity = response.getEntity();
      String responseString = EntityUtils.toString(entity, "UTF-8");
      System.out.println(responseString);
      int status = response.getStatusLine().getStatusCode();
      Header[] headers = response.getAllHeaders();
      client.close();
      return httpResponse2JsonRespone(status, responseString, headers);
    } catch (ClientProtocolException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return Response.serverError().build();
  }




更新一个文档,首先设置 web 服务器的访问访问 Cloudant 数据库路径,指定对应的访问数据库,初始化一个 JSON 格式的文档变量,必须要有_id 和_rev键值,设置请求 header 的 If-Match 的值为浏览器的请求参数 rev,调用 saveDoc 函数,通过 POST 方法把 doc 发送到 web 服务器上。



返回列表