Использование API DICOMweb Standard с cURL

В этой статье показано, как работать со службой DICOMweb с помощью cURL и примеров .dcm файлов DICOM®.

Используйте следующие примеры файлов:

  • blue-circle.dcm
  • dicom-metadata.csv
  • green-square.dcm
  • red-triangle.dcm

Имя файла, studyUID, seriesUID и instanceUID примера файлов DICOM:

Файлы StudyUID SeriesUID InstanceUID
green-square.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 1.2.826.0.1.3680043.8.498.12714725698140337137334606354172323212
red-triangle.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395
blue-circle.dcm 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 1.2.826.0.1.3680043.8.498.77033797676425927098669402985243398207 1.2.826.0.1.3680043.8.498.13273713909719068980354078852867170114

Примечание.

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

Необходимые компоненты

Чтобы использовать API-интерфейсы DICOM standard, необходимо развернуть экземпляр службы DICOM. Дополнительные сведения см. в статье "Развертывание службы DICOM с помощью портал Azure".

После развертывания экземпляра службы DICOM получите URL-адрес службы приложений.

  1. Войдите на портал Azure.
  2. Выполните поиск последних ресурсов и выберите экземпляр службы DICOM.
  3. Скопируйте URL-адрес службы DICOM.
  4. Если вам нужен маркер доступа, см . сведения о получении маркера доступа для службы DICOM.

Для этого кода мы доступ к службе Общедоступной предварительной версии Azure. Важно, чтобы вы не загружали какие-либо частные сведения о работоспособности (PHI).

Работа со службой DICOM

DiCOMweb Standard использует http-запросы в сочетании multipart/related с определенными заголовками приема DICOM. Разработчики, знакомые с другими API на основе REST, часто находят работу с DICOMweb Standard неловко. Тем не менее, после того как вы получите его и работаете, это легко использовать. Это просто занимает немного знакомства, чтобы приступить к работе.

Команды cURL содержат по крайней мере одну, а иногда две переменные, которые должны быть заменены. Чтобы упростить выполнение команд, выполните поиск и замените указанные ниже переменные.

  • {URL-адрес службы} URL-адрес службы — это URL-адрес для доступа к службе DICOM, подготовленной в портал Azure, напримерhttps://<workspacename-dicomservicename>.dicom.azurehealthcareapis.com. Обязательно укажите версию в качестве части URL-адреса при выполнении запросов. Дополнительные сведения см. в документации по версиям API для службы DICOM.
  • {path-to-dicoms} — путь к каталогу, который содержит файл red-triangle.dcm, например C:/dicom-server/docs/dcms
    • Убедитесь, что в качестве разделителей используется косая черта вперед и заканчивается каталог без косой черты.

Отправка экземпляров DICOM (STOW)

Хранение экземпляров с помощью нескольких частей или связанных

Этот запрос намерен продемонстрировать, как отправлять ФАЙЛЫ DICOM с помощью нескольких частей или связанных.

Примечание.

Служба DICOM более удобна, чем стандарт DICOM. Однако в примере демонстрируется запрос POST, который соответствует стандарту.

Сведения:

  • Путь:.. /учёба
  • Метод: POST
  • Заголовки:
    • Принять: application/dicom+json
    • Тип контента: многопартийное или связанное; type="application/dicom"
    • Авторизация: носитель {значение токена}
  • Текст:
    • Content-Type: application/dicom для каждого отправленного файла, разделенного значением границы

Некоторые языки программирования и средства ведут себя по-разному. Например, некоторым требуется определить собственную границу. Для этих средств может потребоваться использовать немного измененный заголовок Content-Type. Следующие средства можно использовать успешно.

  • Тип контента: многопартийное или связанное; type="application/dicom"; boundary=ABCD1234
  • Тип контента: многопартийное или связанное; boundary=ABCD1234
  • Тип контента: многопартийное или связанное
curl --location --request POST "{Service URL}/v{version}/studies"
--header "Accept: application/dicom+json"
--header "Content-Type: multipart/related; type=\"application/dicom\""
--header "Authorization: Bearer {token value}"
--form "file1=@{path-to-dicoms}/red-triangle.dcm;type=application/dicom"
--trace-ascii "trace.txt"

Хранение экземпляров для конкретного исследования

В этом запросе показано, как отправлять ФАЙЛЫ DICOM с помощью нескольких частей или связанных с указанным исследованием.

