Я выяснил, как делать GET, PUT, DELETE и основной POST, используя pycurl.
Тем не менее, я не могу понять, что эквивалентно этой командной строке curl (которая прекрасно работает) для python:
curl -u admin:geoserver -XPOST -H 'Content-type: application/vnd.ogc.sld+xml'
-d @/Users/rburhum/src/calthorpe/calthorpe/server/calthorpe/media/styles/1_my-scenario
"http://127.0.0.1:8080/geoserver/rest/styles?name=1_my-scenario" -v
Я видел образцы в репо . Тем не менее, передача одного параметра (в данном случае name ) и загружаемого файла, похоже, не работает.
Для вызовов PUT я успешно использовал:
filesize = path.getsize(sldFile)
f = open(sldFile,'rb')
c = pycurl.Curl()
c.setopt(pycurl.HTTPHEADER, ["Content-type: application/vnd.ogc.sld+xml"])
c.setopt(pycurl.USERPWD, GEOSERVER_USER + ':' + GEOSERVER_PASSWORD)
c.setopt(pycurl.INFILESIZE, filesize)
c.setopt(c.URL, str(GEOSERVER_URL + '/rest/styles/' + path.basename(sldFile)))
c.setopt(pycurl.PUT, 1)
c.setopt(pycurl.INFILE, f)
c.perform()
f.close()
Таким образом, я наивно думал, что эквивалент POST будет:
filesize = path.getsize(sldFile)
f = open(sldFile,'rb')
c = pycurl.Curl()
c.setopt(c.URL, str(GEOSERVER_URL + '/rest/styles?name=' + path.basename(sldFile)))
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPHEADER, ["Content-type: application/vnd.ogc.sld+xml"])
c.setopt(pycurl.USERPWD, GEOSERVER_USER + ':' + GEOSERVER_PASSWORD)
c.setopt(pycurl.INFILESIZE, filesize)
c.setopt(pycurl.INFILE, f)
c.perform()
f.close()
Подробный вывод команды curl отображает это:
(calthorpe_env) rburhum@peru.local ~ / src / calthorpe / calthorpe / server / calthorpe
$ calthorpe / server / calthorpe POST -H 'Тип содержимого: application / vnd.ogc.sld + xml'
-d @ / Users / rburhum / SRC / Calthorpe / Calthorpe / сервер / Calthorpe / СМИ / стили / 1_my-сценарий
"http://127.0.0.1:8080/geoserver/rest/styles?name=1_my-scenario" -v
* О подключении () к порту 12780.0.1 8080 (# 0)
* Попытка 127.0.0.1 ... подключена
* Подключен к 127.0.0.1 (127.0.0.1) порту 8080 (# 0)
* Аутентификация сервера с использованием Basic с пользователем 'admin'
POST / геосервер / rest / styles? Name = 1_my-сценарий HTTP / 1.1
Авторизация: Базовая YWRtaW46Z2Vvc2VydmVy
Пользователь-агент: curl / 7.21.4 (universal-apple-darwin11.0) libcurl / 7.21.4
OpenSSL / 0.9.8r zlib / 1.2.5
Host: 127.0.0.1:8080
Принимаем: /
Тип содержимого: application / vnd.ogc.sld + xml
Длина контента: 28135
Ожидайте: 100-продолжить
>
http://127.0.0.1:8080/geoserver/rest/styles/1_my-scenario
<Сервер: Noelios-Restlet-Engine / 1.0..8
<Transfer-Encoding: chunked
<
* Соединение № 0 с хостом 127.0.0.1 осталось без изменений
* Закрытие соединения # 0 </p>
Я ясно вижу, что длина содержимого правильная.
Напротив, когда я делаю подробный вывод моего кода POST выше, я вижу, что длина содержимого равна -1 (и, следовательно, файл не передается, и сервер возвращает 500). Я посмеялся над переменной HTTPPOST, которая при определенных сочетаниях делает длину содержимого правильной, но я все еще не могу получить точный эквивалент команды CURL, приведенной выше.