как правильно вызвать REST-API с * в URL - PullRequest
1 голос
/ 24 сентября 2019

Я искал в Интернете (и 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 с * в нем?

спасибо за помощь:)

1 Ответ

0 голосов
/ 27 сентября 2019

оооочень я сам нашел ошибку для начинающих:Я использовал URL из моего браузера - и мой браузер автоматически кодирует специальные символы в URL.я нашел следующий фрагмент кода в Python3 URL-кодировке guide и изменил строку в соответствии со своими потребностями :)

import urllib.parse
query = ' "host*"'
urllib.parse.quote(query)
'%20%22host%2A%22'

Результат: '% 20% 22host% 2A% 22'% 20 = ""% 22 = "" "% 2A = "*"итоговый код выглядит примерно так:

#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)

filter = Метка LIKE "host *"

#fixed API call
client.request('GET', '/cmdb/rest/hosts?filter=Label%20LIKE%20%22host%2A%22&attributes=Label,Keywords,Tag,Description&limit=10', headers=headers)

filter = Label% 20LIKE% 20% 22host% 2A% 22 * ​​1015 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...