Fitbit subscription create and remove using java code

Step-1:
  1. Register a Fitbit account.
  2. Now you need to create a demo app on Fitbit. For that, you need to login to (https://dev.fitbit.com/login) first using your credentials. Now you need to register an app for that you can hit this https://dev.fitbit.com/apps/new URL.
  3. Kindly find below screenshot for more understanding
  4. For subscription, you need to click on “Add a subscriber” button with a plus sign. So here you can subscribe your API with Fitbit. Here it will ask you some information like:
    1. Endpoint URL (Basically you need to put your one rest service URL which will be verified later) example: https://demoapi.com/healthData/notifications
    2. Type: You can prefer anyone but I used jsonbody in my project
    3. subscribed (This ID is a unique name so you can put anything that you want but that should be unique)
  5. Now click on the checkbox to accept Terms and Conditions.
  6. Now click on the register button.
Step-2:
In second step you need to verify the subscriberId which you just created in step1.
  1. You will see one screen as below after registration.
  2. Now as you can see verify button and verification code on the bottom of the above screenshot. So basically you need to copy that key from here and store it somewhere which we will use in our next step.
  3. Now you need to create 2 REST API’s with the same URL which you have already given in Endpoint URL. Here both URL’s will have different request methods like @GET and @POST. Here get and post both methods will call when you will click on verify button but don’t do it right now.
@GET
@Path("/notifications")
public Response getFitBitNotification(@PathParam("version") String version,@QueryParam("verify") String verify) throws DemoException {

logger.info("<------ inside fitbit notification verify ------>");
if(verify.equals(fitBitEndPointVerificationCode))
{
logger.info("<------ fitbit subscription verify success------>");
return Response.status(Status.NO_CONTENT).build();
}
logger.info("<------ fitbit subscription verify not applied------>");
return Response.status(Status.NOT_FOUND).build();
}
You need to put your fitBitEndPointVerificationCode which you copied from Fitbit verification screen. This method will basically return with no content status code.
@POST
@Path("/notifications")
public Response getFitBitNotificationData(@Context HttpServletRequest request,@PathParam("version") String version,List notificationList) throws MangoMirrorException
{
logger.info("<------inside fitbit notification data ------>");
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable taskOne = new FitbitDataThread(notificationList);
executor.execute(taskOne);
return Response.status(Status.NO_CONTENT).build();
}
And this post method we use to get continuous updates from Fitbit if any value changes. Basically Fitbit services will call this API if any changes are done within Fitbit account data or profile. So this method will start working when we create a subscription for a particular user. Which we will do in the next step. Here is an above method I used FitBitNotificationModel which is used to get Fitbit data in a custom model.
public class FitBitNotificationModel {

private String collectionType;
private String ownerId;
private String ownerType;
private String subscriberId;
private String subscriptionId;
private String date;

//setter and getter of the above variable
}
Now you can click on verify button on Fitbit to verify your subscriber Id. Within a minute your verification will be completed and you can check it on the same page “Verify” button will be removed from there and verified the time you can see there.
Step-3:
Now we will see how we can create a subscription on Fitbit for a particular user. So that we can continuously receive his/her account updates asynchronously. Basically you need to create subscription by unique subscriptionId. So when user will provide access token and secret token to your app that time only you need to create its subscription.
Void createSubscription(String FitbitAccessToken)
{
HttpHeaders headers = new HttpHeaders();
headers.set("X-Fitbit-Subscriber-Id", fitBitSubscriberId);
headers.set("Authorization", "Bearer " +FitbitAccessToken);
HttpEntity entity = new HttpEntity<>(headers);
String subscriptionUrl = “https://api.fitbit.com/1/user/-/apiSubscriptions/1.json”
restTemplate.exchange(subscriptionUrl, HttpMethod.POST, entity, String.class);
}
In the above code, I used “1.json” in subscriptionUrl so 1 is actually unique subscriptionId for that account.
Here you need to put your fitBitSubscriberId which you created in the first step. FitbitAccessToken you can get from that user account. So when this function will be called after that subscription will be done for that particular user. Whenever data or profile change happens in that particular account, below method of yours will be called and from here you can see which category of data is modified in that account. https://www.demo.com/healthData/notifications (POST) created in step2.
If you closely observe I have used subscriptionURL in the above method. That can be used in different ways as per your requirement.
Here in 1st URL, we didn’t mention any particular category for subscription, so we will get a notification if any data is modified within these (activities, foods, sleep, body) categories.
And other subscription URL we can use if we want notification for a fixed category of data changes.
Step-4:
You can’t use same subscriptionId for multiple users account. If you try to do that you will get one ERROR Code 409 Conflict. But if you want to use same Fitbit account with other subscriptionId in that case you need to first unsubscribe existing subscriptionId then you can create a new subscription for that account. You can use below code to unsubscribe existing subscriptionId.
Void removeSubscription(String FitbitAccessToken)
{
HttpHeaders headers = new HttpHeaders();
headers.set("X-Fitbit-Subscriber-Id", fitBitSubscriberId);
headers.set("Authorization", "Bearer " +FitbitAccessToken);
HttpEntity entity = new HttpEntity<>(headers);
String subscriptionUrl = “https://api.fitbit.com/1/user/-/apiSubscriptions/1.json”
restTemplate.exchange(subscriptionUrl, HttpMethod.DELETE, entity, String.class);
}
In my next blog, I will explain how we can fetch data from Fitbit after getting a notification. I hope that this in-depth research blog can accomplish all your queries.
For subscription related details you can check their official doc on below link. https://dev.fitbit.com/build/reference/web-api/subscriptions/
If without creating any application want to check their api’s and its response you can use below link: https://dev.fitbit.com/build/reference/web-api/explore/

About Author

Gaurav Tripathi
Gaurav is a full stack developer with over 4+ years of experience with excellent knowledge in Java (Core+Advanced), Spring Boot, Angular JS and AWS Cloud services. He is very dedicated towards his work and that’s the reason he is always trying to learn new technologies to update himself. He loves to help people solving their queries in the technical aspects.
Related Posts

Leave a Comment

Why Your Outsourcing Will Fail and How This One Question Will Save Your Day?MOBILE APP OFFLINE DATA SYNCHRONIZATION – ARCHITECTURE