Отправка необработанных данных с помощью Python

Я экспериментирую с Google Checkout API, и я хочу вставить его в приложение Django. Мне нужно отправить данные в Google с использованием базовой HTTP-аутентификации. Я тестировал это с помощью curl вот так:

curl -d "$(cat mytest.xml)" -u username:password https://url

И это отправляет содержимое моего тестового XML-файла в Google. И работает нормально!

Но у меня проблемы с переносом этой простой строки на Python. Я использовал несколько разных способов (httplib2, urllib2, pycurl) подключения с паролем и публикации чего-то, но ответ всегда был 400 ПЛОХОЙ ЗАПРОС.

Существует ли эквивалент Python для отправки блока текста на сервер аутентификации HTTP Basic? Я выбегаю из стен, чтобы биться головой.


Приносим извинения за то, что не добавили код. Вот некоторые из моих лучших хитов. В каждом из них DATA представляет собой строку XML. URL-адреса , ИМЯ ПОЛЬЗОВАТЕЛЯ и ПАРОЛЬ являются постоянными.

req = urllib2.Request(URL)
req.add_header("Authorization", "Basic %s" % base64.encodestring('%s:%s'%(USERNAME, PASSWORD)))
u = urllib2.urlopen(req, DATA)

Выдает мне прекрасную Ошибка HTTP 400: неверный запрос


passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, URL, USERNAME, PASSWORD)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(URL, DATA)

Выдает Ошибка HTTP 401: Неавторизовано


pycurl.global_init(pycurl.GLOBAL_DEFAULT)
c = pycurl.Curl()
c.setopt(pycurl.URL, URL)
c.setopt(pycurl.USERPWD, "%s:%s" % (USERNAME,PASSWORD))
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPHEADER, ["Content-type: text/xml"])
c.setopt(pycurl.POSTFIELDS, DATA)
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()

Кажется, затрудняется передача строки DATA в качестве POSTFIELD. Я пробовал urllib.urlencode () записывать ДАННЫЕ разными способами, но


h = httplib2.Http()
h.add_credentials(USERNAME, PASSWORD)
print = h.request(URL, "POST", body=base64.encodestring(DATA))

Учетные данные, похоже, ничего не делают - я получаю несанкционированное сообщение от Google.

Есть еще кое-что, но все они основаны на них.

9
задан Oli 15 December 2011 в 12:59
поделиться