【问题标题】:Good request from browser but bad request from ruby?来自浏览器的良好请求但来自 ruby​​ 的错误请求?
【发布时间】:2014-03-29 14:44:29
【问题描述】:

我正在使用谷歌自定义搜索 api,我正在尝试通过一些 ruby​​ 代码访问它:

这是一个sn-p的代码

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 小时前工作。我只更改了它应该查找的关键字,但它开始返回错误。

有什么建议吗?我确信我有足够的积分来处理更多请求

【问题讨论】:

  • 您的关键字是否包含任何时髦的字符?像 ?#&amp;/.+ 等或任何 unicode 字符?
  • 我尝试了“sky line”然后“sky/line”来逃避空间。除了错误,似乎没有返回任何内容
  • 也许可以试试sky+linesky%20line。我认为您应该使用CGI::escape 以避免任何错误:ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/…
  • 是的。请把它放在答案中,以便我接受它
  • sky%20line 不起作用。我发现最有用的add sing

标签: ruby request google-api http-status-code-400 typhoeus


【解决方案1】:

您的获取参数keyword 中的特殊字符可能存在问题。如果您在浏览器中输入 URL,浏览器会对其进行调整。但是,对于 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

但是,既然您无论如何都在使用 Typhoeus,您应该可以使用它的 params 参数并让 Typhoeus 处理转义:

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 上还有更多示例。

【讨论】:

  • 哇哦。台风是惊人的。感谢您让我知道这些额外的信息。我会确保我阅读更多
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多