views:

164

answers:

2

I'm trying to use the Java HealthVault API to make a call to the GetThings method in "offline" mode (meaning, the user doesn't have to login) to retrieve all "File" type items. From what I understand, all you need to make an offline request is the Persion ID and Record ID of the user's account. However, even though I'm adding these to the request, the method call doesn't work. It returns the error code "67" in the response, which, according to a static variable in the API, stands for "invalid person or group ID".

I've double checked the Person ID and Record IDs and they are indeed correct. Making the same request in "online" mode (i.e. when including a user-auth-token) works perfectly fine. My application is configured to allow offline access to all "File" item types, so it couldn't be an access issue.

I've replaced the real Person ID and Record IDs with fake ones in the below code samples for security reasons:

Here's my Java code:

StringBuilder requestXml = new StringBuilder();
requestXml.append("<info><group>");
requestXml.append("<filter><type-id>bd0403c5-4ae2-4b0e-a8db-1888678e4528</type-id></filter>");
requestXml.append("<format><section>core</section><section>otherdata</section><xml/></format>");
requestXml.append("</group></info>");

Request request = new Request();
request.setMethodName("GetThings");
request.setOfflineUserId("e2f925e7-2748-4d88-bz48-32036dc10020");
request.setRecordId("73ab2792-5481-43eb-837c-67d1e3337300");
request.setInfo(requestXml.toString());

Connection connection = ConnectionFactory.getConnection();
HVAccessor accessor = new HVAccessor();
accessor.send(request, connection);

The XML request it generates:

<wc-request:request xmlns:wc-request="urn:com.microsoft.wc.request">
    <auth>
     <hmac-data algName="HMACSHA1">5WdiBnTvxsNbVHg134ggIETlJNE=</hmac-data>
    </auth>
    <header>
     <method>GetThings</method>
     <method-version>1</method-version>
     <record-id>73ab2792-5481-43eb-837c-67d1e3337300</record-id>
     <auth-session>
      <auth-token>ASAAAJQ1R50J8HpMshAjeHkjh/habVgM17BjSBuA/GmbJPV9A9d63mramakSZxf+ZHZh+7xWllTWGhAijBvxhNxauzBLci1IWWh+JDbGQZabnWbG7YH28ZP+FQuRPNP4T8O1NTNCFNETao0ly+UuPjWEZWCV5cCPX7GjaEJ4BMAFv4vAOEwIOe63VWntfzH9r3Rz0VnHAhb400iqs1XxlJrRbgXdNRdg</auth-token>
      <offline-person-info>
       <offline-person-id>e2f925e7-2748-4d88-bz48-32036dc10020</offline-person-id>
      </offline-person-info>
     </auth-session>
     <language>en</language>
     <country>US</country>
     <msg-time>2009-10-21T12:37:51.706-04:00</msg-time>
     <msg-ttl>180000</msg-ttl>
     <version>0.0.0.1</version>
     <info-hash>
      <hash-data algName="SHA1">oAZVXLGAUMfuVPrqjqb98yCb4/c=</hash-data>
     </info-hash>
    </header>
    <info>
     <group>
      <filter>
       <type-id>bd0403c5-4ae2-4b0e-a8db-1888678e4528</type-id>
      </filter>
      <format>
       <section>core</section>
       <section>otherdata</section>
       <xml />
      </format>
     </group>
    </info>
</wc-request:request>

The XML response I get back:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <status>
     <code>67</code>
     <error>
      <message>Exception of type
       'Microsoft.Health.Platform.WildcatStatusException' was thrown.</message>
     </error>
    </status>
</response>

Thank you so much for your help. :)

+1  A: 

Some other guy resolved the error by doing. You already tried this?

I got the error cleared up. I re-imported the certificate (found in the cert
folder) through the Healthvault Application Manager, cleared up the offline.txt
file and re-ran the application.
jitter
Thanks for the suggestion. It sounds like it was a certificate issue with him. I tried re-creating my keystore (I'm using Java...he was probably using .NET), but that didn't help. I use the same keystore for "online" mode and have no problems.
Michael Angstadt
A: 

Turns out the problem was that my Person and Record IDs actually were incorrect. I was using the ones I got while connected to the sample application, as opposed to my own application. I didn't know they changed across applications. After making a call to GetPersonInfo from my own application, I was able to get the correct Person and Record IDs.

Michael Angstadt