18

我正在使用 Java 中的 Google 自定义搜索 API 来获取 Google 的结果以响应查询。我在其他帖子的帮助下编写了这段代码,代码如下:

    url = new URL("https://www.googleapis.com/customsearch/v1?key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+0+"&num="+30);
    HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
    System.out.println("Connection opened!");
    conn2.setRequestMethod("GET");
    conn2.setRequestProperty("Accept", "application/json");
    BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn2.getInputStream())));

问题是,每当我使用上面没有 num 和 start 参数的代码时,它都会正确执行,但只给出前 10 个结果。所以我使用了 num 和 start 参数。但他们正在制造问题。在这里,我无法理解将numstart参数放在 url 中的哪个位置。它总是给出 HTTP 400 即错误请求。我已阅读文档页面,也没有明确说明将这两个参数放在 Url 中的何处。

因此,如果有人帮助我解决这个问题,我将不胜感激。谢谢你。

4

2 回答 2

30

你不能那样做。num 最多只能是 10。请参阅

https://developers.google.com/custom-search/json-api/v1/reference/cse/list#num

num - 无符号整数
要返回的搜索结果数。有效值是 1 到 10 之间的整数,包括 1 和 10。

为了显示更多结果,Google 建议进行多次调用,根据需要增加start参数:

https://developers.google.com/custom-search/json-api/v1/reference/cse/list#start

start - 无符号整数 要返回的第一个结果的索引。有效值是从 1 开始的整数(默认值),第二个结果是 2,依此类推。例如 &start=11 给出结果的第二页,默认“num”值为每页 10 个结果。注意:使用 JSON API 的任何查询都不会返回超过 100 个结果,即使超过 100 个文档与查询匹配,因此将 (start + num) 设置为超过 100 会产生错误。请注意,num 的最大值为 10。

于 2013-06-05T00:04:16.290 回答
-1

首先,Google 说:“本节总结了您可以与 JSON/Atom 自定义搜索 API 一起使用的查询参数。所有参数值都需要进行 URL 编码。” https://developers.google.com/custom-search/v1/using_rest#query-params意思是“?”之后的所有内容 应该使用相当于设置 urlencoding 标准的 php url 编码器进行编码。问题是 Java 的类 URLEncoder 不太正确,你必须做几个 replaceAll 的。您需要对输入执行此操作:

String queryArguments = "key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30";

注意数字周围有引号。如果您从变量中获取这些,请使用以下内容:

String thenum = Integer.toString(theinteger);

然后是正确的编码

String addition = URLEncoder.encode(queryArguments, "UTF-8")
.replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");

然后将其添加到原始未编码的 url:

String url = "https://www.googleapis.com/customsearch/v1?"
String total = url + addition;

总之,您的代码将如下所示:

String query = URLEncoder.encode("key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30"), "UTF-8").replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");
URL url = new URL("https://www.googleapis.com/customsearch/v1?" + query);
HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
System.out.println("Connection opened!");
conn2.setRequestMethod("GET");
conn2.setRequestProperty("Accept", "application/json");
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn2.getInputStream())));

我希望这对你有用。我用旧的不推荐使用的图像 api 做了一些非常相似的事情,但是这个概念是一样的,我查看了新的文档。:)

编辑:确保您的 num 参数介于 0 和 10 之间。

于 2013-06-05T03:33:50.853 回答