VCloud Director Организация аутентификации пользователя для RestAPI в python

У меня есть настройка VMware для тестирования. Я создаю одного пользователя abc/abc123 для доступа к URL-адресу организации "http://localhost/cloud/org/MyOrg". Я хочу получить доступ к RestAPI VCloud. Я попробовал с плагином RestClient в Firefox. Работает нормально.

Теперь я попробовал с кодом Python.

url = 'https://localhost/api/sessions/'
req = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % ('abc@MyOrg', 'abc123'))[:-1]
authheader =  "Basic %s" % base64string
req.add_header("Authorization", authheader)
req.add_header("Accept", 'application/*+xml;version=1.5')

f = urllib2.urlopen(req)
data = f.read()
print(data)

Это код, который я получаю из stackru. Но для моего примера это дает "urllib2.HTTPError: Ошибка HTTP 403: запрещено".

Я также попробовал HTTP-аутентификацию для того же самого.

1 ответ

Решение

После некоторого поиска в Google я нашел решение из поста /questions/4830411/vyipolnenie-post-vyizova-vmesto-get-s-ispolzovaniem-urllib2/4830426#4830426. Я изменяю код для удобства использования. Я публикую ответ, потому что если у кого-то будет такая же ошибка, он получит ответ напрямую.

Мой код изменения:

import urllib2
import base64

# make a string with the request type in it:
method = "POST"
# create a handler. you can specify different handlers here (file uploads etc)
# but we go for the default
handler = urllib2.HTTPSHandler()
# create an openerdirector instance
opener = urllib2.build_opener(handler)
# build a request
url = 'https://localhost/api/sessions'
request = urllib2.Request(url)
# add any other information you want
base64string = base64.encodestring('%s:%s' % ('abc@MyOrg', 'abc123'))[:-1]
authheader =  "Basic %s" % base64string
request.add_header("Authorization", authheader)
request.add_header("Accept",'application/*+xml;version=1.5')

# overload the get method function with a small anonymous function...
request.get_method = lambda: method
# try it; don't forget to catch the result
try:
    connection = opener.open(request)
except urllib2.HTTPError,e:
    connection = e

# check. Substitute with appropriate HTTP code.
if connection.code == 200:
    data = connection.read()
    print "Data :", data
else:
    print "ERRROR", connection.code

Надеюсь, что это поможет кому-то, кто хочет отправить запрос POST без данных.

Другие вопросы по тегам