Я искал в Интернете (и stackoverflow: D), чтобы найти ответ на следующий вопрос - и не нашел ни одного, который я понял .
фон:Мы хотим использовать скрипт Python для соединения CMDB наших компаний с нашей инфраструктурой AWX / Ansible.CMDB имеет REST API , который поддерживает (на полпути) правильный экспорт.В настоящее время я застрял с реализацией правильного вызова API.Я могу вызвать сам API и выполнить аутентификацию, но не могу вызвать правильный фильтр, чтобы получить нужные мне результаты.фильтр реализуется с помощью следующей строки в URL-адресе (подробнее в примере с приложенным кодом)
Label LIKE "host*"
похоже, что у питона есть проблема с *.сообщение об ошибке:
InvalidURL(f"URL can't contain control characters. {url!r} "
Я обнаружил некоторые сообщения об ошибках, что есть проблема в некоторых версиях Python, но я новичок, чтобы правильно понять, если это влияет на меня здесь: D
используется Python версии 3.7.4
PS: давайте посмотрим, смогу ли я получить правильную разметку: D
Я переключил вызываемый URL, чтобы точно определить, где именно возникает проблема.это происходит только тогда, когда я использую SQL как часть фильтра.эта часть важна, так как я просто хочу, чтобы возвращались наши "хосты", а не вся CMDB.
#import the required classes and such
from http.client import HTTPConnection
import json
#create a HTTP connection client
client = HTTPConnection("cmdb.example.company")
#basic auth and some header details
headers = {'Content-Type': 'application/json',
'Authorization' : 'Basic my-auth-token'}
#working API call
client.request('GET', '/cmdb/rest/hosts?attributes=Label,Keywords,Tag,Description&limit=10', headers=headers)
#broken API call returns - InvalidURL(f"URL can't contain control characters. {url!r} "
client.request('GET', '/cmdb/rest/hosts?filter=Label LIKE "host*"&attributes=Label,Keywords,Tag,Description&limit=10', headers=headers)
#check and convert the response into a readable (JSON) format
response = client.getresponse()
data = response.read()
#debugging print - show that the returned data is bytes?!
print(data)
#convert the returned data into json
my_json = data.decode('utf8').replace("'", '"')
data = json.loads(my_json)
#only return the data part from the JSON and ignore the meta-overhead
text = json.dumps(data["data"], sort_keys=True, indent=4)
print(text)
Итак, я хочу знать, как правильно вызвать API с описанным фильтром и устранить отображаемую ошибку.Можете ли вы привести пример, который я могу попробовать или указать на ошибку новичка, которую я сделал?Я затронут упомянутой ошибкой python относительно вызова URL с * в нем?
спасибо за помощь:)