Используете метод POST для пакетного геокодирования с API REST ArcGIS Server? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь запустить REST API моего сервера геокодирования:

[https://locator.stanford.edu/arcgis/rest/services/geocode/USA_StreetAddress/GeocodeServer] (ArcGIS Server 10.6.1)

... используя метод POST (который, кстати, мог бы использовать пример или два, кажется, что это ОЧЕНЬ короткая «заметка», КОГДА использовать POST, а не КАК: https://developers.arcgis.com/rest/geocode/api-reference/geocoding-geocode-addresses.htm#ESRI_SECTION1_351DE4FD98FE44958C8194EC5A7BEF7D).

Я пытаюсь использовать request.post () и думаю, что мне удалось получить токен и т. Д., Но я получаю ошибку 400.

Исходя из предыдущего опыта, это означает, что что-то в форматировании данных плохое, но я вырезал и вставил прямо с сайта поддержки Esri, этой тестовой пары.

# import the requests library
import requests

# Multiple address records
addresses={ 
 "records": [
 {
 "attributes": {
 "OBJECTID": 1,
 "Street": "380 New York St.",
 "City": "Redlands",
 "Region": "CA",
 "ZIP": "92373"
 }
 },
 {
 "attributes": {
 "OBJECTID": 2,
 "Street": "1 World Way",
 "City": "Los Angeles",
 "Region": "CA",
 "ZIP": "90045"
 }
 }
 ]
}

# Parameters
# Geocoder endpoint
URL = 'https://locator.stanford.edu/arcgis/rest/services/geocode/USA_StreetAddress/GeocodeServer/geocodeAddresses?'
# token from locator.stanford.edu/arcgis/tokens
mytoken = <GeneratedToken>
# output spatial reference id 
outsrid = 4326
# output format
format = 'pjson'
# params data to be sent to api 
params ={'outSR':outsrid,'f':format,'token':mytoken}

# Use POST to batch geocode
r = requests.post(url=URL, data=addresses, params=params)

print(r.json())
print(r.text)

Вот что я последовательно получаю:

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

1 Ответ

1 голос
/ 12 июня 2019

Мне пришлось поиграть с этим дольше, чем хотелось бы признать, но хитрость (я полагаю) заключается в том, чтобы использовать правильный заголовок запроса и , чтобы преобразовать необработанные адреса в строку JSON, используяjson.dumps().

import requests
import json

url = 'http://sampleserver6.arcgisonline.com/arcgis/rest/services/Locators/SanDiego/GeocodeServer/geocodeAddresses'
headers = { 'Content-Type': 'application/x-www-form-urlencoded' }
addresses = json.dumps({ 'records': [{ 'attributes': { 'OBJECTID': 1, 'SingleLine': '2920 Zoo Dr' }}] })

r = requests.post(url, headers = headers, data = { 'addresses': addresses, 'f':'json'})

print(r.text)
...