Zend_Gdata_Health.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15617 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.gdata.health">
  5. <title>Verwenden von Google Health</title>
  6. <para>
  7. Die Google Health Data API wurde entwickelt um es Entwicklern zu erlauben die folgenden 2
  8. Dinge zu tun:
  9. <itemizedlist>
  10. <listitem>
  11. <para>
  12. Das Google Gesundheitsprofil eines Benutzers lesen oder nach medizinischen
  13. Einträgen zu suchen die einem speziellen Kriterium entsprechen und dann die
  14. Ergebnisse zu verwenden um personalisierte Funktionalitäten basierend auf diesen
  15. Daten anzubieten.
  16. </para>
  17. </listitem>
  18. <listitem>
  19. <para>
  20. Neue Medizinische Daten zu einem Benutzerprofil hinzuzufügen indem CCR Daten
  21. eingefügt werden wenn eine Notiz an ein Benutzerprofil gesendet wird. Es ist zu
  22. beachten das die CCR Daten als XML Blob im &lt;atom&gt; Eintrag gespeichert
  23. werden. Die Bibliothek bietet keine direkten Zugriffsmethoden zu dem
  24. Objektmodell an aber es hat Helfer für das extrahieren von speziellen Feldern.
  25. </para>
  26. </listitem>
  27. </itemizedlist>
  28. </para>
  29. <para>
  30. Es gibt drei Hauptfeeds, die alle eine Authentifikation benötigen. Anders als andere Google
  31. Data APIs hat jede der Google Health Feeds ein begrenztes Set von HTTP Anweisungen die auf
  32. Ihm ausgeführt werden können, abhängig von der Authentifizierungsmethode die man verwendet
  33. (ClientLogin oder AuthSub/OAuth). Für eine Liste von gestatteten Anweisungen siehe
  34. <ulink url="http://code.google.com/apis/health/reference.html#Authentication">http://code.google.com/apis/health/reference.html#Authentication</ulink>.
  35. <itemizedlist>
  36. <listitem>
  37. <para>
  38. <firstterm>Profil Feed</firstterm> verwende den Profilfeed um das
  39. Gesundheitsprofil eines Benutzers nach speziellen Informationen zu durchsuchen.
  40. </para>
  41. </listitem>
  42. <listitem>
  43. <para>
  44. <firstterm>Registrierungs Feed</firstterm>
  45. verwende den Registrierungsfeed um neue CCR Daten in ein Profil einzupflegen.
  46. </para>
  47. </listitem>
  48. <listitem>
  49. <para>
  50. <firstterm>Profil Listen Feed</firstterm> der Profil Listen Feed sollte
  51. verwendet werden um festzustellen mit welchem Gesundheitsprofil eines Benutzer
  52. interagiert werden soll. Dieser Feed ist nur vorhanden wenn man ClientLogin
  53. verwendet.
  54. </para>
  55. </listitem>
  56. </itemizedlist>
  57. </para>
  58. <para>
  59. Siehe <ulink
  60. url="http://code.google.com/apis/health/">http://code.google.com/apis/health</ulink> für
  61. weitere Informationen über die Google Health API.
  62. </para>
  63. <sect2 id="zend.gdata.health.connect">
  64. <title>Zum Health Service verbinden</title>
  65. <para>
  66. Die Google Health API basiert, wie alle Google Data APIs, auf dem Atom Publishing
  67. Protokoll (APP), einem XML basierenden Format für die Verwaltung von Web-basierenden
  68. Ressourcen. Verkehr zwischen einem Client und dem Google Health Servern findet über HTTP
  69. statt und erlaubt authentifizierte Verbindungen.
  70. </para>
  71. <para>
  72. Bevor eine Transaktion stattfinden kann, muß eine Verbindung erstellt werden. Das
  73. Erstellen einer Verbindung zu den Health Servern beinhaltet zwei Schritte: Erstellung
  74. eines HTTP Clients und diesen Client an eine <classname>Zend_Gdata_Health</classname>
  75. Instanz binden.
  76. </para>
  77. <sect3 id="zend.gdata.health.connect.authentication">
  78. <title>Authentifikation</title>
  79. <para>
  80. Die Google Health API erlaubt den programmtechnischen Zugriff auf das
  81. Gesundheitsprofil eines Benutzer. Es gibt drei Authentifizierungsschemata die von
  82. Google Health unterstützt werden:
  83. </para>
  84. <itemizedlist>
  85. <listitem>
  86. <para>
  87. <firstterm>ClientLogin</firstterm>
  88. bietet direkte Benutzername/Passwort Authentifikation zu den Health Servern.
  89. Da diese Methoden erwarten das Benutzer Ihr Passwort der Anwendung angeben
  90. müssen, wird dieses Authentifizierungsschema nur für
  91. installierte/Desktopanwendungen empfohlen.
  92. </para>
  93. </listitem>
  94. <listitem>
  95. <para>
  96. <firstterm>AuthSub</firstterm>
  97. erlaubt es einen Benutzer seine privaten Daten zu teilen. Das bietet das
  98. selbe Level der bequemlichkeit wir ClientLogin, aber ohne das
  99. Sicherheitsrisiko, was es zu einer idealen Wahl für Web-basierende
  100. Anwendungen macht. Für Google Health muß AuthSub in einem registrierten und
  101. sicheren Modus verwendet werden -- was bedeutet das alle Anfragen zur API
  102. digital signiert werden müssen.
  103. </para>
  104. </listitem>
  105. <listitem>
  106. <para>
  107. <firstterm>OAuth</firstterm>
  108. ist eine alternative zu AuthSub. Auch wenn dieses Authentifizierungschema
  109. nicht in diesem Dokument diskutiert wird, können weitere Informationen hier
  110. gefunden werden: <ulink
  111. url="http://code.google.com/apis/health/developers_guide_protocol.html#OAuth">Health
  112. Data API Developer's Guide</ulink>.
  113. </para>
  114. </listitem>
  115. </itemizedlist>
  116. <para>
  117. Siehe
  118. <ulink url="http://code.google.com/apis/gdata/auth.html">Authentication Overview in
  119. the Google Data API documentation</ulink> für weitere Informationen über jede
  120. Authentifizierungsmethode.
  121. </para>
  122. </sect3>
  123. <sect3 id="zend.gdata.health.connect.service">
  124. <title>Erstellen einer Health Service Instanz</title>
  125. <para>
  126. Um mit Google Health zu interagieren, bietet die Client Bibliothek die Serviceklasse
  127. <classname>Zend_Gdata_Health</classname>. Diese Klasse bietet ein übliches Interface
  128. zu den Google Data und Atom Publishing Protokoll Modellen und hilft bei der
  129. Durchführung von Anfragen von und zur Health API.
  130. </para>
  131. <para>
  132. Sobald man sich für ein Authentifizierungsschema entschieden hat, ist der nächste
  133. Schritt die Erstellung einer Instanz von <classname>Zend_Gdata_Health</classname>.
  134. Dieser Klasse sollte eine Instanz von <classname>Zend_Gdata_HttpClient</classname>
  135. übergeben werden. Diese bietet ein Interface für- AuthSub/OAuth und ClientLogin um
  136. einen speziell authentifizierten HTTP Client zu erstellen.
  137. </para>
  138. <para>
  139. Um mit dem H9 des Entwicklers (/h9) statt Google Health (/health) nimmt der
  140. Konstruktor von <classname>Zend_Gdata_Health</classname> ein optionales drittes
  141. Argument mit dem man den H9 Service Name 'weaver' spezifizieren kann.
  142. </para>
  143. <para>
  144. Das folgende Beispiel zeigt wie eine Health Service Klasse bei Verwendung der
  145. ClientLogin Authentifizierung erstellt wird:
  146. </para>
  147. <programlisting language="php"><![CDATA[
  148. // Parameter für die ClientLogin Authentifikation
  149. $healthServiceName = Zend_Gdata_Health::HEALTH_SERVICE_NAME;
  150. //$h9ServiceName = Zend_Gdata_Health::H9_SANDBOX_SERVICE_NAME;
  151. $user = "user@gmail.com";
  152. $pass = "pa$$w0rd";
  153. // Erstellt einen authentifizierten HTTP Client
  154. $client = Zend_Gdata_ClientLogin::getHttpClient($user,
  155. $pass,
  156. $healthServiceName);
  157. // Erstellt eine Instanz des Health Services
  158. $service = new Zend_Gdata_Health($client);
  159. ]]></programlisting>
  160. <para>
  161. Ein Health Service der AuthSub verwendet kann ähnlich erstellt werden, im einem
  162. etwas längeren Aussehen. AuthSub ist das empfohlene Interface um mit Google Health
  163. zu kommunizieren weil jeder Token direkt zu einem speziellen Profil im Account des
  164. Benutzers verlinkt wird. Anders als andere Google Data APIs, ist es notwendig das
  165. alle Anfragen von der eigenen Anwendung digital signiert werden.
  166. </para>
  167. <programlisting language="php"><![CDATA[
  168. /*
  169. * Empfängt die aktuelle URL damit der AuthSub Server weiß wohin er den
  170. * Benutzer routen soll nachdem die Authentifizierung komplett ist.
  171. */
  172. function getCurrentUrl() {
  173. $phpRequestUri = htmlentities(substr($_SERVER['REQUEST_URI'],
  174. 0,
  175. strcspn($_SERVER['REQUEST_URI'],
  176. "\n\r")),
  177. ENT_QUOTES);
  178. if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
  179. $protocol = 'https://';
  180. } else {
  181. $protocol = 'http://';
  182. }
  183. $host = $_SERVER['HTTP_HOST'];
  184. if ($_SERVER['SERVER_PORT'] != '' &&
  185. (($protocol == 'http://' && $_SERVER['SERVER_PORT'] != '80') ||
  186. ($protocol == 'https://' && $_SERVER['SERVER_PORT'] != '443'))) {
  187. $port = ':' . $_SERVER['SERVER_PORT'];
  188. } else {
  189. $port = '';
  190. }
  191. return $protocol . $host . $port . $phpRequestUri;
  192. }
  193. /*
  194. * Leitet einen Benutzer zu AuthSub um wenn er keinen gültigen Session Token
  195. * hat. Wenn er von AuthSub mit einem einmal-zu-verwendenden Token zurückkommt,
  196. * wird ein neuer HTTP Client initialisiert und der Token mit eine langlebigen
  197. * Sessiontoken getauscht.
  198. */
  199. function setupClient($singleUseToken = null) {
  200. $client = null;
  201. // Einen neuen AuthSub Token holen?
  202. if (!$singleUseToken) {
  203. $next = getCurrentUrl();
  204. $scope = 'https://www.google.com/health/feeds';
  205. $authSubHandler = 'https://www.google.com/health/authsub';
  206. $secure = 1;
  207. $session = 1;
  208. $authSubURL = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
  209. $scope,
  210. $secure,
  211. $session,
  212. $authSubHandler);
  213. // 1 - Erlaubt es Notizen zu schicken und das Lesen von Profildaten
  214. $permission = 1;
  215. $authSubURL .= '&permission=' . $permission;
  216. echo '<a href="' . $authSubURL . '">Dein Google Health Account</a>';
  217. } else {
  218. $client = new Zend_Gdata_HttpClient();
  219. // Setzen des privaten Schlüssels mit dem nachfolgende Anfragen
  220. // signiert werden
  221. $client->setAuthSubPrivateKeyFile('/path/to/your/rsa_private_key.pem',
  222. null,
  223. true);
  224. $sessionToken =
  225. Zend_Gdata_AuthSub::getAuthSubSessionToken(trim($singleUseToken),
  226. $client);
  227. // Setzt den langlebigen Sessiontoken für nachfolgende Anfragen
  228. $client->setAuthSubToken($sessionToken);
  229. }
  230. return $client;
  231. }
  232. // -> Skriptausführung beginnt hier <-
  233. session_start();
  234. $client = setupClient(@$_GET['token']);
  235. // Erstellt eine Instanz des Health Services
  236. $userH9Sandbox = false;
  237. $healthService = new Zend_Gdata_Health($client,
  238. 'googleInc-MyTestAppName-v1.0',
  239. $userH9Sandbox);
  240. ]]></programlisting>
  241. <para>
  242. Achtung: der Rest dieses Dokument wird annehmen das man AuthSub für die
  243. Authentifikation verwendet.
  244. </para>
  245. </sect3>
  246. </sect2>
  247. <sect2 id="zend.gdata.health.profilefeed">
  248. <title>Profil Feed</title>
  249. <para>
  250. Um den Profil Feed des Benutzers abzufragen, muß man sicherstellen das der initiale
  251. AuthSub Token mit gesetztem <code>permission=1</code> Parameter angefragt wurde. Der
  252. Prozess des extrahierens von Daten aus dem Profil benötigt zwei Schritte. Das Senden
  253. einer Anfrage und dem durchlaufen des resultierenden Feeds.
  254. </para>
  255. <sect3 id="zend.gdata.health.profilefeed.query">
  256. <title>Eine strukturierte Anfrage senden</title>
  257. <para>
  258. Man kann strukturierte Anfragen senden um spezielle Einträge von einem
  259. Benutzerprofil zu erhalten.
  260. </para>
  261. <para>
  262. Wenn man die Health API verwendet um ein Profil zu empfangen, werden speziell
  263. konstruierte Anfrage URLs verwendet um zu beschreiben welche (CCR) Daten
  264. zurückgegeben werden sollen. Die Klasse
  265. <classname>Zend_Gdata_Health_Query</classname> hilft dabei diese Aufgabe zu
  266. vereinfachen indem automatisch eine Abfrage URL erstellt wird basierend auf den
  267. Parametern die man gesetzt hat.
  268. </para>
  269. <sect4 id="zend.gdata.health.profilefeed.query.construct">
  270. <title>Den Feed abfragen</title>
  271. <para>
  272. Um eine Abfrage eines Profil Feeds durchzuführen, muß eine neue Instanz von
  273. <classname>Zend_Gdata_Health_Query</classname> erzeugt und die
  274. <code>getHealthProfileFeed()</code> Methode des Services aufgerufen werden:
  275. </para>
  276. <programlisting language="php"><![CDATA[
  277. $healthService = new Zend_Gdata_Health($client);
  278. // Beispielabfrage für die besten 10 Medikationen mit jeweils 2 Elementen
  279. $query = new Zend_Gdata_Health_Query();
  280. $query->setDigest("true");
  281. $query->setGrouped("true");
  282. $query->setMaxResultsGroup(10);
  283. $query->setMaxResultsInGroup(2);
  284. $query->setCategory("medication");
  285. $profileFeed = $healthService->getHealthProfileFeed($query);
  286. ]]></programlisting>
  287. <para>
  288. Wenn man <code>setDigest("true")</code> verwendet werden alle CCR Daten des
  289. Benutzers in einem einzelnen Atom <code>&lt;entry&gt;</code> zurückgegeben.
  290. </para>
  291. <para>
  292. Dem <code>setCategory()</code> Helfer kann ein zusätzlicher Parameter übergeben
  293. werden um spezifischere CCR Informationen zurückzuerhalten. Um zum Beispiel nur
  294. die Medikation Lipitor zurückzugeben verwendet man
  295. <code>setCategory("medication", "Lipitor")</code>. Die selbe Methode kann bei
  296. anderen Kategorien wie Konditionen, Allergien, Labor Ergebnisse, usw. angewendet
  297. werden.
  298. </para>
  299. <para>
  300. Eine komplette Liste der unterstützten Abfrageparameter ist im <ulink
  301. url="http://code.google.com/apis/health/reference.html#Parameters">Kapitel
  302. der Abfrageparameter</ulink> des Health API Referenz Guides vorhanden.
  303. </para>
  304. </sect4>
  305. </sect3>
  306. <sect3 id="zend.gdata.health.profilefeed.iterate">
  307. <title>Durch die Profil Einträge iterieren</title>
  308. <para>
  309. Jeder Google Health Eintrag enthält CCR Daten, trotzem führt die Verwendung des
  310. Abfrageparameters <code>digest=true</code> dazu das alle CCR Elemente (die dieser
  311. Abfrage entsprechen) in einen einzelnen Atom <code>&lt;entry&gt;</code>
  312. zusammengefügt werden.
  313. </para>
  314. <para>
  315. Um die kompletten CCR Informationen von einem Eintrag zu erhalten, muß ein Aufruf
  316. zur <code>getCcr()</code> Methode der
  317. <classname>Zend_Gdata_Health_ProfileEntry</classname> Klasse durchgeführt werden.
  318. Das gibt ein <classname>Zend_Gdata_Health_Extension_CCR</classname> zurück:
  319. </para>
  320. <programlisting language="php"><![CDATA[
  321. $entries = $profileFeed->getEntries();
  322. foreach ($entries as $entry) {
  323. $medications = $entry->getCcr()->getMedications();
  324. //$conditions = $entry->getCcr()->getConditions();
  325. //$immunizations = $entry->getCcr()->getImmunizations();
  326. // Das CCR XML ausgeben (das werden nur die Medikationen des Eintrags sein)
  327. foreach ($medications as $med) {
  328. $xmlStr = $med->ownerDocument->saveXML($med);
  329. echo "<pre>" . $xmlStr . "</pre>";
  330. }
  331. }
  332. ]]></programlisting>
  333. <para>
  334. Hier wird die <code>getCcr()</code> Methode in Verbindung mit einem magischen Helfer
  335. verwendet um nur die Medikationsdaten aufzureißen und aus den CCR des Eintrags zu
  336. extrahieren. Der hierbei erwähnte magische Helfer nimmt das Formular
  337. <code>getCATEGORYNAME()</code>, wobei <code>CATEGORYNAME</code> eine unterstützte
  338. Kategorie von Google Health ist. Für mögliche Kategorien kann in den
  339. <ulink url="http://code.google.com/apis/health/reference.html#CatQueries">Google
  340. Health Referenz Guide</ulink> gesehen werden.
  341. </para>
  342. <para>
  343. Um effizienter zu sein, können auch Kategorie Abfragen verwendet werden um nur die
  344. notwendigen CCRs von den Google Health Servern zu erhalten. Dann muß durch diese
  345. Ergebnisse iteriert werden:
  346. </para>
  347. <programlisting language="php"><![CDATA[
  348. $query = new Zend_Gdata_Health_Query();
  349. $query->setDigest("true");
  350. $query->setCategory("condition");
  351. $profileFeed = $healthService->getHealthProfileFeed($query);
  352. // Da die Abfrage digest=true enthält, wird nur der Atom Eintrag zurückgegeben
  353. $entry = $profileFeed->entry[0];
  354. $conditions = $entry->getCcr()->getConditions();
  355. // Die CCR Daten ausgeben (das sind nur die Konditionen des Profils)
  356. foreach ($conditions as $cond) {
  357. $xmlStr = $cond->ownerDocument->saveXML($cond);
  358. echo "<pre>" . $xmlStr . "</pre>";
  359. }
  360. ]]></programlisting>
  361. </sect3>
  362. </sect2>
  363. <sect2 id="zend.gdata.health.profilelist">
  364. <title>Profil Listen Feed</title>
  365. <para>
  366. Beachte: Dieser Feed ist nur vorhanden wenn man ClientLogin verwendet
  367. </para>
  368. <para>
  369. Da ClientLogin bei jedem seiner Feeds eine Profil ID benötigt, sollten Anwendungen
  370. diesen Feed als erstes abfragen um die richtigen Profile auszuwählen. Der Profil Listen
  371. Feed gibt Atom Einträge zurück die jedem Profil im Benutzeraccount von Google Health
  372. entsprechen. Die ProfilID wird im Atom <code>&lt;content&gt;</code> und der Name im
  373. <code>&lt;title&gt;</code> Element zurückgegeben.
  374. </para>
  375. <sect3 id="zend.gdata.health.profilelist.query">
  376. <title>Den Feed abfragen</title>
  377. <para>
  378. Um eine Abfrage gegen den Profil Listen Feed durchzuführen muß die
  379. <code>getHealthProfileListFeed()</code> Methode des Services aufgerufen werden:
  380. </para>
  381. <programlisting language="php"><![CDATA[
  382. $client = Zend_Gdata_ClientLogin::getHttpClient('user@gmail.com',
  383. 'pa$$word',
  384. 'health');
  385. $healthService = new Zend_Gdata_Health($client);
  386. $feed = $healthService->getHealthProfileListFeed();
  387. // Jeden Namen und jede ID des Profils ausgeben
  388. $entries = $feed->getEntries();
  389. foreach ($entries as $entry) {
  390. echo '<p>Profil Name: ' . $entry->getProfileName() . '<br>';
  391. echo 'Profil ID: ' . $entry->getProfileID() . '</p>';
  392. }
  393. ]]></programlisting>
  394. <para>
  395. Sobald man sich entschieden hat welches Profil verwendet werden soll, wird
  396. <code>setProfileID()</code> mit der Profil ID als Argument aufgerufen. Das begrenzt
  397. die weiteren API Abfragen auf genau das betreffende Profil:
  398. </para>
  399. <programlisting language="php"><![CDATA[
  400. // Verwende das erste Profil
  401. $profileID = $feed->entry[0]->getProfileID();
  402. $healthService->setProfileID($profileID);
  403. $profileFeed = $healthService->getHealthProfileFeed();
  404. $profileID = $healthService->getProfileID();
  405. echo '<p><b>Abgefragte Profil ID</b>: ' . $profileID . '</p>';
  406. ]]></programlisting>
  407. </sect3>
  408. </sect2>
  409. <sect2 id="zend.gdata.health.notice">
  410. <title>Notizen an des Register Feed versenden</title>
  411. <para>
  412. Individuelle Antworten zum registrierten Feed sind als Notizen bekannt. Notizen werden
  413. von Dritt-Anwendungen gesendet um den Benutzer über ein neues Event zu informieren. Mit
  414. AuthSub/OAuth, sind Notizen einfach etwas womit die eigene Anwendung neue CCR
  415. Informationen zu einem Benutzerprofil hinzufügen kann. Notizen können reinen Text
  416. enthalten (inklusive einiger XHTML Elemente), ein CCR Dokument oder beides. Als Beispiel
  417. können Notizen gesendet werden um Benutzer daran zu erinnern das Sie spezielle Rezepte
  418. nehmen sollen, oder sie können Laborergebnisse im CCR Format enthalten.
  419. </para>
  420. <sect3 id="zend.gdata.health.notice.send">
  421. <title>Senden einer Notiz</title>
  422. <para>
  423. Notizen können durch das Verwenden der <code>sendHealthNotice()</code> Methode des
  424. Health Services gesendet werden:
  425. </para>
  426. <programlisting language="php"><![CDATA[
  427. $healthService = new Zend_Gdata_Health($client);
  428. $subject = "Der Titel der Notiz ist hier";
  429. $body = "Der Notizinhalt kann einige <b>html</b> Elemente enthalten";
  430. $ccr = '<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">
  431. <Body>
  432. <Problems>
  433. <Problem>
  434. <DateTime>
  435. <Type><Text>Start Datum</Text></Type>
  436. <ExactDateTime>2007-04-04T07:00:00Z</ExactDateTime>
  437. </DateTime>
  438. <Description>
  439. <Text>Medikament gegen Aorta Verengung</Text>
  440. <Code>
  441. <Value>410.10</Value>
  442. <CodingSystem>ICD9</CodingSystem>
  443. <Version>2004</Version>
  444. </Code>
  445. </Description>
  446. <Status><Text>Aktiv</Text></Status>
  447. </Problem>
  448. </Problems>
  449. </Body>
  450. </ContinuityOfCareRecord>';
  451. $responseEntry = $healthService->sendHealthNotice($subject,
  452. $body,
  453. "html",
  454. $ccr);
  455. ]]></programlisting>
  456. </sect3>
  457. </sect2>
  458. </sect1>