code: public String exec(String apiPath, String method, String query, Object payload, boolean needAuth)
  			throws IOException {
  		if (payload == null)
  			payload = "";
  
  		String responseText = null;
  
  		boolean cached = false;
  		if (cacheManager != null) {
  			responseText = cacheManager.getCache(apiPath, method, query, payload);
  			if (responseText != null)
  				cached = true;
  		}
  
  		if (responseText == null)
  			try {
  				responseText = execInternal(method, query, payload, needAuth);
  			} catch (OvhException e0) {
  				throw e0;
  			} catch (OvhServiceException e0) {
  				throw e0;
  			} catch (SocketTimeoutException e1) {
  				log.error("calling {} {} Failed by timeout. (ConnectTimeout:{} ReadTimeout:{})", method, query,
  						config.getConnectTimeout(), config.getReadTimeout());
  				responseText = execInternal(method, query, payload, needAuth);
  			} catch (IOException e2) {
  				log.error("API OVH IOException", e2);
  				throw e2;
  			}
  		if (cacheManager != null && !cached)
  			cacheManager.setCache(apiPath, method, query, payload, responseText);
  
  		if (mtdHandler != null) {
  			for (String mtd : new String[] { method, "ALL" }) {
  				TreeMap<String, OphApiHandler> handlers = null;
  				OphApiHandler handler = null;
  				handlers = mtdHandler.get(mtd);
  				if (handlers == null)
  					continue;
  				handler = handlers.get(apiPath);
  				if (handler == null)
  					continue;
  				try {
  					handler.accept(method, method, payload, responseText);
  				} catch (Exception e) {
  					log.warn("Handler throw exeption on {} {} : {}", method, method, e);
  				}
  			}
  		}
  		return responseText;
  	}
docs: Call REST entry point and handle errors
  
  @param method
  @param query
  @param payload
  @param needAuth
  @return Full response as String
  @throws IOException