Сведения:

  • Путь:.. /studies/{study}
  • Метод: POST
  • Заголовки:
    • Принять: application/dicom+json
    • Тип контента: многопартийное или связанное; type="application/dicom"
    • Авторизация: носитель {значение токена}
  • Текст:
    • Content-Type: application/dicom для каждого отправленного файла, разделенного значением границы

Некоторые языки программирования и средства ведут себя по-разному. Например, некоторым требуется определить собственную границу. Для этих языков и инструментов может потребоваться использовать немного измененный заголовок Content-Type. Следующие средства можно использовать успешно.

  • Тип контента: многопартийное или связанное; type="application/dicom"; boundary=ABCD1234
  • Тип контента: многопартийное или связанное; boundary=ABCD1234
  • Тип контента: многопартийное или связанное
curl --request POST "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"
--header "Accept: application/dicom+json"
--header "Content-Type: multipart/related; type=\"application/dicom\""
--header "Authorization: Bearer {token value}"
--form "file1=@{path-to-dicoms}/blue-circle.dcm;type=application/dicom"

Хранилище с одним экземпляром

Примечание.

Это нестандартный API, который позволяет отправлять один ФАЙЛ DICOM без необходимости настраивать POST для нескольких частей или связанных. Хотя cURL хорошо обрабатывает многопартийную или связанную с ним работу, этот API позволяет таким средствам, как Postman отправлять файлы в службу DICOM.

Для отправки одного ФАЙЛА DICOM требуется следующий метод.

Сведения:

  • Путь:.. /учёба
  • Метод: POST
  • Заголовки:
    • Принять: application/dicom+json
    • Content-Type: application/dicom
    • Авторизация: носитель {значение токена}
  • Текст:
    • Содержит один файл DICOM в виде двоичных байтов.
curl --location --request POST "{Service URL}/v{version}/studies"
--header "Accept: application/dicom+json"
--header "Content-Type: application/dicom"
--header "Authorization: Bearer {token value}"
--data-binary "@{path-to-dicoms}/green-square.dcm"

Экземпляры Upsert с помощью нескольких частей и связанных

Примечание.

Это не стандартный API, который позволяет выполнять upsert файлов DICOM с помощью нескольких частей или связанных.

Сведения:

  • Путь:.. /учёба
  • Метод: PUT
  • Заголовки:
    • Принять: application/dicom+json
    • Тип контента: многопартийное или связанное; type="application/dicom"
    • Авторизация: носитель {значение токена}
  • Текст:
    • Content-Type: application/dicom для каждого отправленного файла, разделенного значением границы

Некоторые языки программирования и средства ведут себя по-разному. Например, некоторым требуется определить собственную границу. Для этих средств может потребоваться использовать немного измененный заголовок Content-Type. Следующие средства можно использовать успешно.

  • Тип контента: многопартийное или связанное; type="application/dicom"; boundary=ABCD1234
  • Тип контента: многопартийное или связанное; boundary=ABCD1234
  • Тип контента: многопартийное или связанное
curl --location --request PUT "{Service URL}/v{version}/studies"
--header "Accept: application/dicom+json"
--header "Content-Type: multipart/related; type=\"application/dicom\""
--header "Authorization: Bearer {token value}"
--form "file1=@{path-to-dicoms}/red-triangle.dcm;type=application/dicom"
--trace-ascii "trace.txt"

Экземпляры Upsert для конкретного исследования

Примечание.

Это нестандартный API, который позволяет upsert файлов DICOM использовать многопартийное или связанное с назначенным исследованием.

Сведения:

  • Путь:.. /studies/{study}
  • Метод: PUT
  • Заголовки:
    • Принять: application/dicom+json
    • Тип контента: многопартийное или связанное; type="application/dicom"
    • Авторизация: носитель {значение токена}
  • Текст:
    • Content-Type: application/dicom для каждого отправленного файла, разделенного значением границы

Некоторые языки программирования и средства ведут себя по-разному. Например, некоторым требуется определить собственную границу. Для этих языков и инструментов может потребоваться использовать немного измененный заголовок Content-Type. Следующие средства можно использовать успешно.

  • Тип контента: многопартийное или связанное; type="application/dicom"; boundary=ABCD1234
  • Тип контента: многопартийное или связанное; boundary=ABCD1234
  • Тип контента: многопартийное или связанное
