【问题标题】:bad uri google places from heroku server来自heroku服务器的坏uri google地方
【发布时间】:2013-04-05 16:32:41
【问题描述】:

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

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

以下是我的帐户在 Google 控制台中的配置方式:

Key for browser apps (with referers)
API key:    
XXXXXX
Referers:   
Any referer allowed
Activated on:   Mar 5, 2013 9:41 PM
Activated by:    xx@stanford.edu –

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

但是,当我推送应用程序然后向 Google Places 进行查询时,我得到的是:

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

编辑: 我已经指出错误是因为我使用了条形“|”最后将谷歌类型分开。但是,当我将查询复制/粘贴到浏览器标题时,以及在本地主机上进行开发时,这都有效。任何想法:

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 之前它会返回。如果不能像在 localhost 上那样返回正确的结果,则该查询将变得毫无用处。

【问题讨论】:

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


    【解决方案1】:

    也许您应该对您的 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
    

    【讨论】:

    • 这实际上传递了符号,但是当我运行查询时,它显示在编码之前成功的查询没有结果。让我解释一下:在 localhost 中,我没有对字符串进行编码或剥离它。搜索查询返回了各种有效结果。现在,当我在编码后运行查询时,搜索结果为空。
    • 您能否提供更多关于您如何通过 ruby​​ 代码访问 api 的详细信息?也许这是一个与红宝石相关的问题。
    • 我更新了我的答案,你可能想使用URI.parse(URI.encode(xxxx))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2012-08-15
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多