Я пытаюсь загрузить вложения в рабочие элементы в DevOps Azure, используя REST API.Однако, хотя я могу загрузить вложение и прикрепить его к рабочему элементу, вложение всегда имеет размер 0 КБ как в пользовательском интерфейсе, так и при его загрузке.
API выглядит довольно просто, и у меня не было проблем с дюжиной других API, которые я использовал.Я просто не могу понять, где это идет не так.Вот код, который я использую для этого:
import os
import sys
import requests
_credentials = ("user@example.com", "password")
def post_file(url, file_path, file_name):
file_size = os.path.getsize(file_path)
headers = {
"Accept": "application/json",
"Content-Size": str(file_size),
"Content-Type": "application/octet-stream",
}
request = requests.Request('POST', url, headers=headers, auth=_credentials)
prepped = request.prepare()
with open(file_path, 'rb') as file_handle:
prepped.body = file_handle.read(file_size)
return requests.Session().send(prepped)
def add_attachment(path_to_attachment, ticket_identifier):
filename = os.path.basename(path_to_attachment)
response = post_file(
f"https://[instance].visualstudio.com/[project]/_apis/wit/attachments?uploadType=Simple&fileName={filename}&api-version=1.0",
path_to_attachment,
filename
)
data = response.json()
attachment_url = data["url"]
patch_result = requests.patch(
f"https://[instance].visualstudio.com/[project]/_apis/wit/workitems/{ticket_identifier}?api-version=4.1",
auth=_credentials,
headers={
"Accept": "application/json",
"Content-Type": "application/json-patch+json",
},
json=[
{
"op": "add",
"path": "/relations/-",
"value": {
"rel": "AttachedFile",
"url": attachment_url
},
}
]
)
print(patch_result)
print(patch_result.text)
add_attachment(sys.argv[1], sys.argv[2])
Я пытался установить / удалить / изменить каждое возможное значение заголовка, о котором я могу думать.Я попытался использовать атрибут files
, который используется в методе post
в requests
(но отбросил его, потому что он установил Content-Disposition, но все примеры, которые я видел, не используют это), я пыталсяУстанавливая параметр path path, я перепробовал все, что мог придумать, но ничего не изменило.
Я даже использовал Fiddler, чтобы посмотреть, как это делает настоящий сайт, затем скопировал заголовки в новый запрос на Python и отправил его, и я все еще вижу результат 0 КБ.
На данный момент у меня почти нет идей, поэтому, если кто-нибудь знает, где я могу пойти не так, это будет высоко оценено!