Как исправить ошибку «415 Unsupported Media Type» в Python, используя запросы - PullRequest
0 голосов
/ 27 марта 2019

Я хотел бы создать коммит, используя 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})

1 Ответ

1 голос
/ 27 марта 2019

Тип содержимого application/json;charset=utf-8 неверен.

Согласно документации, вы должны отправить данные из нескольких частей. Вы не можете использовать JSON.

Этот ресурс принимает данные составной формы PUT, содержащие файл в поле формы с именем content.

См .: Как отправить «multipart / form-data» с запросами в python?

...