Измените аватар проекта с помощью Azure DevOps API 6.0-preview.1 и python

#python #azure #image #api #devops

Вопрос:

Я пытаюсь изменить Аватар/изображение проекта для проекта в Azure DevOps с помощью api. Для этого я использую скрипт на python. В документе api указано, что изображение должно быть отправлено в виде массива байтов. Но тип описывается как строковый массив. Поэтому для меня это звучит так, как будто массив байтов должен быть преобразован в строку, а затем отправлен в json.

В python это выглядит так:

 url = f'https://dev.azure.com/{organization}/_apis/projects/{project_id}/avatar?api-version=6.0-preview.1 '
with open(project_picture_path, "rb") as image:
    image_array = []
    while byte := image.read(1):
        image_array.append(byte)
    image_array = str(image_array)
json1 = json.dumps({"image": image_array})
headers = {'Content-type': 'application/json'}
r = requests.put(url, data=json1, auth=auth, headers=headers)
print(r.status_code)
 

Когда я отправляю этот запрос put на сервер, он просто отвечает 204-м http-кодом, что само по себе странно, потому что в документе указано, что он должен отвечать 200.

Когда я перехожу на страницу проекта в DevOps, изображение действительно изменилось, но не на указанное мной изображение. Вместо этого от значения по умолчанию к тому, что кажется изображением-заполнителем. Вы можете посмотреть сравнение здесь

Я понятия не имею, что здесь пошло не так. Кто-нибудь еще пытался это сделать?

Ответ №1:

После долгих испытаний я нашел решение.

api хочет получить байты в виде значений int, поэтому мы должны преобразовать их в int следующим образом:

 with open(project_picture_path, "rb") as image:
    image_array = []
    while byte := image.read(1):
        image_array.append(int.from_bytes(byte, 'big'))
json1 = json.dumps({"image": image_array})
headers = {'Content-type': 'application/json'}
r = requests.put(url, data=json1, auth=auth, headers=headers)
print(r.status_code)
 

Таким образом, api по-прежнему выдает код ответа 204, но картинка меняется правильно. Это определенно должно быть изменено в документах.