как передавать данные в запросах Python3 в VMware workstation api?

#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’ был принят формат данных.