google custom search使用(三)

下面我们来看一个实际案例:

首先我们建立一个servlet,代码如下:


搜索结果的图片类定义


public class SearchResultImage {
//    "contextLink": "http://zh.wikipedia.org/wiki/%E8%8A%B1",
//    "height": 188,
//    "width": 250,
//    "byteSize": 24465,
//    "thumbnailLink": "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQU2J6pZj2kHhl39Z5bjndI1RJXgb7Jbx1xLV7kc2crbt9VbFoJiUDJlQ",
//    "thumbnailHeight": 83,
//    "thumbnailWidth": 111
	public String contextLink;
	public int height;
	public int width;
	public int byteSize;
	public String thumbnailLink;
	public int thumbnailHeight;
	public int thumbnailWidth;
}

搜索结果的item定义

package com.freesoft.model.gcs;

public class SearchResultItem {
	public String kind;
	public String title;
	public String htmlTitle;
	public String link;
	public String displayLink;
	public String snippet;
	public String htmlSnippet;
	public String mime;
	public SearchResultImage image;
//	"kind": "customsearch#result",
//	   "title": "花- 维基百科,自由的百科全书",
//	   "htmlTitle": "\u003cb\u003e花\u003c/b\u003e- 维基百科,自由的百科全书",
//	   "link": "http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Plum_flowers.jpg/250px-Plum_flowers.jpg",
//	   "displayLink": "zh.wikipedia.org",
//	   "snippet": "花- 维基百科,自由的百科全书",
//	   "htmlSnippet": "\u003cb\u003e花\u003c/b\u003e- 维基百科,自由的百科全书",
//	   "mime": "image/jpeg",
//	   "image": {
//	   }
}

搜索结果定义



import com.google.gson.JsonObject;

public class SearchResult {
	// 多余的字段可以不要
	private String kind;
	private JsonObject url;
	private JsonObject queries;
	private JsonObject context;
	private JsonObject searchInformation;
	// 这是我们需要的字段
	private SearchResultItem items[];
	
	public String getKind() {
		return kind;
	}
	public JsonObject getUrl() {
		return url;
	}
	public JsonObject getQueries() {
		return queries;
	}
	public JsonObject getContext() {
		return context;
	}
	public JsonObject getSearchInformation() {
		return searchInformation;
	}
	public SearchResultItem[] getItems() {
		return items;
	}
	public void setKind(String kind) {
		this.kind = kind;
	}
	public void setUrl(JsonObject url) {
		this.url = url;
	}
	public void setQueries(JsonObject queries) {
		this.queries = queries;
	}
	public void setContext(JsonObject context) {
		this.context = context;
	}
	public void setSearchInformation(JsonObject searchInformation) {
		this.searchInformation = searchInformation;
	}
	public void setItems(SearchResultItem[] items) {
		this.items = items;
	}
	

}

输出的类型定义


public class Image {
	// 标题
	private String title;
	// 图片地址
	private String link;
	// 分享网站
	private String displayLink;
	
	public Image(String title, String link, String displayLink) {
		super();
		this.title = title;
		this.link = link;
		this.displayLink = displayLink;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getLink() {
		return link;
	}
	public void setLink(String link) {
		this.link = link;
	}
	public String getDisplayLink() {
		return displayLink;
	}
	public void setDisplayLink(String displayLink) {
		this.displayLink = displayLink;
	}
}

Servlet定义

import com.google.gson.Gson;

public class GCSServlet extends HttpServlet {
	private static final long serialVersionUID = -1275024561023110262L;
	private static final int RESULT_OK = 200;
	private static final int BUF_SIZE = 1024 * 8; // 8k
	private static final String API_KEY = "AIzaSyBKmmLBxKXaZpIdDcdyIZDJA6_yrN-ejHI"; // API
																						// key
	private static final String UNIQUE_ID = "012004925040627705852:rsqwwhrqtr0"; // Unique
																					// ID

	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);
	}

	/**
	 * 
	 * 这里提供了如何使用请求的例子 https://developers.google.com/custom-search/v1/using_rest
	 * 注意以下几个参数: 标准参数: alt,可选参数json, atom,用于指定返回值格式,默认值是json
	 * callback,JavaScript回调函数 prettyPrint,返回内容是否采用便于人类阅读的格式,默认值是true API自定义参数:
	 * cx,CSE的唯一标识符 num,搜索结果个数,可选值1~10,默认为10 q,搜索表达式
	 * safe,可选值high(开启搜索结果最高安全级别过滤)、medium(开启中等级别安全过滤)、off(关闭安全过滤)
	 * searchType,可选值image,如果未设置,返回值将被限定为网页
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	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.googleapis.com/customsearch/v1?key=%API_KEY%&cx=%UNIQUE_ID%&q=%queryExpression%&searchType=image&start=%start%&num=%num%";
		strRequest = strRequest.replace("%API_KEY%", API_KEY)
				.replace("%UNIQUE_ID%", UNIQUE_ID)
				.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);

			// 设置返回内容
			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();
	}

}


用来测试的html页面


<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
    <title>jQuery ajax test</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript" src="../jquery/jquery-1.8.2.js"></script>
    <script type="text/javascript">
	$(function(){
		$("#search").click(function(){
				$.post("/GCSServlet.action", 
					{"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>
  <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>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值