2014-03-29 98 views
1

我使用谷歌的自定義搜索API,我試圖通過一些Ruby代碼來訪問它:來自瀏覽器的好請求,但來自ruby的錯誤請求?

下面是代碼片段

req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + keyword, followlocation: true) 
res = req.run 

看來,答案的身體是這一個:

<p>Your client has issued a malformed or illegal request. <ins>That’s all we know.</ins> 
' 
    from /usr/local/lib/ruby/2.1.0/json/common.rb:155:in `parse' 
    from main.rb:20:in `initialize' 
    from main.rb:41:in `new' 
    from main.rb:41:in `<main>' 

當我嘗試從瀏覽器做同樣的事情,它就像一個魅力。更令人困惑的是,這個相同的代碼在12小時前工作。我只更改了它應該查找的關鍵字,但是它開始返回錯誤。

有什麼建議嗎?我敢肯定,我有足夠的積分以獲得更多請求

+0

您的關鍵字是否包含任何時髦的字符?像'?#&/。+'等等或任何Unicode字符? – amoebe

+0

我嘗試過「天空線」,然後「天空/線」來逃離空間。也許沒有任何東西可以返回,但是出現錯誤 – Bula

+2

試試'sky + line'和'sky%20line'吧。我認爲你應該使用'CGI :: escape'來避免任何錯誤:http://ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/CGI.html#method-c-escape – amoebe

回答

1

您的get參數keyword中的特殊字符可能有問題。如果您在瀏覽器中輸入網址,瀏覽器會調整這些網址。但是,對於ruby,您需要轉義這些字符,以便像"sky line"這樣的字符串變爲"sky+line"等等。有一個效用函數CGI::escape,用於這樣的:

require 'cgi' 
CGI::escape("sky line") 
=> "sky+line" 

你的固定代碼會是這個樣子:

req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + CGI::escape(keyword), followlocation: true) 
res = req.run 

但是,由於您使用的百頭巨怪,無論如何,你應該能夠利用其params參數,讓百頭巨怪處理轉義:

req = Typhoeus::Request.new(
    "https://www.googleapis.com/customsearch/v1?&cx=017576662512468239146:omuauf_lfve", 
    followlocation: true, 
    params: {q: keyword, key: my_key} 
) 
res = req.run 

有一個關於Typhoeus' GitHub page更多的例子。

+1

哦哇。 Typhoeus是驚人的。謝謝你讓我知道那些額外的位。我會確保我閱讀更多 – Bula

相關問題