您的位置:首页 > 编程语言 > Go语言

Google Custom Search API使用详解

2014-03-30 22:08 423 查看
最近工作不是很忙,利用业余时间学习了google的文档。Google对外提供的API功能十分强大,由于篇幅有限,这里仅说一下Google
Custom Search API。这个api提供了搜索的功能,可以搜索图片和文字信息,并以Json的形式返回结果。我们在实际开发中无需引入任何Jar包,仅需调用google的服务即可,非常的好用,下面我会以一个demo项目的形式。

首先Google的东西,当然要看一手的官方文档。





翻译如下:谷歌定制搜索API可以为web程序或桌面程序通过编程的方式提供检索和展现的功能,使用谷歌定制搜索API,你就可以使用RESTful架构的请求网站搜索或者图片搜索,结果以JSON或Atom的格式返回。
PS:默认返回JSON格式






翻译如下:通过调用API,用户的请求对应订制搜索引擎的实例,因此,在使用这个API之前,你需要生成一个ID,在谷歌官网ControlPanel中的Setup > Basics > Details获取这个ID)

值得注意的是,我看到很多文章提到需要拿到一个api key,老版本确实需要一个key,但是现在的googlecustom
search api 已经不需要apikey了。


好了,以上准备工作就绪,下面就开始开发一个DemoProject了。

第一步:申请一个Google帐号并登录,创建一个自己的项目,自定义一个搜索引擎实例。拿到 ID(作为cs参数)。











第二步:新建一个Web Project。定义几个bean,其中包括文字索引查询结果类SearchResultItem类,图片查询结果类SearchResultImage类,查询结果类SearchResult类,图片类Image。





在此由于篇幅有限,bean的相关代码不贴上来了。(如果需要可以下面给我留言)

第三步:写一个servlet,做查询动作,并把结果返回回页面

package google.custom.search.api.servlet;

import google.custom.search.api.bean.Image;
import google.custom.search.api.bean.SearchResult;
import google.custom.search.api.bean.SearchResultItem;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

/**
* Author:wangjian
*/
public class GoogleCustomSearchAPIServlet extends HttpServlet {

// 最大返回结果数
private static final int RESULT_OK = 200;
// 8KB
private static final int BUF_SIZE = 1024 * 8;

// 自定义搜索引擎的ID
private static final String ID = "010589607068358538435:p8ot8fmvira";

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
handle(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
handle(request, response);
}

private void handle(HttpServletRequest request, HttpServletResponse response)
throws IOException {
int start = Integer.parseInt(request.getParameter("start"));
int num = Integer.parseInt(request.getParameter("num"));
String queryExpression = request.getParameter("queryexpression");
String strRequest = "https://www.google.com:443/cse/publicurl?cx="
+ ID
+ "&q=%queryExpression%&searchType=image&start=%start%&num=%num%";
strRequest = strRequest.replace("%queryExpression%", queryExpression)
.replace("%start%", String.valueOf(start))
.replace("%num%", Integer.toString(num));

HttpURLConnection conn = null;
String queryResult = null;
try {
URL url = new URL(strRequest);
conn = (HttpURLConnection) url.openConnection();
// 使用GET方法
conn.setRequestMethod("GET");
int resultCode = conn.getResponseCode();
if (resultCode == RESULT_OK) {
InputStream is = conn.getInputStream();
queryResult = readAsString(is);
is.close();
} else {
System.out.println("Fault on getting http result, code: "
+ resultCode);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
conn.disconnect();
}

if ((queryResult != null) && (queryResult.length() != 0)) {
String respStr = parseResult(queryResult);
System.out.println(respStr);

// 设置返回JSON内容
response.setContentType("application/json; charset=utf-8");
// 设置不缓存内容
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
PrintWriter writer = response.getWriter();
writer.write(respStr);
writer.flush();
writer.close();
}
}

/**
* 将搜索结果字符串转化为需要的对象列表
*
* @param queryResult
* @return
*/
private String parseResult(String queryResult) {
Gson gson = new Gson();
SearchResult e = gson.fromJson(queryResult, SearchResult.class);
System.out.println(queryResult);
SearchResultItem items[] = e.getItems();
Image images[] = new Image[items.length];
for (int i = 0; i < items.length; i++) {
images[i] = new Image(items[i].title, items[i].link,
items[i].displayLink);
}
return gson.toJson(images);
}

/**
* 将输出内容转换为字符串形式
*
* @param ins
* @return
* @throws IOException
*/
public static String readAsString(InputStream ins) throws IOException {
ByteArrayOutputStream outs = new ByteArrayOutputStream();
byte[] buffer = new byte[BUF_SIZE];
int len = -1;
try {
while ((len = ins.read(buffer)) != -1) {
outs.write(buffer, 0, len);
}
} finally {
outs.flush();
outs.close();
}
return outs.toString();
}

}


第四步:将查询结果返回到前台页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>csdn网站即时搜索</title>

<script type="text/javascript" src="../jquery/jquery-1.8.2.js"></script>
<script type="text/javascript">
$(function(){
$("#search").click(function(){
$.post("/GoogleCustomSearchAPIServlet",
{"start": $("#start").val(), "num": $("#num").val(), "queryexpression": $("#queryexpression").val()},
function(data, status){
var html = "<table style='width: 960px; border: 1px solid black;'>";
for(var i = 0; i < data.length; i++){
if (i % 3 == 0)
html += "<tr>";
var image = data[i];
var title = image.title;
var link = image.link;
var displayLink = image.displayLink;
html += "<td style='width: 320px'>" + title + "<img src='" + link + "' width='320px' height='240px'>" + displayLink + "</td>";

if (i % 3 == 2)
html += "</tr>";
}
html += "</table>";
$("table:eq(0)").remove();
$("#resultArea").append(html);
});
});
});

</script>

</head>
<body>
<div id="searchbox" style="width:80%;display:block;margin:0 auto;">
<input type="text" name="field" id="field" style="width:100%;height:50px;margin-top:50px;font-size:40px;" onkeyup="sendQuery();" />
</div>
<div id="main-content">
<div id="cse_g" style="margin:20px;"></div>
</div>

<div><script>
//在Google网站上自定义一个搜索引擎(搜索www.csdn.net的内容,返回一个一段HTML页面代码,用于查询和返回结果)
(function() {
var cx = '010589607068358538435:p8ot8fmvira';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script>
<gcse:search></gcse:search></div>

<label for="queryexpression">搜索内容</label>
<input type="text" id="queryexpression">
<label for="start">从第几个结果开始</label>
<input type="text" id="start">
<label for="num">搜索多少结果</label>
<input type="text" id="num">
<input type="button" id="search" value="搜索">

<div id="resultArea"></div>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: