Использование REST API в Python для запуска рабочих процессов в Azure Purview

Мы пытаемся использовать REST API Purview для выполнения запроса пользователя, который сможет инициировать запуск рабочего процесса Purview. Рабочий процесс должен запускаться всякий раз, когда пользователь пытается обновить актив, например его описание.

Согласно документации REST API, мы используем следующий код:

import requests

url = f"https://XXXXX.purview.azure.com/workflow/userrequests?api-version=2023-10-01-preview"

headers = {
    "Authorization": f"Bearer {token}",   # each time generated
    "Content-Type": "application/json"
}

body = {
    "operations": [
        {
            "type": "UpdateAsset",
            "payload": {
                "entities": {
                    "typeName": "azure_sql_table",
                    "attributes": {
                        "guid": "f00553c6-7a45-479f-b2fe-f9f6f6f60000",
                        "userDescription": "New description from ADB via workflow API",
                        "qualifiedName": "mssql://XXXXX.database.windows.net/XXXXX/dbo/YYYYY",
                        "name": "YYYYY",
                        "description": "Description field from ADB via workflow API"
                    }
                }
            }
        }
    ],
    "comment": "Thanks!"
}

response = requests.post(url, headers=headers, json=body)
response.json()

Ответ, который мы получаем:

{'error': {'requestId': '3ea14555-aa4c-48e7-b1b6-1d683f39515b',
  'code': 'Workflow.DataCatalogError.InvalidJsonRequestPayload',
  'message': "Invalid Json request payload: '.entities(missing)'"}}

Мы не понимаем, чего не хватает внутри «сущностей». Есть похожая проблема здесь.
Что мы делаем не так?

Что произойдет, если вы переключите его с сущностей на просто «сущность»?

EJZ 03.07.2024 22:05

@EJZ Я тоже пробовал это, но безуспешно.

Ric S 04.07.2024 09:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
179
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Не могли бы вы попробовать с этим телом?

body = {
   "operations":[
      {
         "type":"UpdateAsset",
         "payload":{
            "entities":{
               "UPDATE":[
                  {
                     "typeName":"azure_sql_table",
                     "attributes":{
                        "guid":"f00553c6-7a45-479f-b2fe-f9f6f6f60000",
                        "userDescription":"New description from ADB via workflow API",
                        "qualifiedName":"mssql://XXXXX.database.windows.net/XXXXX/dbo/YYYYY",
                        "name":"YYYYY",
                        "description":"Description field from ADB via workflow API"
                     }
                  }
               ]
            }
         }
      }
   ],
   "comment":"Thanks!"
}

Привет, спасибо за ваш ответ. К сожалению, я уже пробовал этот вариант, но получил тот же результат.

Ric S 28.06.2024 17:54

На github вы можете ответить на тот же вопрос (думаю, вы тоже там создали): github.com/Azure/azure-sdk-for-python/issues/36234

André de Mattos Ferraz 28.06.2024 19:02

Да, это был я, я также пытался использовать Azure SDK для Python, но получил ту же ошибку.

Ric S 01.07.2024 08:50

Документация немного сложна, но я в первую очередь имею в виду массовое создание или обновление документации, которая определяет тип данных для «сущностей» как массив. Не могли бы вы меня развеселить и попробовать:

body = {
    "operations": [
        {
            "type": "UpdateAsset",
            "payload": {
                "entities": [
                        {
                        "typeName": "azure_sql_table",
                        "attributes": {
                            "guid": "f00553c6-7a45-479f-b2fe-f9f6f6f60000",
                            "userDescription": "New description from ADB via workflow API",
                            "qualifiedName": "mssql://XXXXX.database.windows.net/XXXXX/dbo/YYYYY",
                            "name": "YYYYY",
                            "description": "Description field from ADB via workflow API"
                            }
                        }
                    ]
            }
        }
    ],
    "comment": "Thanks!"
}

Я пытался найти ссылку на ожидаемый тип данных сущностей в документации API UserRequests , но их сведения распространяются только на массив операций. Я полагаю, что для конкретных типов операций документация по этим конкретным операциям будет более полезной. Поэтому я думаю, что первая ссылка выше на документацию по массовому обновлению, где объекты определяются как массив, должна быть полезной.

Привет, Джей, я тоже пытался использовать эту ссылку на API, пролистал многие из них. Однако, похоже, не стоит ожидать квадратных скобок, так как я получаю ошибку {'error': {'code': 'Workflow.DecodingFailure', 'message': "Invalid value for: body (UpdateAsset).payload.entities(expected '{' got '[' at 'operations[0]')"}}

Ric S 02.07.2024 09:07
Ответ принят как подходящий

После короткого разговора со службой поддержки Microsoft Purview нам удалось найти решение: необходимо иметь вторую запись entities внутри первой записи entities, и эта вторая запись должна быть списком диктовок.

import requests

url = f"https://XXXXX.purview.azure.com/workflow/userrequests?api-version=2023-10-01-preview"

headers = {
    "Authorization": f"Bearer {token}",   # each time generated
    "Content-Type": "application/json"
}

body = {
    "operations": [
        {
            "type": "UpdateAsset",
            "payload": {
                "entities": {
                    "entities": [
                        {
                            "guid": "f00553c6-7a45-479f-b2fe-f9f6f6f60000",
                            "typeName": "azure_sql_table",
                            "attributes": {
                                "userDescription": "New description from ADB via workflow API",
                                "qualifiedName": "mssql://XXXXX.database.windows.net/XXXXX/dbo/YYYYY",
                                "name": "YYYYY",
                                "description": "Description field from ADB via workflow API"
                            }
                        }
                    ]
                }
            }
        }
    ],
    "comment": "Thanks!"
}

response = requests.post(url, headers=headers, json=body)
response.json()

Другие вопросы по теме

Похожие вопросы

Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как оценить цвет изображения Pyplot в данной точке?
Возможно ли иметь встроенное определение класса данных в Python?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Почему мой столбец row_number в PySpark испорчен при применении схемы?
Сравнение текста сообщения с результатом функции gettext в обработчике сообщений Aiogram
Как обновить данные exif, не теряя заголовок JFIF?
Почему сбор LazyFrame перед объединением в Polars решает мою проблему с несоответствиями индексов?