Я хотел бы создать коммит, используя API остальных битбакетов.До настоящего времени все ответы на вопросы о Response 415
были решены путем установки Content-Type
в заголовке на application/json;charset-UTF8
.Однако это не решает ответ, который я получаю.
Итак, вот что я пытаюсь сделать:
import requests
def commit_file(s, path, content, commit_message, branch, source_commit_id):
data = dict(content=content, message=commit_message, branch=branch, sourceCommitId=source_commit_id)
r = s.put(path, data=data, headers={'Content-type': 'application/json;charset=utf-8'})
return r.status_code
s = requests.Session()
s.auth = ('name', 'token')
url = 'https://example.com/api/1.0/projects/Project/repos/repo/browse/file.txt'
file = s.get(url)
r = commit_file(s, url, file.json() , 'Commit Message', 'test', '51e0f6faf64')
Запросы GET
успешно возвращают файл, и я хотел бызафиксируйте его содержимое в ветке test
, которая существует.
Независимо от Content-Type
, status_code
ответа будет 415
.
Вот заголовокзапрос на размещение:
OrderedDict([('user-agent', ('User-Agent', 'python-requests/2.21.0')), ('accept-encoding', ('Accept-Encoding', 'gzip, deflate')), ('accept', ('Accept', '*/*')), ('connection', ('Connection', 'keep-alive')), ('content-type', ('Content-type', 'application/json;charset=utf-8')), ('content-length', ('Content-Length', '121')), ('authorization', ('Authorization', 'Basic YnVybWF4MDA6Tnp...NkJqWGp1a2JjQ3dNZzhHeGI='))])
Этот объясняет использование curl и когда файл доступен локально.Как будет выглядеть правильный запрос в python, когда содержимое файла извлекается, как показано выше?
Это решение с использованием MultipartEncoder
:
import requests
import requests_toolbelt.multipart.encoder
def commit_file(s, path, content, commit_message, branch, source_commit_id):
data = requests_toolbelt.MultipartEncoder(
fields={
'content': content,
'message': commit_message,
'branch': branch,
'sourceCommitId': source_commit_id
}
)
r = s.put(path, data=data, headers={'Content-type': data.content_type})