2014-03-29 76 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

相关问题