2 votes

bad uri google places depuis le serveur heroku

Je dispose d'une clé API Google Places et j'ai pu interroger avec succès l'API Google Places depuis mon hôte local.

Je suis sur Rails 3.1, et quand j'ai poussé mon site vers Heroku, j'obtiens une mauvaise requête. Je fais référence à l'API http de google places et NON à celle en javascript - bien que je pense que le problème serait le même dans les deux cas (voir le message que je reçois de Google ci-dessous).

Voici comment mon compte est configuré dans la 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:    xx@stanford.edu –

Il n'y avait aucun problème lorsque j'étais sur l'hôte local.

Cependant, lorsque je pousse l'application et que j'effectue une requête sur Google Places, voici ce que j'obtiens :

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

EDIT : J'ai trouvé que l'erreur était due à l'utilisation des barres '|' pour séparer les types de google à la fin. Cependant, cela fonctionne à la fois lorsque je copie/colle la requête dans l'en-tête de mon navigateur, et lorsque je le fais en développement sur localhost. Avez-vous des idées ?

1) Pourquoi cela se produit-il ? 2) Comment le réparer ?

Voici comment j'accède à l'API avec du code Ruby :

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)

Une remarque sur GOOGLE_TYPES : il s'agit d'une constante globale qui est en fait un tableau ; je la joins avec "|" puis la passe à l'URL.

Le problème est que lorsque j'encode la chaîne en URI, la requête ne renvoie aucun résultat pour des demandes simples comme "steak house san francisco", alors qu'avant l'encodage URI, elle le faisait. Il est évident que la requête devient inutile si elle ne peut pas renvoyer des résultats corrects comme elle le faisait sur localhost.

2voto

redDragonzz Points 656

Vous devriez peut-être coder votre URL. C'est une bonne pratique de toujours encoder les urls avec les requêtes et les paramètres. Cela peut être utile : URI::InvalidURIError (mauvaise URI(n'est pas une URI ?): ) :

EDIT : Le caractère url "|" n'est peut-être pas sûr, il faut donc coder ces requêtes en url.

Essayez ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X