# Class OsrmRouteService

java.lang.Object
com.codename1.maps.routing.OsrmRouteService

All Implemented Interfaces:
  `RouteService`

public class OsrmRouteService extends Object implements RouteService

The keyless `RouteService` Codename One uses by default: routing over the OpenStreetMap road network through the OSRM HTTP API.

Like the OpenFreeMap basemap behind `MapView`, it needs no API key and no signup, so a road-following route works out of the box in the simulator and on device.

Before you ship: the default endpoint is OSRM's public demo server. It is provided for development and demos, has no SLA, is rate limited and may refuse long routes. For production point this service at your own OSRM instance (or any OSRM-compatible endpoint) and nothing else in your code changes:

    Routing.setService(new OsrmRouteService("https://osrm.example.com"));

On travel modes: the request URL carries the mode as OSRM's profile path component, which OSRM-compatible hosted services (Mapbox Directions and friends) use to pick a profile. A stock `osrm-routed` process does not: it serves the single dataset it was prepared and started with and ignores that part of the path. So one `OsrmRouteService` speaks to one endpoint, and that endpoint answers with whatever profile it holds -- the public demo server holds the car profile, which is why `TravelMode.WALKING` and `TravelMode.CYCLING` are accepted there but answered with driving data. To offer several modes off self-hosted OSRM, give each mode its own endpoint and pick the matching service:

    OsrmRouteService walking = new OsrmRouteService("https://osrm-foot.example.com");
    walking.findRoutes(request.setTravelMode(TravelMode.WALKING), callback);

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `DEMO_BASE_URL`
  The OSRM public demo server, used when no other base URL is configured.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `OsrmRouteService()`
  Creates a service pointing at the OSRM public demo server.
  `OsrmRouteService(String baseUrl)`
  Creates a service pointing at an OSRM-compatible endpoint, for example `https://osrm.example.com`.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `findRoutes(RouteRequest request, RouteCallback callback)`
  Routes `request` and reports the outcome to `callback`.
  `String`
  `getBaseUrl()`
  The endpoint routes are requested from, without a trailing slash.
  `String`
  `getId()`
  A short identifier for this backend, for example `"osrm"`.
  `boolean`
  `isAvailable()`
  Whether this service can route right now.
  `static List`
  `parseResponse(String json)`
  Parses an OSRM `route` service response into `Route` objects, best first.
  `OsrmRouteService`
  `setBaseUrl(String baseUrl)`
  Points this service at an OSRM-compatible endpoint.

  ### Methods inherited from class Object

  `clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### DEMO_BASE_URL

    public static final String DEMO_BASE_URL
    The OSRM public demo server, used when no other base URL is configured. Suitable for development and demos only -- see the class documentation.
    See Also:
      - Constant Field Values

- ## Constructor Details

  - ### OsrmRouteService

    public OsrmRouteService()
    Creates a service pointing at the OSRM public demo server.

  - ### OsrmRouteService

    public OsrmRouteService(String baseUrl)
    Creates a service pointing at an OSRM-compatible endpoint, for example `https://osrm.example.com`.

- ## Method Details

  - ### getBaseUrl

    public String getBaseUrl()
    The endpoint routes are requested from, without a trailing slash.

  - ### setBaseUrl

    public OsrmRouteService setBaseUrl(String baseUrl)
    Points this service at an OSRM-compatible endpoint. A `null` or empty value restores `DEMO_BASE_URL`; a trailing slash is trimmed.

  - ### getId

    public String getId()
    A short identifier for this backend, for example `"osrm"`. Used in log messages and to tell services apart.
    Specified by:
      `getId` in interface `RouteService`

  - ### isAvailable

    public boolean isAvailable()

    Whether this service can route right now. A service that needs an API key returns false until one is configured, letting callers fail fast with a clear message instead of a network error.

    Always true -- OSRM needs no credentials.

    Specified by:
      `isAvailable` in interface `RouteService`

  - ### findRoutes

    public void findRoutes(RouteRequest request, RouteCallback callback)

    Routes `request` and reports the outcome to `callback`.

    The call returns immediately; the work happens off the event dispatch thread and the callback is invoked back on it. Implementations must invoke exactly one callback method for every request, including when the request is rejected outright.

    `callback` is required -- an asynchronous call with nowhere to report its result is a mistake, not a fire-and-forget mode, so implementations reject a `null` one with `IllegalArgumentException` rather than returning quietly and leaving the caller to wonder.

    Specified by:
      `findRoutes` in interface `RouteService`

  - ### parseResponse

    public static List parseResponse(String json) throws IOException

    Parses an OSRM `route` service response into `Route` objects, best first.

    Exposed so an app that fetches from an OSRM-compatible endpoint through its own transport (a proxy, a cached response, a bundled fixture) can reuse the same parsing.

    Geometry precision: this reads geometries as `geometries=polyline`, the precision-5 encoding this service always requests. A response fetched with `geometries=polyline6` decodes ten times off through here; decode those yourself with `PolylineCodec.decode(String, int)` at precision 6.

    ###### Parameters

    - `json`: the raw response body

    ###### Returns

    the routes found, never empty

    ###### Throws

    - `IOException`: when the body is malformed -- unparseable, or holding a route, leg or step that is not a JSON object -- or when OSRM reported that it could not route the request. Malformed input never escapes as an unchecked exception, so catching this is enough.
    Throws:
      `IOException`