request.Request для удаления ветки gitlab не работает, но работает с помощью curl DELETE - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь удалить ветку git из gitlab, используя API gitlab с маркером личного доступа .

Если я использую curl следующим образом:

curl --request DELETE --header "PRIVATE_TOKEN: somesecrettoken" "deleteurl"

тогда работает и ветка удаляется.

Но если я использую requests вот так:

token_data = {'private_token': "somesecrettoken"}
requests.Request("DELETE", url, data= token_data)

это не работает; ветка не удаляется.

1 Ответ

0 голосов
/ 14 сентября 2018

Код ваших запросов действительно не делает то же самое.Вы устанавливаете data=token_data, который помещает токен в тело запроса.В командной строке curl используется HTTP-заголовок , а тело остается пустым.

Сделайте то же самое в Python:

token_data = {'Private-Token': "somesecrettoken"}
requests.Request("DELETE", url, headers=token_data)

Вы также можете поставитьтокен в параметрах URL через аргумент params:

token_data = {'private_token': "somesecrettoken"}
requests.Request("DELETE", url, params=token_data)

Это добавляет ?private_token=somesecrettoken к URL-адресу, отправленному на gitlab.

Однако , GitLabпринимает значение private_token в теле запроса , а также , либо в виде данных формы, либо в виде JSON.Это означает, что вы используете API запросов неправильно.

* requests.Request() Экземпляр не будет отправлен без дополнительной работы.Обычно требуется только, если вы хотите получить доступ к подготовленным данным перед отправкой .

Если вам не нужно использовать эту более продвинутую функцию, используйте метод requests.delete():

response = requests.delete(url, headers=token_data)

Если вам нужно нужна функция, используйте requests.Session() объект , затем сначала подготовьте объект запроса, затем отправьте его:

with requests.Session() as session:
    request = requests.Request("DELETE", url, params=token_data)
    prepped = request.prepare()
    response = session.send(prepped)

Даже без использования подготовленных запросов сеанс очень полезен при использовании API.Вы можете установить токен один раз в сеансе:

with requests.Session() as session:
    session.headers['Private-Token'] = 'somesecrettoken'

    # now all requests via the session will use this header
    response = session.get(url1)
    response = session.post(url2, json=....)
    response = session.delete(url3)
    # etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...