#python #python-requests #vmware-workstation
#python #python-запросы #vmware-workstation
Вопрос:
Проблема:
я пытаюсь инициировать команду включения для моей виртуальной машины. я могу сделать это в командной строке Windows, при этом curl передает проблемные данные с помощью
curl "http://127.0.0.1:8697/api/vms/vm_id/power" -X PUT --header "Content-Type: application/vnd.vmware.vmw.rest-v1 json" --header "Accept: application/vnd.vmware.vmw.rest-v1 json" --header "Authorization: Basic MyToken" -d on
{"power_state": "poweredOn}
я не очень хорошо понимаю концепцию заголовков и данных. все, что я знаю, это то, что мне нужно вставить операцию «on» в тело запроса post. я использую оперативную память на своем ПК для всех тех вкладок Chrome, которые остались открытыми. Кажется, я уперся в кирпичную стену. Любая помощь, запрошенная заранее.
Код:
import requests
import json
api_token = MyToken
desired_vm_id = vm_id
headers = {'Accept': 'application/vnd.vmware.vmw.rest-v1 json','Authorization': 'Basic {0}'.format(api_token)}
api_url_base = 'http://127.0.0.1:8697/api/vms/'
def get_vm_status():
api_url = '{0}{1}/power'.format(api_url_base, desired_vm_id)
response = requests.get(api_url, headers=headers)
if response.status_code == 200:
response = json.loads(response.content)
if (response['power_state']) == 'poweredOff':
response_for_put = requests.put(api_url, headers = headers, data = {'operation': 'on'})
result = json.loads(response_for_put.content)
print(result['Message'])
else:
print('VM already running:', response)
else:
return None
get_vm_status()
Результат:
Content type not supported
Документация:
из документации vmware workstation pro
Ответ №1:
Похоже, что вы устанавливаете Content-Type
заголовок в своей curl
команде, но не в своем коде на Python. Попробуйте изменить эту строку:
headers = {'Accept': 'application/vnd.vmware.vmw.rest-v1 json','Authorization': 'Basic {0}'.format(api_token)}
к этому:
headers = {'Content-Type': 'application/vnd.vmware.vmw.rest-v1 json', 'Accept': 'application/vnd.vmware.vmw.rest-v1 json','Authorization': 'Basic {0}'.format(api_token)}
Комментарии:
1. Спасибо, это действительно был корень проблемы, я не заметил, у меня отсутствовал один заголовок.
Ответ №2:
Вы можете попробовать это:
response = requests.put(api_url, headers=headers, data='on')
Затем вы можете напрямую прочитать ответ JSON:
response.json()
Комментарии:
1. Интересно. Я просматривал документацию, в то время как вы видели, что на самом деле было отправлено в
curl
запросе. Теперь я действительно в замешательстве, поскольку А) в документации обсуждается отправка JSON, Б)curl
команда сообщает, что отправляет JSON, но В)curl
команда отправляет необработанные данные. — ну, может быть, одно из двух изменений будет работать для OP.2. и еще спасибо, после исправления отсутствующего заголовка data = ‘on’ был принят формат данных.