2016-07-29 2 views
1

Je suis en mesure de traiter avec succès une requête de géocodage par lots (décrite ici geocodeAddresses-API ArcGIS REST: World Geocoding Service | ArcGIS for Developers) à l'aide d'une requête GET. Cependant, je sais que je vais vouloir utiliser la méthode POST comme décrit la documentation puisque mes lots peuvent être grands.Comment mettre en forme correctement les géocodesAddresses POST avec ArcGIS REST

Lorsque j'essaie de soumettre les données via le POST, j'obtiens un message d'erreur très inutile.

{'error': {'code': 400, 
    'details': [], 
    'message': 'Unable to complete operation.'}} 

La demande que je suis en train de faire ressemble à ceci (je l'ai essayé différentes itérations):

URL: http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/geocodeAddresses?sourceCountry=USA&token= & f = pjson

POST données (brutes)

{ 
    "addresses": { 
     "records": [ 
      { 
       "attributes": { 
        "OBJECTID": 1, 
        "Address": "380 New York St.", 
        "City": "Redlands", 
        "Region": "CA", 
        "Postal": "92373" 
       } 
      }, 
      { 
       "attributes": { 
        "OBJECTID": 2, 
        "Address": "1 World Way", 
        "City": "Los Angeles", 
        "Region": "CA", 
        "Postal": "90045" 
       } 
      } 
     ] 
    } 
} 

Où bien sûr TOKEN est remplacé par un jeton valide que j'ai testé avec succès via une requête GET. Variantes J'ai essayé d'avoir des "enregistrements" comme clé de niveau supérieur et d'inclure les paramètres GET tels que le jeton comme clés dans la charge POST.

Répondre

1

Il s'avère que ESRI veut que les données soient envoyées sous la forme x-www-form-urlencoded, par opposition à un simple objet JSON. Donc, pour utiliser correctement le point de terminaison, envoyez-le en tant que formdata avec la clé étant "addresses" et la valeur étant l'objet enregistrements JSON.

1

J'ai eu le même problème et que vous avez déjà dit:

Esri veut que les données soient envoyées sous forme de x-www-form-urlencoded, par opposition à juste un objet JSON. Donc, pour utiliser correctement le point de terminaison, envoyez-le en tant que formdata avec la clé étant "addresses" et la valeur étant l'objet enregistrements JSON.

Si vous recherchez une implémentation Java, vous pouvez envisager d'utiliser l'objet Form (javax.ws.rs.core.Form).

Je l'ai fait de cette façon:

// Build addresses form object 
Form addressesParam = new Form(); 
addressesParam.param("addresses", buildAddressesParam(addresses).toString()); 

// Try make request and parse it into JSON node 
JsonNode jsonResponse; 
try { 
    String response = webTarget.request(MediaType.APPLICATION_JSON).post(Entity.entity(addressesParam, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class); 
    jsonResponse = new ObjectMapper().readTree(response);   
} catch(IOException e) { 
    ... 
} 

Lorsque les adresses d'entrée est définie comme HashMap<String, String> addresses.