curl --request PUT "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"
--header "Accept: application/dicom+json"
--header "Content-Type: multipart/related; type=\"application/dicom\""
--header "Authorization: Bearer {token value}"
--form "file1=@{path-to-dicoms}/blue-circle.dcm;type=application/dicom"

Один экземпляр Upsert

Примечание.

Это не стандартный API, который позволяет выполнять upsert одного DICOM-файла.

Используйте этот метод для отправки одного ФАЙЛА DICOM.

Сведения:

  • Путь:.. /учёба
  • Метод: PUT
  • Заголовки:
    • Принять: application/dicom+json
    • Content-Type: application/dicom
    • Авторизация: носитель {значение токена}
  • Текст:
    • Содержит один файл DICOM в виде двоичных байтов.
curl --location --request PUT "{Service URL}/v{version}/studies"
--header "Accept: application/dicom+json"
--header "Content-Type: application/dicom"
--header "Authorization: Bearer {token value}"
--data-binary "@{path-to-dicoms}/green-square.dcm"

Получение DICOM (WADO)

Получение всех экземпляров в исследовании

Этот запрос извлекает все экземпляры в одном исследовании и возвращает их в виде коллекции многопартийных или связанных байтов.

Сведения:

  • Путь:.. /studies/{study}
  • Метод: GET
  • Заголовки:
    • Принять: многопартийное или связанное; type="application/dicom"; transfer-syntax=*
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"
--header "Accept: multipart/related; type=\"application/dicom\"; transfer-syntax=*"
--header "Authorization: Bearer {token value}"
--output "suppressWarnings.txt"

Эта команда cURL показывает скачанные байты в выходном файле (suppressWarnings.txt), но они не являются прямыми файлами DICOM, а только текстовым представлением многопартийного или связанного скачивания.

Получение метаданных всех экземпляров в исследовании

Этот запрос извлекает метаданные для всех экземпляров в одном исследовании.

Сведения:

  • Путь:.. /studies/{study}/метаданные
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}

Эта команда cURL показывает скачанные байты в выходном файле (suppressWarnings.txt), но они не являются прямыми файлами DICOM, а только текстовым представлением многопартийного или связанного скачивания.

curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/metadata"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Получение всех экземпляров в серии

Этот запрос извлекает все экземпляры в одной серии и возвращает их в виде коллекции многопартийных и связанных байтов.

Сведения:

  • Путь:.. /studies/{study}/series/{series}
  • Метод: GET
  • Заголовки:
    • Принять: многопартийное или связанное; type="application/dicom"; transfer-syntax=*
    • Авторизация: носитель {значение токена}

Эта команда cURL показывает скачанные байты в выходном файле (suppressWarnings.txt), но это не DICOM-файл, а только текстовое представление многопартийного или связанного скачивания.

curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"
--header "Accept: multipart/related; type=\"application/dicom\"; transfer-syntax=*"
--header "Authorization: Bearer {token value}"
--output "suppressWarnings.txt"

Получение метаданных всех экземпляров в серии

Этот запрос извлекает метаданные для всех экземпляров в одном исследовании.

Сведения:

  • Путь:.. /studies/{study}/series/{series}/metadata
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/metadata"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Получение одного экземпляра в серии исследования

Этот запрос извлекает один экземпляр и возвращает его в виде отформатированного потока байтов в формате DICOM.

Сведения:

  • Путь:.. /studies/{study}/series{series}/instances/{instance}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom; transfer-syntax=*
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/instances/1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"
--header "Accept: application/dicom; transfer-syntax=*"
--header "Authorization: Bearer {token value}"
--output "suppressWarnings.txt"

Получение метаданных одного экземпляра в серии исследований

Этот запрос извлекает метаданные для одного экземпляра в рамках одного исследования и ряда.

Сведения:

  • Путь:.. /studies/{study}/series/{series}/instances/{instance}/metadata
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/instances/1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395/metadata"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Получение одного или нескольких кадров из одного экземпляра

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

