Создать путь в ADLS Gen2 не удается из-за отсутствия типа x-ms-blob?
Я создал учетную запись хранения Azure с помощью Azure Data Lake Storage 2-го поколения. Я хочу загрузить файл с помощью REST API. Хотя использование авторизации с общими ключами работает нормально, у меня возникают проблемы с использованием учетной записи SAS.
Для создания пути я использую операцию Path - Create.
# provide Azure Data Lake Storage Gen2 URL as environment variable
$ ADLS_URL="https://xxxxx.blob.core.windows.net/files"
# provide account SAS as environment variable
$ SAS="sv=2017-07-29&ss=bf&..."
# Create a new path in ADLS Gen2
$ curl -vX PUT -H "Content-Length: 112" "$ADLS_URL/example.txt?resource=file&$SAS"
Запрос возвращается с 400 An HTTP header that's mandatory for this request is not specified.
и следующее сообщение об ошибке.
<Error>
<Code>MissingRequiredHeader</Code>
<Message>An HTTP header that's mandatory for this request is not specified. RequestId:870e754b-... Time:2020-07-07T...</Message>
<HeaderName>x-ms-blob-type</HeaderName>
</Error>
Оказалось, что отсутствующий заголовок необходим для создания большого двоичного объекта в хранилище BLOB-объектов. Поскольку ADLS Gen2 поддерживает оба API и оба обеспечивают аналогичную операцию, он делегирует запрос неправильному.
Есть ли способ создать путь с помощью операции PUT с SAS в ADLS Gen2 API?
1 ответ
Да, вы можете создать путь (файл в этом примере), используя операцию PUT с SAS в ADLS Gen2 API. Но вам нужно сделать 3 шага: создать пустой файл / добавить данные в пустой файл / сбросить данные.
Шаг 1: после генерации токена sas вам необходимо вызвать Path - Create, чтобы создать файл в ADLS Gen2. Примечание: файл здесь должен быть пустым, это означает, что в заголовке запросаContent-Length
должно быть 0
.
URL-адрес запроса выглядит так:
Здесь я протестировал его с помощью почтальона, он работает без проблем. Пустой файл можно создать в ADLS Gen2 на портале Azure:
Шаг 2 и Шаг 3:
тогда вы должны вызвать Path - Update для добавления данных.
наконец, снова вызовите Path - Update для сброса данных.
Если вы не знаете, как использовать Path - Update для этой операции, воспользуйтесь скриптом, чтобы просмотреть подробную информацию о запросе, или просто дайте мне знать:). Вот скриншот запроса, захваченного Fiddler:
Кстати, я предлагаю вам напрямую использовать API Put Blob с токеном sas (но вам нужно указатьx-ms-blob-type
в заголовке запроса), что представляет собой всего лишь один шаг как для создания файла, так и для загрузки содержимого.