Понимание и взаимодействие с API с использованием Python - PullRequest
0 голосов
/ 27 марта 2020

В качестве локального сервера установлен API-интерфейс basi c, который выполняет такие функции, как добавление камеры, звездная камера, список камер, снимок кадра камеры и т. Д. c.

Моя проблема после следуя документации, я все еще не могу хорошо с ней взаимодействовать и получить ответ, который мне нужен. Вот код, который я использую для входа в систему и получения токена проверки:

import requests
import urllib.request
import json


base_url = "http://localhostip:8080/api/user/login?"
parameters = {
    "username": username,
    "password": password
}
auth_tok = requests.post(base_url + urllib.parse.urlencode(parameters)).json()
print(auth_tok)

Я получаю правильный документированный ответ с токеном, поэтому, следуя документации для добавления камеры, мне нужно 2 параметра, URL и Name, поэтому я сделал:

base_url = "http://localhostip:8080/api/camera/add?"

parameters = {

    "url": 'rtsp://192.168.1.23/1', 

    #or video file 
    "url" : '/home/video/sample.mov'

    "name" : 'cam1'

}
r = requests.post(base_url + urllib.parse.urlencode(parameters),headers={'Authorization': auth_tok})

когда я напечатал ответ:

-print (r)
-print (r.url)
-print(r.status_code)
-print(r.json())

Я получил это:

<Response [500]>

http://192.168.0.162:8080/service/api/camera/add?url=rtsp%3A%2F%2Frtsp%3A%2F%2F192.168.1.23&name=cam1

500

{'code': -111, 'message': None}

Согласно документации правильный URL должно быть так:

http://192.168.0.6:8080/service/api/camera/add?url=rtsp://192.168.1.23&name=cam1

и ответ должен быть:

Response: {"status":"ok"}

Так почему и как сделать URL POST в правильном формате, потому что Я подозреваю, что это проблема, URL содержит эти символы кодирования, которые могут испортить запрос?

Когда я использую веб-браузер GUI этого API, я могу добавить камеру или даже видеофайл в играть, но я пытаюсь сделать то же самое с Python, чтобы я мог продолжить обработку в будущем.

1 Ответ

0 голосов
/ 27 марта 2020

Ваша проблема в том, что вы кодируете символ '/ /', поэтому, чтобы исправить это, вам нужно использовать другую функцию из urllib, urllib.parse.unquote (), и использовать в качестве параметра функцию кодирования urllib. parse.urlencode (параметры):

import urllib

parameters = {
    "url": 'rtsp://192.168.1.23/1',
    "name" : 'cam1'
}

Результаты:

print(urllib.parse.urlencode(parameters))
'url=rtsp%3A%2F%2F192.168.1.23%2F1&name=cam1'

print(urllib.parse.unquote(urllib.parse.urlencode(parameters)))
'url=rtsp://192.168.1.23/1&name=cam1'

Источник https://docs.python.org/3.0/library/urllib.parse.html#urllib .parse.unquote

...