Healthcare API (клиент Ruby) возвращает значение null

Я пытаюсь получить пациента из магазина FHIR через клиент Ruby, и он всегда возвращает значение null.

Я успешно выполняю запрос через CURL. Вот команда CURL, которую я выполняю (полный путь удален):

      curl -X GET \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID"

Это возвращает правильный ресурс пациента FHIR.

Мой код Ruby выглядит так:

      require 'google/apis/healthcare_v1'
require 'googleauth'

service = Google::Apis::HealthcareV1::CloudHealthcareService.new

scope = 'https://www.googleapis.com/auth/cloud-platform'
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open('REDACTED'), 
  scope: scope
)
service.authorization.fetch_access_token!

project_id = REDACTED
location = REDACTED
dataset_id = REDACTED
fhir_store_id = REDACTED
resource_type = 'Patient'
patient_id = REDACTED

name = "projects/#{project_id}/locations/#{location}/datasets/#{dataset_id}/fhirStores/#{fhir_store_id}/fhir/Patient/#{patient_id}"
response = service.read_project_location_dataset_fhir_store_fhir(name)
puts response.to_json

Я не получаю ошибок аутентификации. Пример CURL возвращает соответствующий результат, а пример клиента Ruby возвращает null.

Любые идеи?

1 ответ

Библиотека Ruby автоматически пытается проанализировать ответ как JSON. Поскольку ответы от Healthcare API (или любого сервера FHIR) Content-Type: application/fhir+json, это не распознается библиотекой Ruby и просто возвращает nilдля проанализированного ответа.

Я заставил это работать, используя skip_deserializationвариант для вызова API (docs), поэтому вместо этого вы должны попробовать

      require 'json'

name = "projects/#{project_id}/locations/#{location}/datasets/#{dataset_id}/fhirStores/#{fhir_store_id}/fhir/Patient/#{patient_id}"
response = service.read_project_location_dataset_fhir_store_fhir(name, options: {
  skip_deserialization: true,
})

patient = JSON.parse(response)

На самом деле вам все равно придется анализировать ответ самостоятельно, потому что тип ответа Ruby для этих вызовов Google::Apis::HealthcareV1::HttpBody, который по сути представляет собой просто оболочку для необработанного объекта JSON.

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