#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, но картинка меняется правильно. Это определенно должно быть изменено в документах.