{"id":2484,"date":"2022-02-24T09:53:15","date_gmt":"2022-02-24T14:53:15","guid":{"rendered":"https:\/\/michaelrowe01.com\/?p=2484"},"modified":"2022-12-15T06:45:59","modified_gmt":"2022-12-15T11:45:59","slug":"beginning-api-discovery-or-understanding-the-rootservices-document","status":"publish","type":"post","link":"https:\/\/michaelrowe01.com\/index.php\/day-job\/ibm-elm\/beginning-api-discovery-or-understanding-the-rootservices-document\/","title":{"rendered":"Beginning API Discovery (or understanding the RootServices document)"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"910\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=660%2C910&#038;ssl=1\" alt=\"\" class=\"wp-image-2490\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=743%2C1024&amp;ssl=1 743w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=218%2C300&amp;ssl=1 218w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=768%2C1059&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=1114%2C1536&amp;ssl=1 1114w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?resize=1486%2C2048&amp;ssl=1 1486w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?w=1320&amp;ssl=1 1320w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-9.png?w=1980&amp;ssl=1 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption><br>Photo by <a href=\"https:\/\/unsplash.com\/@felix_mittermeier?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noreferrer noopener\">Felix Mittermeier<\/a> on <a href=\"https:\/\/unsplash.com\/s\/photos\/tree-with-roots?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noreferrer noopener\">Unsplash<\/a><\/figcaption><\/figure>\n\n\n\n<p>Now that we\u2019ve covered some of the basics on what we mean when we say APIs (link to prior post), it\u2019s time to get into the power of ELM thru its API discovery process.<\/p>\n\n\n\n<p>Many of the APIs on a server are exposed thru API calls.&nbsp; The foundation of this discovery mechanism is the \u201cRootServices\u201d document of the ELM application.&nbsp; Each ELM application has its own RootServices document. I\u2019ll be focusing on four of the ELM applications, specifically:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.ibm.com\/products\/engineering-lifecycle-management\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"JTS\">JTS<\/a> &#8211; Jazz Team Server<\/li><li><a href=\"https:\/\/www.ibm.com\/products\/ibm-engineering-workflow-management\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"CCM\">CCM<\/a> &#8211; Configuration and Change Management &#8211; AKA &#8211; Engineering Workflow Management<\/li><li><a href=\"https:\/\/www.ibm.com\/products\/ibm-engineering-test-management\" target=\"_blank\" rel=\"noreferrer noopener\">QM<\/a> &#8211; Quality Management &#8211; AKA &#8211; Engineering Test Management<\/li><li><a href=\"https:\/\/www.ibm.com\/products\/requirements-management\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"RM\">RM<\/a> &#8211; Requirements Management &#8211; AKA Engineering Requirements Management or DOORS Next<\/li><\/ul>\n\n\n\n<p>For the purpose of this series of blog posts, I will be using a locally hosted server named <a href=\"https:\/\/elmwb.com\">https:\/\/elmwb.com<\/a> on port 9443. You will need to replace this server name and port with the server information of your own.<\/p>\n\n\n\n<p>The RootServices API is publicly addressable; it doesn\u2019t require any authentication.\u00a0 The reason behind this is to ensure that you can discover the services for authentication, and so that servers can query each other regarding what services are available.\u00a0 Most APIs that are exposed in the RootServices do require authentication. \u00a0 I will have two separate blog posts which all address authentication, one covering OAuth1.0a and one covering the use of a Bearer token.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"451\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-10.png?resize=660%2C451&#038;ssl=1\" alt=\"\" class=\"wp-image-2491\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-10.png?resize=1024%2C699&amp;ssl=1 1024w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-10.png?resize=300%2C205&amp;ssl=1 300w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-10.png?resize=768%2C524&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-10.png?w=1316&amp;ssl=1 1316w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption>RootServices API<\/figcaption><\/figure>\n\n\n\n<p>The API for accessing the RootServices document is simply:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET https:\/\/&lt;&lt;SERVER>>\/&lt;&lt;APPLICATION>>\/rootservices<\/code><\/pre>\n\n\n\n<p>The API also requires you to include at least one of the following headers in order to define the format of the RootServices document:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\taccept:application\/rdf+xml\n\taccept:application\/json\n\taccept:text\/turtle<\/code><\/pre>\n\n\n\n<p>If you use CURL the API call would be:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --location --request GET \u2018https:\/\/elmwb.com:9443\/rm\/rootservices' \\\n\t--header 'accept: application\/rdf+xml'<\/code><\/pre>\n\n\n\n<p>The flexibility of the response body allows you to introspect the contents in an appropriate manner for your specific needs.\u00a0 One key difference to note in the formats is that both RDF and Turtle formats provide descriptors to simplify the contents; json does not have descriptors.\u00a0 In RDF, these descriptors are identified with \u201cxmlns\u201d (or xml name space), while in turtle they are identified with @prefix.\u00a0 Understanding the rest of the differences between these formats is up to you. More information can be found at:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Turtle (link &#8211; <a href=\"https:\/\/www.w3.org\/TR\/turtle\/\">https:\/\/www.w3.org\/TR\/turtle\/<\/a>) \u00a0<\/li><li>RDF (link &#8211; <a href=\"https:\/\/www.w3.org\/RDF\/\">https:\/\/www.w3.org\/RDF\/<\/a>)<\/li><\/ul>\n\n\n\n<p>The following images show the beginning of the RootServices document in the above three formats:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"526\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?resize=660%2C526&#038;ssl=1\" alt=\"\" class=\"wp-image-2493\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?resize=1024%2C816&amp;ssl=1 1024w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?resize=300%2C239&amp;ssl=1 300w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?resize=768%2C612&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?resize=1536%2C1224&amp;ssl=1 1536w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?w=1642&amp;ssl=1 1642w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-12.png?w=1320&amp;ssl=1 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption>application\/rdf+xml<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"524\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?resize=660%2C524&#038;ssl=1\" alt=\"\" class=\"wp-image-2494\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?resize=1024%2C813&amp;ssl=1 1024w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?resize=300%2C238&amp;ssl=1 300w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?resize=768%2C610&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?resize=1536%2C1220&amp;ssl=1 1536w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?w=1622&amp;ssl=1 1622w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-13.png?w=1320&amp;ssl=1 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption>application\/json<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"459\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?resize=660%2C459&#038;ssl=1\" alt=\"\" class=\"wp-image-2495\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?resize=1024%2C712&amp;ssl=1 1024w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?resize=300%2C209&amp;ssl=1 300w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?resize=768%2C534&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?resize=1536%2C1068&amp;ssl=1 1536w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?w=1662&amp;ssl=1 1662w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-14.png?w=1320&amp;ssl=1 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption>text\/turtle<\/figcaption><\/figure>\n\n\n\n<p>Let\u2019s look at the overall structure and content of the RootServices document and how it will help us for future APIs.\u00a0 I will be using the rdf+xml format for the rest of this post.<\/p>\n\n\n\n<p>There are three major sections in the RootServices document:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Name Spaces &#8211; the name spaces identify the domain and\/or process that governs a specific resource.\u00a0 Each name space is provided with a short identifier which is used as a prefix for defining the full URI which describes a resource.\u00a0 For example the identifier xmlns:dc describes the \u201cDublin Core\u201d term as defined at \u201c<a href=\"http:\/\/purl.org\/dc\/terms\/\">http:\/\/purl.org\/dc\/terms\/<\/a>&#8220;.\u00a0 This prefix is then used in the definition of resource called &lt;dc:title>.\u00a0 The full definition of the title can be found at <a href=\"http:\/\/purl.org\/dc\/terms#title\">http:\/\/purl.org\/dc\/terms#title<\/a> .<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"272\" src=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-15.png?resize=660%2C272&#038;ssl=1\" alt=\"\" class=\"wp-image-2496\" srcset=\"https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-15.png?resize=1024%2C422&amp;ssl=1 1024w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-15.png?resize=300%2C124&amp;ssl=1 300w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-15.png?resize=768%2C316&amp;ssl=1 768w, https:\/\/i0.wp.com\/michaelrowe01.com\/wp-content\/uploads\/2022\/02\/image-15.png?w=1156&amp;ssl=1 1156w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption>Dublin Core term example<\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li><em>Understanding the details about \u201cDublin Core\u201d is not critical to the understanding of the RootServices document; it provides a simple way of explaining the name space concept. If you want learn more about \u201cDublin Core\u201d you can check out their website at\u00a0<\/em><a href=\"https:\/\/dublincore.org\/\"><em>https:\/\/dublincore.org<\/em><\/a><em>.<\/em><\/li><\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>Comments &#8211; In the rdf+xml format these lines are identified as &lt;!\u2014 \u2014> and are informational only.<\/li><\/ol>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\"><li>Resources &#8211; This section describes the name spaces for the server. By placing the service in this RootServices document this can be considered public APIs.\u00a0 The name space prefix defined earlier in the RootServices document can provide you context about which aspect of the server the specific service addresses.\u00a0 Some general guidelines include:<\/li><\/ol>\n\n\n\n<ul class=\"has-small-font-size wp-block-list\"><li>jd = Jazz Discovery<\/li><li>jfs = Jazz Foundation\u00a0<\/li><li>jdb = Jazz Dashboard<\/li><li>ju = Jazz UI elements<\/li><li>jp06 = Jazz Process (release 0.6)<\/li><li>jp = Jazz Process (release 1.0)<\/li><li>oslc = Open Services for Lifecycle Collaboration &#8211; this is the Oasis based standard for services across lifecycle based applications.\u00a0 ELM is both a provider and consumer of OSLC services.\u00a0 For more information on OSLC and Oasis see: <a href=\"https:\/\/open-services.net\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/open-services.net<\/a> and <a href=\"https:\/\/www.oasis-open.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.oasis-open.org\/<\/a> .<\/li><li>oslc_XX = OSLC services for a specific application, for example rm = requirements management, cm = change management, etc.<\/li><li>rm = Requirements Management, these are DOORS Next specific services<\/li><li>trs = Tracked Resource Set version 1.x<\/li><li>trs2 = Tracked Resource Set version 2<\/li><\/ul>\n\n\n\n<p>A detailed (yet somewhat dated) description of the RootServices document can be found on <a href=\"https:\/\/jazz.net\" target=\"_blank\" rel=\"noreferrer noopener\">jazz.net<\/a> at <a href=\"https:\/\/jazz.net\/wiki\/bin\/view\/Main\/RootServicesSpec\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/jazz.net\/wiki\/bin\/view\/Main\/RootServicesSpec<\/a>.<\/p>\n\n\n\n<p>Next, we focus on a few key sections in the RootServices document which will help us discover more APIs as we move forward:<\/p>\n\n\n\n<p>First, after the list of name spaces, we see the Title of the server whose RootServices we are accessing and a detailed description of the server.\u00a0 They are all in the dc name space, i.e. Dublin Core.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;dc:title xml:lang=\"en\"><\/strong>Doors Next<strong>&lt;\/dc:title><\/strong>\n<strong>&lt;dc:description><\/strong>This application provides the capabilities to create and manage requirements and trace them to modeling, testing, and change and configuration management. You can define, elicit, capture, elaborate, discuss, and review requirements and supporting artifacts.<strong>&lt;\/dc:description><\/strong><\/code><\/pre>\n\n\n\n<p>Second, is a list of common services for the Jazz server and application we are on. Included in this section are those services that are necessary for authentication when using our APIs.<\/p>\n\n\n\n<p>If you are utilizing OAuth1.0a to access the APIs, you should look at the jfs services with include oauth in their name.\u00a0 On my server, the following services are exposed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;jfs:oauthDomain><\/strong>https:\/\/elmwb.com:9443\/jts,https:\/\/elmwb.com:9443\/rm<strong>&lt;\/jfs:oauthDomain><\/strong>\n<strong>&lt;jfs:oauthRealmName><\/strong>Jazz<strong>&lt;\/jfs:oauthRealmName><\/strong>\n<strong>&lt;jfs:oauthAccessTokenUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/oauth-access-token\" <strong>\/><\/strong>\n<strong>&lt;jfs:oauthApprovalModuleUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/_ajax-modules\/com.ibm.team.repository.AuthorizeOAuth\" <strong>\/><\/strong>\n<strong>&lt;jfs:oauthExpireTokenUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/oauth-expire-token\" <strong>\/><\/strong>\n<strong>&lt;jfs:oauthRequestConsumerKeyUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/oauth-request-consumer\" <strong>\/><\/strong>\n<strong>&lt;jfs:oauthRequestTokenUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/oauth-request-token\" <strong>\/><\/strong>\n<strong>&lt;jfs:oauthUserAuthorizationUrl<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/jts\/oauth-authorize\" <strong>\/><\/strong><\/code><\/pre>\n\n\n\n<p>We see three key end points which are necessary for a OAuth1.0a process (which I will cover in detail in another blog post) &#8211; oauthAccessTokenUrl, oauthRequestTokenUrl, and oauthUserAuthorizationUrl.&nbsp; These three URLs are needed to address the three steps that a OAuth authentication that I will cover in another blog post. &nbsp;<\/p>\n\n\n\n<p>Third, is a list of application specific services.\u00a0 On our sample server, which is Doors Next application server, we see the following list of services.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>&lt;!-- Applications may add any services they provide here --><\/em>\n<strong>&lt;oslc_rm:rmServiceProviders<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/oslc_rm\/catalog\" <strong>\/><\/strong>\n<strong>    &lt;oslc_rm:majorVersion><\/strong>7<strong>&lt;\/oslc_rm:majorVersion><\/strong>\n<strong>    &lt;oslc_rm:version><\/strong>7.0.2<strong>&lt;\/oslc_rm:version><\/strong>\n<strong>    &lt;oslc_rm:buildVersion><\/strong>7.0.2<strong>&lt;\/oslc_rm:buildVersion><\/strong>\n<strong>    &lt;oslc_config:cmServiceProviders <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/oslc_config\"<strong>\/><\/strong>\n<strong>    &lt;rm:glossaryTermsQuery<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/glossary\/termslookup\" <strong>\/><\/strong>\n<strong>    &lt;rm:components<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/cm\/component\/ldpc\" <strong>\/><\/strong>\n    <strong>&lt;rm:projectAreas <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/projects\" <strong>\/><\/strong>\n<strong>    &lt;rm:cmpProjectAreas <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/rm-projects\" <strong>\/><\/strong>\n<strong>    &lt;rm:rrcExtensions><\/strong>0.1.3-0.1.5<strong>&lt;\/rm:rrcExtensions><\/strong>\n<em>&lt;!-- The admin Web UI service should be uncommented in applications -->\n<\/em><strong>    &lt;jfs:adminWebUI<\/strong> rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/admin\" <strong>\/><\/strong>\n<em>&lt;!-- The registration handler service should be uncommented for application  that do not supply their own --><\/em>\n<strong>    &lt;jd:registration <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/service\/com.ibm.team.repository.service.internal.setup.IRegistrationHandlerService\" <strong>\/><\/strong>\n<em>&lt;!--  Process Component Tracked Resource Set 2.0 Provider --><\/em>\n<strong>    &lt;rm:trackedResourceSetProvider><\/strong>\n<strong>        &lt;trs2:TrackedResourceSet><\/strong>\n<strong>            &lt;trs2:trackedResourceSet <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process-trs2\" <strong>\/><\/strong>\n<strong>            &lt;dc:title><\/strong>TRS 2.0 for DOORS Next Process Resources<strong>&lt;\/dc:title><\/strong>\n<strong>            &lt;dc:description><\/strong>TRS 2.0 feed for process resources in DOORS Next<strong>&lt;\/dc:description><\/strong>\n<strong>            &lt;dc:type <\/strong>    rdf:resource=\"http:\/\/jazz.net\/ns\/process#\" <strong>\/><\/strong>\n<strong>            &lt;oslc:domain <\/strong>rdf:resource=\"http:\/\/jazz.net\/ns\/process#\" <strong>\/><\/strong>\n<strong>        &lt;\/trs2:TrackedResourceSet><\/strong>\n<strong>    &lt;\/rm:trackedResourceSetProvider><\/strong>\n<em>&lt;!-- End of application-specific services --><\/em><\/code><\/pre>\n\n\n\n<p>As you can see this server has OSLC and RM specific services.&nbsp; We also see that this server is a TRS 2.0 provider.&nbsp;<\/p>\n\n\n\n<p>Key for our discovery of APIs, we would want to look at the oslc:rmServiceProviders.&nbsp; A GET to this API will provide us with a catalog of those objects that provide services.&nbsp; In the case of this server it will be a catalog of the Project areas on our server, along with the services they provide.<\/p>\n\n\n\n<p>Let\u2019s do a quick GET call to the API identified in oslc:rmServiceProviders.\u00a0 If you are trying this via a browser, you will get prompted for a log in, this tells us that the API needs to be authenticated.\u00a0 Go ahead and log in and look at the results.\u00a0 On my server I have setup three Project areas, and it will provide us with the following response:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;rdf:RDF<\/strong>\n <strong>xmlns:rdf<\/strong>=\"http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#\"\n<strong> xmlns:dcterms<\/strong>=\"http:\/\/purl.org\/dc\/terms\/\"\n <strong>xmlns:jp<\/strong>=\"http:\/\/jazz.net\/xmlns\/prod\/jazz\/process\/1.0\/\"\n <strong>xmlns:jazzDisc<\/strong>=\"http:\/\/jazz.net\/ns\/discovery#\"\n <strong>xmlns:oslc<\/strong>=\"http:\/\/open-services.net\/ns\/core#\">\n\n <strong>&lt;oslc:ServiceProviderCatalog <\/strong>rdf:about=\"https:\/\/elmwb.com:9443\/rm\/oslc_rm\/catalog\">\n    <strong>&lt;dcterms:title <\/strong>rdf:parseType=\"Literal\">RMCatalog<strong>&lt;\/dcterms:title><\/strong>\n    <strong>&lt;dcterms:publisher <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/application-about\"<strong> \/><\/strong>\n    <strong>&lt;oslc:domain<\/strong> rdf:resource=\"http:\/\/open-services.net\/ns\/rm#\" <strong>\/><\/strong>\n    <strong>&lt;oslc:serviceProvider><\/strong>\n      <strong>&lt;oslc:ServiceProvider <\/strong>rdf:about=\"https:\/\/elmwb.com:9443\/rm\/oslc_rm\/_LgdUMIkaEey3TMAARolZjw\/services.xml\">\n         <strong>&lt;dcterms:title<\/strong> rdf:parseType=\"Literal\">JKE Banking (Requirements Management)<strong>&lt;\/dcterms:title><\/strong>\n         <strong>&lt;jazzDisc:messageReceiver <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/web\/com\/ibm\/rdm\/web\/copyReceiver\/CopyHandler.html\"<strong>\/><\/strong>\n         <strong>&lt;jp:consumerRegistry <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_LgdUMIkaEey3TMAARolZjw\/links\"<strong>\/><\/strong>\n         <strong>&lt;oslc:details <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_LgdUMIkaEey3TMAARolZjw\"<strong>\/><\/strong>\n      <strong>&lt;\/oslc:ServiceProvider><\/strong>\n    <strong>&lt;\/oslc:serviceProvider><\/strong>\n    <strong>&lt;oslc:serviceProvider><\/strong>\n      <strong>&lt;oslc:ServiceProvider <\/strong>rdf:about=\"https:\/\/elmwb.com:9443\/rm\/oslc_rm\/_VoWUwIkbEey3TMAARolZjw\/services.xml\">\n         <strong>&lt;dcterms:title<\/strong> rdf:parseType=\"Literal\">Sample Project 1 (Requirements)<strong>&lt;\/dcterms:title><\/strong>\n         <strong>&lt;jazzDisc:messageReceiver <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/web\/com\/ibm\/rdm\/web\/copyReceiver\/CopyHandler.html\"\/>\n         <strong>&lt;jp:consumerRegistry <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_VoWUwIkbEey3TMAARolZjw\/links\"\/>\n         <strong>&lt;oslc:details <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_VoWUwIkbEey3TMAARolZjw\"\/>\n       <strong>&lt;\/oslc:ServiceProvider><\/strong>\n    <strong>&lt;\/oslc:serviceProvider><\/strong>\n<strong>    &lt;oslc:serviceProvider><\/strong>\n    <strong>&lt;oslc:ServiceProvider <\/strong>rdf:about=\"https:\/\/elmwb.com:9443\/rm\/oslc_rm\/_BVnHAImtEeyjbIIiaev_dg\/services.xml\">\n       <strong>&lt;dcterms:title<\/strong> rdf:parseType=\"Literal\">Title test&lt;\/dcterms:title>\n       <strong>&lt;jazzDisc:messageReceiver <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/web\/com\/ibm\/rdm\/web\/copyReceiver\/CopyHandler.html\"\/>\n       <strong>&lt;jp:consumerRegistry <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_BVnHAImtEeyjbIIiaev_dg\/links\"\/>\n       <strong>&lt;oslc:details <\/strong>rdf:resource=\"https:\/\/elmwb.com:9443\/rm\/process\/project-areas\/_BVnHAImtEeyjbIIiaev_dg\"\/>\n<strong>    &lt;\/oslc:ServiceProvider><\/strong>\n <strong> &lt;\/oslc:serviceProvider><\/strong>\n<strong>&lt;\/oslc:ServiceProviderCatalog>\n&lt;\/rdf:RDF><\/strong><\/code><\/pre>\n\n\n\n<p>I am not going to go through all the details right now, but just realize we have a list of all the project areas (or Service Providers) on this server.\u00a0 We can actually execute a GET against a specific project area to get a list of supported services for that Project area.\u00a0 This can be found in the <strong>&lt;oslc:ServiceProvider ><\/strong> section.\u00a0 But that\u2019s for another blog post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Now that we\u2019ve covered some of the basics on what we mean when we say APIs (link to prior post), it\u2019s time to get into the power of ELM thru its API discovery process. Many of the APIs on a server are exposed thru API calls.&nbsp; The foundation of this discovery mechanism is the \u201cRootServices\u201d [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_wp_convertkit_post_meta":{"form":"-1","landing_page":"0","tag":"0","restrict_content":"0"},"hide_page_title":"","footnotes":""},"categories":[597],"tags":[575,579,576,609,611,580,610],"class_list":["post-2484","post","type-post","status-publish","format-standard","hentry","category-ibm-elm","tag-api","tag-elm","tag-oslc","tag-rdf","tag-rm","tag-rootservices","tag-turtle"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/posts\/2484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/comments?post=2484"}],"version-history":[{"count":1,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/posts\/2484\/revisions"}],"predecessor-version":[{"id":2497,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/posts\/2484\/revisions\/2497"}],"wp:attachment":[{"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/media?parent=2484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/categories?post=2484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaelrowe01.com\/index.php\/wp-json\/wp\/v2\/tags?post=2484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}