使用Firely .NET SDK构建NHS eReferral系统FHIR查询的参数问题
使用Firely .NET SDK构建符合NHS eRS规范的FHIR工作列表请求
我尝试用FirelyTeam的firely-net-sdk创建FHIR REST请求,调用NHS eReferral系统获取工作列表,目标JSON结构如下:
{"resourceType": "Parameters","meta": {"profile": ["https://fhir.nhs.uk/STU3/StructureDefinition/eRS-FetchWorklist-Parameters-1"]},"parameter": [{"name": "listType","valueCodeableConcept": {"coding": [{"system": "https://fhir.nhs.uk/STU3/CodeSystem/eRS-ReferralListSelector-1","code": "REFERRALS_FOR_REVIEW"}]}}]}
我编写的C#代码如下:
var url = "FHIR/STU3/ReferralRequest/$ers.fetchworklist"; var bundle = new Parameters(); bundle.Meta = new Meta(); bundle.Meta.Profile = new string[] { "https://fhir.nhs.uk/STU3/StructureDefinition/eRS-FetchWorklist-Parameters-1" }; bundle.Add("name", new FhirString("listType")); var parms = new Parameters() .Add("system", new FhirString("https://fhir.nhs.uk/STU3/CodeSystem/eRS-ReferralListSelector-1")) .Add("code", new FhirString("REFERRALS_FOR_REVIEW")); bundle.Add("valueCodeableConcept", new Parameters().Add("coding",parms)); var response = await _fhirClient.OperationAsync(new Uri(EndPointUrl + "FHIR/STU3/ReferralRequest"), "ers.fetchworklist", bundle);
但通过Fiddler抓包发现生成的JSON结构错误:
{"resourceType": "Parameters","meta": {"profile": ["https://fhir.nhs.uk/STU3/StructureDefinition/eRS-FetchWorklist-Parameters-1"]},"parameter": [{"name": "name","valueString": "listType"},{"name": "valueCodeableConcept","resource": {"resourceType": "Parameters","parameter": [{"name": "coding","resource": {"resourceType": "Parameters","parameter": [{"name": "system","valueString": "https://fhir.nhs.uk/STU3/CodeSystem/eRS-ReferralListSelector-1"},{"name": "code","valueString": "REFERRALS_FOR_REVIEW"}]}}]}}]}
当前bundle.Add("name", new FhirString("listType"));无法正确生成name: listType的参数项,请问如何正确为参数添加基础值以生成符合要求的结构?
解决方案
错误核心是误解了Parameters资源的构造逻辑:每个参数项是一个包含name属性和对应值的Parameters.ParameterComponent,而非单独添加"name"和"valueCodeableConcept"作为独立参数。同时valueCodeableConcept对应的是CodeableConcept类型,不能用Parameters嵌套替代。
修正代码(完整写法)
var url = "FHIR/STU3/ReferralRequest/$ers.fetchworklist"; // 构建Parameters资源 var parameters = new Parameters(); parameters.Meta = new Meta { Profile = new[] { "https://fhir.nhs.uk/STU3/StructureDefinition/eRS-FetchWorklist-Parameters-1" } }; // 构造CodeableConcept及内部的Coding var codeableConcept = new CodeableConcept(); codeableConcept.Coding.Add(new Coding { System = "https://fhir.nhs.uk/STU3/CodeSystem/eRS-ReferralListSelector-1", Code = "REFERRALS_FOR_REVIEW" }); // 创建单个参数项,绑定name和对应的值 var listTypeParam = new Parameters.ParameterComponent { Name = "listType", Value = codeableConcept }; // 将参数项加入Parameters集合 parameters.Parameter.Add(listTypeParam); // 发起操作请求 var response = await _fhirClient.OperationAsync( new Uri(EndPointUrl + "FHIR/STU3/ReferralRequest"), "ers.fetchworklist", parameters);
简化链式写法(推荐)
Firely SDK提供了更简洁的链式调用方法,可直接生成符合要求的结构:
var parameters = new Parameters() .Add("listType", new CodeableConcept() .AddCoding("https://fhir.nhs.uk/STU3/CodeSystem/eRS-ReferralListSelector-1", "REFERRALS_FOR_REVIEW")); parameters.Meta = new Meta { Profile = new[] { "https://fhir.nhs.uk/STU3/StructureDefinition/eRS-FetchWorklist-Parameters-1" } }; var response = await _fhirClient.OperationAsync( new Uri(EndPointUrl + "FHIR/STU3/ReferralRequest"), "ers.fetchworklist", parameters);
关键说明
- 使用
Parameters.Add(string name, DataType value)方法时,SDK会自动创建ParameterComponent,并完成Name赋值和Value绑定,无需手动拆分属性。 CodeableConcept.AddCoding可直接传入system和code,快速构造Coding对象,避免手动实例化集合的冗余操作。- 禁止嵌套
Parameters对象,所有值类型需使用FHIR标准数据类型(如CodeableConcept、Coding)而非Parameters。
内容的提问来源于stack exchange,提问作者Richard Housham
相关产品推荐
相关产品推荐