Сведения:

  • Путь:.. /studies/{study}/series{series}/instances/{instance}/frames/1,2,3
  • Метод: GET
  • Заголовки:
    • Принять: многопартийное или связанное; type="application/octet-stream"; transfer-syntax=1.2.840.10008.1.2.1 (по умолчанию)
    • Принять: многопартийное или связанное; type="application/octet-stream"; transfer-syntax=* или
    • Принять: многопартийное или связанное; type="application/octet-stream";
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/instances/1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395/frames/1"
--header "Accept: multipart/related; type=\"application/octet-stream\"; transfer-syntax=1.2.840.10008.1.2.1"
--header "Authorization: Bearer {token value}"
--output "suppressWarnings.txt"

Query DICOM (QIDO)

В следующих примерах мы ищем элементы, используя их уникальные идентификаторы. Вы также можете искать другие атрибуты, например PatientName.

Поиск исследований

Этот запрос позволяет выполнять поиск одного или нескольких исследований по атрибутам DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции о соответствии DICOM.

Сведения:

  • Путь:.. /учёба? StudyInstanceUID={study}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies?StudyInstanceUID=1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Поиск рядов

Этот запрос позволяет выполнять поиск одной или нескольких рядов по атрибутам DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции о соответствии DICOM.

Сведения:

  • Путь:.. /серия? SeriesInstanceUID={series}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/series?SeriesInstanceUID=1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Поиск ряда в исследовании

Этот запрос позволяет выполнять поиск одной или нескольких рядов в рамках одного исследования атрибутами DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции о соответствии DICOM.

Сведения:

  • Путь:.. /studies/{study}/series? SeriesInstanceUID={series}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series?SeriesInstanceUID=1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Поиск экземпляров

Этот запрос позволяет выполнять поиск одного или нескольких экземпляров атрибутами DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции о соответствии DICOM.

Сведения:

  • Путь:.. /Экземпляров? SOPInstanceUID={instance}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/instances?SOPInstanceUID=1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Поиск экземпляров в исследовании

Этот запрос позволяет выполнять поиск одного или нескольких экземпляров в рамках одного исследования атрибутами DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции о соответствии DICOM.

Сведения:

  • Путь:.. /studies/{study}/instances? SOPInstanceUID={instance}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/instances?SOPInstanceUID=1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Поиск экземпляров в рамках исследования и ряда

Этот запрос позволяет выполнять поиск одного или нескольких экземпляров в рамках одного исследования и одного ряда по атрибутам DICOM.

Дополнительные сведения о поддерживаемых атрибутах DICOM см. в инструкции соответствия DICOM

Сведения:

  • Путь:.. /studies/{study}/series/{series}/instances? SOPInstanceUID={instance}
  • Метод: GET
  • Заголовки:
    • Принять: application/dicom+json
    • Авторизация: носитель {значение токена}
curl --request GET "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/instances?SOPInstanceUID=1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"
--header "Accept: application/dicom+json"
--header "Authorization: Bearer {token value}"

Удаление DICOM

Удаление конкретного экземпляра в рамках исследования и ряда

Этот запрос удаляет один экземпляр в рамках одного исследования и одной серии.

Удаление не является частью стандарта DICOM, но добавляется для удобства.

Сведения:

  • Путь:.. /studies/{study}/series/{series}/instances/{instance}
  • Метод: DELETE
  • Заголовки:
    • Авторизация: носитель {значение токена}
curl --request DELETE "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652/instances/1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"
--header "Authorization: Bearer {token value}"

Удаление определенной серии в исследовании

Этот запрос удаляет один ряд (и все дочерние экземпляры) в рамках одного исследования.

Удаление не является частью стандарта DICOM, но добавляется для удобства.

Сведения:

  • Путь:.. /studies/{study}/series/{series}
  • Метод: DELETE
  • Заголовки:
    • Авторизация: носитель {значение токена}
curl --request DELETE "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420/series/1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"
--header "Authorization: Bearer {token value}"

Удаление конкретного исследования

Этот запрос удаляет одно исследование (и все дочерние ряды и экземпляры).

Удаление не является частью стандарта DICOM, но добавляется для удобства.

Сведения:

  • Путь:.. /studies/{study}
  • Метод: DELETE
  • Заголовки:
    • Авторизация: носитель {значение токена}
curl--request DELETE "{Service URL}/v{version}/studies/1.2.826.0.1.3680043.8.498
--header "Authorization: Bearer {token value}"

Примечание.

DICOM® является зарегистрированным товарным знаком Национальной ассоциации производителей электрических технологий для публикаций по стандартам, касающихся цифровых коммуникаций медицинской информации.