Невозможно правильно загрузить вложение в API Azure DevOps (результат 0 КБ) - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь загрузить вложения в рабочие элементы в 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 КБ.

На данный момент у меня почти нет идей, поэтому, если кто-нибудь знает, где я могу пойти не так, это будет высоко оценено!

1 Ответ

0 голосов
/ 29 ноября 2018

Ответ на это не был очевиден.Это был второй вызов, чтобы связать вложение с рабочим элементом, в котором была ошибка.Если комментарий не указан, он неправильно связывается.т. е. этот код:

json=[
    {
        "op": "add",
        "path": "/relations/-",
        "value": {
            "rel": "AttachedFile",
            "url": attachment_url
        },
    }
]

Должно было быть:

json=[
    {
        "op": "add",
        "path": "/relations/-",
        "value": {
            "rel": "AttachedFile",
            "url": attachment_url,
            "attributes": {
                "comment": ""
            }
        },
    }
]

Это не задокументировано, и не ожидается, что вы получите загрузку вложения размером 0 КБ, если вы этого не сделаетеукажите комментарий на этапе связывания.Никакие другие типы ссылок не нуждаются в комментариях.Я собираюсь поднять эту проблему с сопровождающими документации.

...