code: public final ServerResponse make_restful_post(JSONObject body, String url, String tag, String branchKey) {
          long reqStartTime = System.currentTimeMillis();
          body = body != null ? body : new JSONObject();
  
          if (!addCommonParams(body, branchKey)) {
              return new ServerResponse(tag, BranchError.ERR_BRANCH_KEY_INVALID);
          }
          PrefHelper.Debug("posting to " + url);
          PrefHelper.Debug("Post value = " + body.toString());
  
          try {
              BranchResponse response = doRestfulPost(url, body);
              return processEntityForJSON(response.responseData, response.responseCode, tag);
          } catch (BranchRemoteException branchError) {
              if (branchError.branchErrorCode == BranchError.ERR_BRANCH_REQ_TIMED_OUT) {
                  return new ServerResponse(tag, BranchError.ERR_BRANCH_REQ_TIMED_OUT);
              } else { // All other errors are considered as connectivity error
                  return new ServerResponse(tag, BranchError.ERR_BRANCH_NO_CONNECTIVITY);
              }
          } finally {
              if (Branch.getInstance() != null) {
                  int brttVal = (int) (System.currentTimeMillis() - reqStartTime);
                  Branch.getInstance().addExtraInstrumentationData(tag + "-" + Defines.Jsonkey.Branch_Round_Trip_Time.getKey(), String.valueOf(brttVal));
              }
          }
      }
docs: Method for handling the RESTful POST operations to Branch Servers. Internally calls abstract method {@link #doRestfulPost(String, JSONObject)}
  
  @param url       The url end point
  @param body      {@link JSONObject with parameters to the POST call}
  @param tag       {@link String} Tag for identifying the request for analytical or debugging purpose
  @param branchKey {@link String} Branch key
  @return {@link ServerResponse} object representing the result of RESTful POST to Branch Server