ruby-on-rails - 错误的 uri 谷歌从 Heroku 服务器放置的位置

标签 ruby-on-rails ruby-on-rails-3 heroku google-places-api

我有一个 Google Places API key ,并且能够从我的本地主机成功查询 Google Places API。

我使用的是 Rails 3.1,当我将网站推送到 Heroku 时,我收到了一个错误的请求。我指的是 http google place API 而不是 javascript API - 尽管我怀疑无论哪种方式问题都是相同的(请参阅下面我从 Google 收到的消息)

以下是我的帐户在 Google Console 中的配置方式:

Key for browser apps (with referers)
API key:    
XXXXXX
Referers:   
Any referer allowed
Activated on:   Mar 5, 2013 9:41 PM
Activated by:    <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="205858605354414e464f52440e454455" rel="noreferrer noopener nofollow">[email protected]</a> –

我在本地主机上时没有问题。

但是,当我推送应用程序,然后向 Google 地方信息进行查询时,我得到的结果是:

bad URI(is not URI?): https://maps.googleapis.com/maps/api/place/textsearch/json?query=blamp&key=XXXXX&sensor=false&types=restaurant|food|bar|cafe

编辑: 我已经查明错误是由于我使用了“|”栏造成的最后分隔谷歌类型。然而,当我将查询复制/粘贴到浏览器 header 时,以及当我在本地主机上进行开发时,这都有效。任何想法:

1)为什么会发生这种情况。 2)如何解决?

以下是我如何使用 Ruby 代码访问 API:

query = URI.escape(params[:search])
        url_params = "json?query="+ query + "&key="+ GOOGLE_API_KEY + "&sensor="+ false.to_s + "&types="+GOOGLE_TYPES.join("|")
        url_params << "&pagetoken="+params[:next_token] if params[:next_token]
        url = URI.parse("https://maps.googleapis.com/maps/api/place/textsearch/"+url_params)


        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
        request = Net::HTTP::Get.new(url.request_uri)

        result = http.request(request)
        JSON.parse(result.body)

关于 GOOGLE_TYPES 的注释:这是一个全局常量,实际上是一个数组;我用“|”加入它然后将其传递给 URL。

问题是,当我对字符串进行 URI.encode 时,查询不会为“steak house san francisco”等简单请求返回任何结果,而在 URI.encode 之前它会返回任何结果。如果查询不能像在本地主机上那样返回正确的结果,那么查询就会变得毫无用处。

最佳答案

也许您应该对您的 URL 进行编码。始终使用请求和参数对 url 进行编码是一种很好的做法。这可能会有所帮助:URI::InvalidURIError (bad URI(is not URI?): ):

编辑: 网址字符“|”可能不安全,因此需要对此类查询进行 url 编码。

试试这个:

def search_google_places
  api_key = 'xxx'
  base_url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?key=' + api_key
  tail_url = '&query=garena&sensor=false&types=restaurant|food|bar|cafe'
  main_url = base_url + api_key + tail_url
  url = URI.parse(URI.encode(main_url))
  response = Net::HTTP.start(url.host, use_ssl: true, verify_mode: 
OpenSSL::SSL::VERIFY_NONE) do |http|
     http.get url.request_uri
  end

  case response
     when Net::HTTPRedirection
        # repeat the request using response['Location']
     when Net::HTTPSuccess
        outputData = JSON.parse response.body
     else
        # response code isn't a 200; raise an exception
        pp response.error!
     end
     return outputData
end

关于ruby-on-rails - 错误的 uri 谷歌从 Heroku 服务器放置的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15827733/

相关文章:

mysql - 在 Rails 中屏蔽图像的真实 URL

ruby-on-rails - rails : Query all but first record?

ruby-on-rails - rails : adding vendor/cache to SCM?

heroku - 了解 Heroku 服务器状态 143

ruby-on-rails - Ruby/Rails-我可以将联接表的作用域(或类方法)用作WHERE子句的一部分吗?

ruby-on-rails - 按类别创建 Rails 下拉搜索

ruby-on-rails - rails console - 运行一段代码

ruby-on-rails - 如何在 Rails 3 中创建动态根?

python - 在 Heroku 上使用 Python selenium 运行 ChromeDriver

heroku - 在 Windows 7 上安装 Heroku Toolbelt