2013-06-04 23 views
11

Tôi đang sử dụng API tìm kiếm tùy chỉnh của Google trong Java để nhận kết quả của Google theo truy vấn. Tôi đã viết mã này với sự giúp đỡ của bài viết khác, mã được như sau:Nhận được hơn 10 kết quả theo API tìm kiếm tùy chỉnh của Google V1 trong Java

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

Vấn đề là bất cứ khi nào tôi đang sử dụng mã trên mà không num và bắt đầu các thông số nó được thực hiện đúng cách, nhưng đưa ra duy nhất trong top 10 các kết quả. Vì vậy, tôi đã sử dụng num và bắt đầu tham số. Nhưng họ đang tạo ra vấn đề. Ở đây tôi không thể hiểu được vị trí đặt các thông số numbắt đầu vào url. Nó luôn đưa ra HTTP 400 tức là Yêu cầu Không hợp lệ. Tôi đã đọc trang Tài liệu, cũng không có hướng dẫn rõ ràng nào được đưa ra về nơi đặt hai tham số này vào Url.

Vì vậy, nếu có ai giúp tôi giải quyết vấn đề này, tôi sẽ thực sự biết ơn. Cảm ơn bạn.

Trả lời

16

Bạn không thể thực hiện theo cách đó. num chỉ có thể tối đa là 10. Xem

https://developers.google.com/custom-search/v1/using_rest#query-params

num Số kết quả tìm kiếm trả về
Bạn có thể xác định có bao nhiêu kết quả trở lại cho việc tìm kiếm hiện hành. Giá trị hợp lệ là số nguyên từ 1 đến 10, bao gồm. Nếu num không được sử dụng, giá trị là 10 là giả định.

Để hiển thị nhiều kết quả hơn, Google gợi ý làm cho nhiều cuộc gọi, incrementing tham số khởi động khi cần thiết:

http://support.google.com/customsearch/bin/answer.py?hl=en&answer=1361951

Google Custom Search và Google Site Search trở lên đến 10 kết quả mỗi truy vấn . Nếu bạn muốn hiển thị hơn 10 kết quả cho người dùng, bạn có thể đưa ra nhiều yêu cầu (sử dụng các tham số start = 0, start = 11 ... ) và hiển thị kết quả trên một trang. Trong trường hợp này, Google sẽ xem xét từng yêu cầu dưới dạng truy vấn riêng biệt và nếu bạn là sử dụng Tìm kiếm trang web của Google, mỗi truy vấn sẽ được tính vào giới hạn của bạn.

+0

Có nhưng tôi không thể hiểu nơi tôi nên đặt tham số bắt đầu trong URL, bởi vì khi tôi thêm start = 0 hoặc start = 11 ở cuối URL như sau: https://www.googleapis.com/customsearch/v1? key = "+ phím +" & cx = "+ cx +" & q = "+ searchText +" & alt = json "+" & start = "+ 0, nó cho trạng thái HTTP 400 nghĩa là Yêu cầu không hợp lệ. Vậy bạn có thể cho tôi biết chính xác làm thế nào để khung url này bằng cách sử dụng tham số bắt đầu – Joy

+0

Trong mã của bạn, in ra URL bạn đang sử dụng.Một cái gì đó như System.out.println (url.toString()), sau đó sao chép và quá khứ đó vào trình duyệt của bạn. bạn là lỗi đầy đủ ở định dạng JSON, một cái gì đó như thế này (Một mẫu - Tôi chỉ bỏ qua tham số "q" để có được điều này) .Nếu bạn không thể giải quyết vấn đề, hãy đăng kết quả bạn nhận được ở đây. { "lỗi": { "lỗi": [ { "tên miền": "toàn cầu", "lý do": "bắt buộc", "nội dung": "Thông số bắt buộc: q", "locationType": "tham số", "vị trí": "q" } ] , "mã": 400, "message": "Tham số bắt buộc: q" } } –

+5

Được thiết kế thông minh bởi Google. Làm cho chúng tôi thực hiện nhiều yêu cầu hơn, thay vì trả lại nhiều kết quả hơn ... -.- – simon

-1

Trước hết, Google cho biết: "Tham số truy vấn bạn có thể sử dụng với API tìm kiếm tùy chỉnh JSON/Atom được tóm tắt trong phần này. Tất cả giá trị tham số cần được mã hóa URL". https://developers.google.com/custom-search/v1/using_rest#query-params Có nghĩa là mọi thứ sau "?" nên được mã hóa bằng một bộ mã hóa url của url, đặt tiêu chuẩn cho mã hóa url. Thing là lớp URLEncoder của Java không hoàn toàn đúng, bạn phải thực hiện một vài thay thế. Bạn cần thực hiện việc này với thông tin bạn nhập:

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

Lưu ý cách có dấu ngoặc kép xung quanh các số. Nếu bạn có được những từ biến sử dụng như sau:

String thenum = Integer.toString(theinteger); 

Và sau đó mã hóa thích hợp

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

Sau đó, bạn thêm rằng để url unencoded gốc:

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

Trong kết luận của bạn mã sẽ trông giống như sau:

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

Tôi hy vọng điều này phù hợp với bạn. Tôi đã làm một cái gì đó rất giống với api hình ảnh cũ không được chấp nhận, nhưng khái niệm này vẫn giữ nguyên và tôi đã xem các tài liệu mới. :)

EDIT: Đảm bảo rằng thông số num của bạn nằm trong khoảng từ 0 đến 10.

+0

Vâng, tôi đã thử với phương pháp được đề xuất đầu tiên của bạn, tức là tôi đặt dấu ngoặc kép quanh các số trong URL . Nhưng bây giờ nó đang đưa ra cùng một mã lỗi 400, tức là một Yêu cầu Xấu. Bạn đã thử điều này chưa? – Joy

+1

Tôi đã sử dụng api tìm kiếm hình ảnh của Google trước đây, mà chính xác là giống nhau khi nói đến sử dụng, bên cạnh sự cần thiết cho một khóa api và url cơ sở. Tôi quên đề cập đến rằng nó là cần thiết cho tham số num của bạn được mười hoặc ít hơn, như người trả lời khác nói. Nó thậm chí sẽ hoạt động nếu bạn bỏ qua tham số num, miễn là nó nằm trong khoảng từ 0 đến 10. Tôi muốn làm rõ rằng việc mã hóa url là cần thiết chỉ vì các truy vấn có dấu cách trong chúng (chúng thay đổi thành "% 20") và một vài trường hợp đặc biệt khác. Thứ tự của các tham số cũng không quan trọng trong trường hợp này. Chúc may mắn! –

+3

Không đúng: 'num' không thể lớn hơn 10 (bao gồm); giá trị hợp lệ là 1 ~ 10. 'bắt đầu' không thể là' 0'; giá trị hợp lệ là số nguyên lớn hơn 0. – Raptor

Các vấn đề liên quan