我试图从gitlab删除一个git分支,使用gitlab API和personal access token。
如果我像这样使用curl:
curl --request DELETE --header "PRIVATE_TOKEN: somesecrettoken" "deleteurl"
然后它工作,分支被删除。
但如果我像这样使用requests
:
token_data = {'private_token': "somesecrettoken"}
requests.Request("DELETE", url, data= token_data)
它不起作用;分支未删除。
您的请求代码确实没有做同样的事情。您正在设置data=token_data
,它将令牌放入请求正文中。 curl
命令行使用HTTP标头代替,并将主体留空。
在Python中做同样的事情:
token_data = {'Private-Token': "somesecrettoken"}
requests.Request("DELETE", url, headers=token_data)
您还可以通过params
参数将令牌放入URL参数中:
token_data = {'private_token': "somesecrettoken"}
requests.Request("DELETE", url, params=token_data)
这会将?private_token=somesecrettoken
添加到发送到gitlab的URL中。
但是,GitLab也接受请求体中的private_token
值,无论是作为表单数据还是作为JSON。这意味着您使用的请求API错误。
没有额外的工作就不会发送requests.Request()
实例。它通常是only needed if you want to access the prepared data before sending。
如果您不需要使用此更高级的功能,请使用requests.delete()
方法:
response = requests.delete(url, headers=token_data)
如果确实需要该功能,请使用requests.Session()
object,然后首先准备请求对象,然后发送:
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.