Query Open MapQuest API avec Java HttpURLConnection ne donne aucun résultat


J'ai écrit ce code pour accéder à l'API MapQuest ouverte à partir d'un programme Java (APPKEY omis intentionnellement.. ):

public class OpenMapQuestAPITest {

  private final static String APPKEY="...";

  public static void main(String[] args) throws Exception {
    String address="Germany, Hannover, Am Hohen Ufer 3A";
    URL url=new URL("http://open.mapquestapi.com/nominatim/v1/search.php?key="+
        APPKEY+"&format=json&q="+address.replace(' ','+'));
    System.out.println("Query: "+url.toString());
    HttpURLConnection con=(HttpURLConnection)url.openConnection();
    int responseCode = con.getResponseCode();
    System.out.println("Response Code : " + responseCode);
    StringBuffer response = new StringBuffer();
    try (BufferedReader in=
         new BufferedReader(new InputStreamReader(con.getInputStream()))) {
      String inputLine;
      while ((inputLine = in.readLine()) != null)
        response.append(inputLine);
    }
    System.out.println("Response: "+response.toString());
  }

}

Je reçois ceci (clé laissée intentionnellement, saut de ligne ajouté):

Query: http://open.mapquestapi.com/nominatim/v1/search.php?↵
       key=...&format=json&q=Germany,+Hannover,+Am+Hohen+Ufer+3A
Response Code : 200
Response: []

Émettre exactement la même requête à partir de Chrome, par exemple, donne la réponse correcte:

[{"place_id":"1528890","licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright",
  "osm_type":"node","osm_id":"322834134",
  "boundingbox":["52.3729826","52.3729826","9.7304606","9.7304606"],
  "lat":"52.3729826","lon":"9.7304606",
  "display_name":"3a, Am Hohen Ufer, Mitte, Hannover, Region Hannover, Niedersachsen, 30159, Deutschland",
  "class":"place","type":"house","importance":0.511}]

Pourquoi MapQuest ne renvoie-t-il pas ces données lorsque je demande via Java? Y a-t-il un personnage qui s'échappe que je ne connais pas? Dois-je définir un agent utilisateur spécial? Suis-je l'interrogation de la connexion objecter dans le mauvais sens? Après tout, le service retourne OK (code d'état HTTP 200), il semble donc ne pas se sentir trop mal à propos de ma demande.

Pourquoi ne répond-il pas?

Author: VVN, 2016-03-02

1 answers

La plupart du temps, ces problèmes concernent l'encodage d'URL.

1. Essayez d'abord l'encodage d'URL.

String address="Germany, Hannover, Am Hohen Ufer 3A";
URL url=new URL("http://open.mapquestapi.com/nominatim/v1/search.php?key="+
    APPKEY+"&format=json&q="+address.replace(' ','+'));

Essayez:

URLEncoder.encode(address.replace(' ','+'), "UTF-8"));

2. Vous pouvez opter pour org.Apache.commun.httpclient.HttpClient api. Il a une classe PostMethod (org.Apache.commun.httpclient.méthode.PostMethod), avec lequel vous pouvez y ajouter des paramètres. (plutôt HttpUrlConnection) Comme

HttpClient hc = new HttpClient();
PostMethod pm =  new PostMethod(url);
// add parameters to it.
pm.addParameter("format","json");
hc.executeMethod(pm);
 1
Author: Gurpreet Singh, 2016-03-02 09:35:12