Не удается получить ресурс из запроса POST / PUT (клиент .NET FHIR, веб-API 2) - PullRequest
1 голос
/ 27 мая 2019

Когда я пытаюсь отправить запрос POST / PUT с помощью .NET FHIR API на сервер asp.net Web API 2, я получаю сообщение об ошибке:

Hl7.Fhir.Rest.FhirOperationException: операция не выполнена из-за
ошибка клиента (UnsupportedMediaType). В теле нет содержимого.

1) Нужно ли создавать какой-либо обработчик / форматер MediaType?

2) Существует ли сервер с открытым исходным кодом, в котором код реализует лучшие практики API .NET FHIR?

Я посмотрел на Fiddler, кажется, клиент fhir отправляет правильный JSON в теле

fhirClient = new FhirClient(serverUrl);
fhirClient.PreferredFormat = ResourceFormat.Json;

Patient patient = new Patient();
//fill patient

    var response = fhirClient.Update(patient);

...
// сервер web api 2: WebApiConfig.cs:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/fhir+json"));

Я пытался:

[HttpPut]
public void Update([FromBody] Resource resource, string id = null)
{
// updating logic
}

//or
[HttpPut]
public void Update(Resource resource, string id = null)
{
// updating logic
}

но, когда я попробовал

[HttpPut]
public void Update([FromBody] object resource, string id = null)
{

Я могу видеть внутри "объекта" десериализованного пациента и использовать jsonParser, чтобы получить его обратно

Ответы [ 3 ]

0 голосов
/ 27 мая 2019

Действительно, см. Также здесь: Сериализация HL7 FHIR для json в asp.net web api - этот ответ основан на коде, который вы нашли выше.

0 голосов
/ 01 июня 2019

В этом есть несколько вариантов, в том числе проект с открытым исходным кодом fhir-net-web-api на github. Существует версия aspnetcore и полная версия для платформы. Проверьте пример проекта там, чтобы узнать, как их использовать.

0 голосов
/ 27 мая 2019

кажется, я должен написать свой собственный Fhir MediaTypeFormatter Я гуглил и нашел этот код :

 public class JsonFhirFormatter : FhirMediaTypeFormatter
    {
        private readonly FhirJsonParser _parser = new FhirJsonParser();
        private readonly FhirJsonSerializer _serializer = new FhirJsonSerializer();

        public JsonFhirFormatter() : base()
        {
            foreach (var mediaType in ContentType.JSON_CONTENT_HEADERS)
                SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
        }

        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = FhirMediaType.GetMediaTypeHeaderValue(type, ResourceFormat.Json);
        }

        public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            try
            {
                var body = base.ReadBodyFromStream(readStream, content);

                if (typeof(Resource).IsAssignableFrom(type))
                {
                    Resource resource = _parser.Parse<Resource>(body);
                    return Task.FromResult<object>(resource);
                }
                else
                {
                    throw Error.Internal("Cannot read unsupported type {0} from body", type.Name);
                }
            }
            catch (FormatException exception)
            {
                throw Error.BadRequest("Body parsing failed: " + exception.Message);
            }
        }

        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            using(StreamWriter streamwriter = new StreamWriter(writeStream))
            using (JsonWriter writer = new JsonTextWriter(streamwriter))
            {
                SummaryType summary = requestMessage.RequestSummary();

                if (type == typeof(OperationOutcome))
                {
                    Resource resource = (Resource)value;
                    _serializer.Serialize(resource, writer, summary);
                }
                else if (typeof(Resource).IsAssignableFrom(type))
                {
                    Resource resource = (Resource)value;
                    _serializer.Serialize(resource, writer, summary);
                }
                else if (typeof(FhirResponse).IsAssignableFrom(type))
                {
                    FhirResponse response = (value as FhirResponse);
                    if (response.HasBody)
                    {
                        _serializer.Serialize(response.Resource, writer, summary);
                    }
                }
            }

            return Task.CompletedTask;
        }
    }

и зарегистрируйте его в Global.asax

...