This page contains examples of how to use the client to perform complete tasks. If you have an example you could contribute, we'd love to hear from you!

Transaction With Placeholder IDs

The following example shows how to post a transaction with two resources, where one resource contains a reference to the other. A temporary ID (a UUID) is used as an ID to refer to, and this ID will be replaced by the server by a permanent ID.

      // Create a patient object
      Patient patient = new Patient();
      patient.addIdentifier()
         .setSystem("http://acme.org/mrns")
         .setValue("12345");
      patient.addName()
         .addFamily("Jameson")
         .addGiven("J")
         .addGiven("Jonah");
      patient.setGender(AdministrativeGenderEnum.MALE);
      
      // Give the patient a temporary UUID so that other resources in
      // the transaction can refer to it
      patient.setId(IdDt.newRandomUuid());
      
      // Create an observation object
      Observation observation = new Observation();
      observation.setStatus(ObservationStatusEnum.FINAL);
      observation
         .getCode()
            .addCoding()
               .setSystem("http://loinc.org")
               .setCode("789-8")
               .setDisplay("Erythrocytes [#/volume] in Blood by Automated count");
      observation.setValue(
         new QuantityDt()
            .setValue(4.12)
            .setUnit("10 trillion/L")
            .setSystem("http://unitsofmeasure.org")
            .setCode("10*12/L"));

      // The observation refers to the patient using the ID, which is already
      // set to a temporary UUID  
      observation.setSubject(new ResourceReferenceDt(patient.getId().getValue()));

      // Create a bundle that will be used as a transaction
      Bundle bundle = new Bundle();
      bundle.setType(BundleTypeEnum.TRANSACTION);
      
      // Add the patient as an entry. This entry is a POST with an 
      // If-None-Exist header (conditional create) meaning that it
      // will only be created if there isn't already a Patient with
      // the identifier 12345
      bundle.addEntry()
         .setFullUrl(patient.getId().getValue())
         .setResource(patient)
         .getRequest()
            .setUrl("Patient")
            .setIfNoneExist("identifier=http://acme.org/mrns|12345")
            .setMethod(HTTPVerbEnum.POST);
      
      // Add the observation. This entry is a POST with no header
      // (normal create) meaning that it will be created even if
      // a similar resource already exists.
      bundle.addEntry()
         .setResource(observation)
         .getRequest()
            .setUrl("Observation")
            .setMethod(HTTPVerbEnum.POST);
      
      // Log the request
      FhirContext ctx = FhirContext.forDstu2();
      System.out.println(ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(bundle));
      
      // Create a client and post the transaction to the server
      IGenericClient client = ctx.newRestfulGenericClient("http://fhirtest.uhn.ca/baseDstu2");
      Bundle resp = client.transaction().withBundle(bundle).execute();

      // Log the response
      System.out.println(ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(resp));

This code creates the following transaction bundle:

<Bundle xmlns="http://hl7.org/fhir">
   <type value="transaction"/>
   <entry>
      <fullUrl value="urn:uuid:47709cc7-b3ec-4abc-9d26-3df3d3d57907"/>
      <resource>
         <Patient xmlns="http://hl7.org/fhir">
            <identifier>
               <system value="http://acme.org/mrns"/>
               <value value="12345"/>
            </identifier>
            <name>
               <family value="Jameson"/>
               <given value="J"/>
               <given value="Jonah"/>
            </name>
            <gender value="male"/>
         </Patient>
      </resource>
      <request>
         <method value="POST"/>
         <url value="Patient"/>
         <ifNoneExist value="identifier=http://acme.org/mrns|12345"/>
      </request>
   </entry>
   <entry>
      <resource>
         <Observation xmlns="http://hl7.org/fhir">
            <status value="final"/>
            <code>
               <coding>
                  <system value="http://loinc.org"/>
                  <code value="789-8"/>
                  <display value="Erythrocytes [#/volume] in Blood by Automated count"/>
               </coding>
            </code>
            <subject>
               <reference value="urn:uuid:47709cc7-b3ec-4abc-9d26-3df3d3d57907"/>
            </subject>
            <valueQuantity>
               <value value="4.12"/>
               <unit value="10 trillion/L"/>
               <system value="http://unitsofmeasure.org"/>
               <code value="10*12/L"/>
            </valueQuantity>
         </Observation>
      </resource>
      <request>
         <method value="POST"/>
         <url value="Observation"/>
      </request>
   </entry>
</Bundle>

The server responds with the following response. Note that the ID of the already existing patient is returned, and the ID of the newly created Observation is too.

<Bundle xmlns="http://hl7.org/fhir">
   <id value="dd1f75b8-e472-481e-97b3-c5eebb99a5e0"/>
   <type value="transaction-response"/>
   <link>
      <relation value="self"/>
      <url value="http://fhirtest.uhn.ca/baseDstu2"/>
   </link>
   <entry>
      <response>
         <status value="200 OK"/>
         <location value="Patient/966810/_history/1"/>
         <etag value="1"/>
         <lastModified value="2015-10-29T07:25:42.465-04:00"/>
      </response>
   </entry>
   <entry>
      <response>
         <status value="201 Created"/>
         <location value="Observation/966828/_history/1"/>
         <etag value="1"/>
         <lastModified value="2015-10-29T07:33:28.047-04:00"/>
      </response>
   </entry>
</Bundle>

Fetch all Pages of a Bundle

This example shows how to load all pages of a bundle by fetching each page one-after-the-other and then joining the resuts.

Back to top

Reflow Maven skin by Andrius Velykis.