<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.8.1 
 | Rendered using Apache Maven Fluido Skin 1.6
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="author" content="Olivier Lamy" />
    <meta name="Date-Creation-yyyymmdd" content="20111005" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Archiva Documentation &#x2013; Using REST Services</title>
    <link rel="stylesheet" href="../../css/apache-maven-fluido-1.6.min.css" />
    <link rel="stylesheet" href="../../css/site.css" />
    <link rel="stylesheet" href="../../css/print.css" media="print" />
      <script type="text/javascript" src="../../js/apache-maven-fluido-1.6.min.js"></script>
      <!-- Google Analytics -->
    <script type="text/javascript">
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-140879-5']);
      _gaq.push(['_trackPageview']);
      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    </script>
      </head>
    <body class="topBarDisabled">
                      <a href="https://github.com/apache/archiva">
      <img style="position: absolute; top: 0; right: 0; border: 0; z-index: 10000;"
        src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png"
        alt="Fork me on GitHub">
    </a>
      <div class="container-fluid">
      <div id="banner">
        <div class="pull-left"><a href="http://archiva.apache.org/" id="bannerLeft"><img src="http://archiva.apache.org/images/archiva.png"  alt="Apache Archiva"/></a></div>
        <div class="pull-right"><a href="http://www.apache.org/" id="bannerRight"><img src="https://www.apache.org/images/asf_logo_wide_2016.png"  alt="Apache Software Foundation"/></a></div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li class=""><a href="https://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../../../../index.html" title="Archiva">Archiva</a><span class="divider">/</span></li>
      <li class=""><a href="../../index.html" title="Archiva Documentation">Archiva Documentation</a><span class="divider">/</span></li>
    <li class="active ">Using REST Services</li>
        <li id="publishDate" class="pull-right"><span class="divider">|</span> Last Published: 2019-11-30</li>
          <li id="projectVersion" class="pull-right">Version: 3.0.0-SNAPSHOT</li>
        </ul>
      </div>
      <div class="row-fluid">
        <div id="leftColumn" class="span2">
          <div class="well sidebar-nav">
<ul class="nav nav-list">
          <li class="nav-header">Introduction</li>
    <li><a href="../../quick-start.html" title="Quick Start"><span class="none"></span>Quick Start</a>  </li>
    <li><a href="../../tour/index.html" title="Feature Tour"><span class="none"></span>Feature Tour</a>  </li>
    <li><a href="../../release-notes.html" title="Release Notes"><span class="none"></span>Release Notes</a>  </li>
    <li><a href="../../../../download.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
          <li class="nav-header">Users Guide</li>
    <li><a href="../../userguide/browsing.html" title="Browsing"><span class="none"></span>Browsing</a>  </li>
    <li><a href="../../userguide/searching.html" title="Searching"><span class="none"></span>Searching</a>  </li>
    <li><a href="../../userguide/delete-artifact.html" title="Deleting an Artifact"><span class="none"></span>Deleting an Artifact</a>  </li>
    <li><a href="../../userguide/using-repository.html" title="Using as a repository"><span class="none"></span>Using as a repository</a>  </li>
    <li><a href="../../userguide/deploy.html" title="Deploying to repository"><span class="none"></span>Deploying to repository</a>  </li>
    <li><a href="../../userguide/virtual-repositories.html" title="Configuring Virtual Repositories"><span class="none"></span>Configuring Virtual Repositories</a>  </li>
    <li><a href="../../userguide/rss.html" title="Rss Feeds in Archiva"><span class="none"></span>Rss Feeds in Archiva</a>  </li>
    <li><a href="../../userguide/querying-artifacts.html" title="Querying Artifacts"><span class="none"></span>Querying Artifacts</a>  </li>
          <li class="nav-header">Administrators Guide</li>
    <li><a href="../../adminguide/installing.html" title="Installing Archiva"><span class="icon-chevron-right"></span>Installing Archiva</a>  </li>
    <li><a href="../../adminguide/databases.html" title="Databases"><span class="none"></span>Databases</a>  </li>
    <li><a href="../../adminguide/repositories-content-storage.html" title="Repositories Content Storage"><span class="none"></span>Repositories Content Storage</a>  </li>
    <li><a href="../../adminguide/security.html" title="Security"><span class="icon-chevron-right"></span>Security</a>  </li>
    <li><a href="../../adminguide/configuration.html" title="Archiva Configuration"><span class="icon-chevron-right"></span>Archiva Configuration</a>  </li>
    <li class="active"><a href="#"><span class="none"></span>REST Apis</a>
  </li>
    <li><a href="../../adminguide/configuration-files.html" title="Configuration Files"><span class="none"></span>Configuration Files</a>  </li>
    <li><a href="../../adminguide/system-status.html" title="System Status"><span class="none"></span>System Status</a>  </li>
    <li><a href="../../adminguide/logging.html" title="Log Files"><span class="icon-chevron-right"></span>Log Files</a>  </li>
    <li><a href="../../adminguide/reports.html" title="Reports"><span class="none"></span>Reports</a>  </li>
          <li class="nav-header">Customising Archiva</li>
    <li><a href="../../customising/writing-consumer.html" title="Writing a Consumer Plugin"><span class="none"></span>Writing a Consumer Plugin</a>  </li>
          <li class="nav-header">More Information</li>
    <li><a href="https://cwiki.apache.org/confluence/display/ARCHIVA/Index" class="externalLink" title="Archiva Wiki"><span class="none"></span>Archiva Wiki</a>  </li>
          <li class="nav-header">ASF</li>
    <li><a href="https://www.apache.org/foundation/how-it-works.html" class="externalLink" title="How Apache Works"><span class="none"></span>How Apache Works</a>  </li>
    <li><a href="https://www.apache.org/foundation/" class="externalLink" title="Foundation"><span class="none"></span>Foundation</a>  </li>
    <li><a href="https://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsoring Apache"><span class="none"></span>Sponsoring Apache</a>  </li>
    <li><a href="https://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a>  </li>
          <li class="nav-header">Project Documentation</li>
    <li><a href="../../project-info.html" title="Project Information"><span class="icon-chevron-right"></span>Project Information</a>  </li>
  </ul>
<form id="search-form" action="https://www.google.com/search" method="get" >
      <input value="https://archiva.apache.org/docs/3.0.0-SNAPSHOT/" name="sitesearch" type="hidden"/>
  <input class="search-query" name="q" id="query" type="text" />
</form>
<script type="text/javascript">asyncJs( 'https://cse.google.com/brand?form=search-form' )</script>
          <hr />
          <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
                          <div id="twitter">
        <a href="https://twitter.com/archiva" class="twitter-follow-button" data-show-count="false" data-align="left" data-size="medium" data-show-screen-name="true" data-lang="en">Follow archiva</a>
    <script type="text/javascript">!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
        </div>
                  <div class="clear"></div>
              <div class="clear"></div>
  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../../images/logos/maven-feather.png" /></a>
              </div>
          </div>
        </div>
        <div id="bodyColumn"  class="span10" >
<div class="section">
<h2><a name="Using_REST_Services"></a>Using REST Services</h2>
<p>Starting version 1.4, you can use some REST Services to manage your Apache Archiva instance and Search artifacts. All samples here will use Apache CXF REST client API. By the way you can use some others REST client frameworks. NOTE: a wadl is available in your Archiva instance : http(s)://ip:port/../restServices/application.wadl</p>
<ul>
<li>Archiva REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-rest-api/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-rest-api/index.html</a></li>
<li>Archiva UI REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-ui/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-ui/index.html</a></li>
<li>Redback REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-redback-rest-api/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-redback-rest-api/index.html</a></li></ul>
<div class="section">
<h3><a name="Security_related_information"></a>Security related information</h3>
<p>Starting with version 2.2.2 we added HTTP verification techniques to avoid cross site request forgery attacks. The updating services check Origin and Referer header and use a token provided by the login service. If you use the webservices with a native client that is no browser or want to allow requests from different origin URLs you have to change the configuration. For further information see the <a href="/redback/integration/rest.html">Redback REST documentation</a></p></div>
<div class="section">
<h3><a name="Search_Service"></a>Search Service</h3>
<p>Authentication headers for connect to your Archiva instance :</p>
<div class="source"><pre class="prettyprint">    // guest with an empty password
    public static String guestAuthzHeader =
        &quot;Basic &quot; + org.apache.cxf.common.util.Base64Utility.encode( ( &quot;guest&quot; + &quot;:&quot; ).getBytes() );

    // with an other login/password
    //public String authzHeader =
    //    &quot;Basic &quot; + org.apache.cxf.common.util.Base64Utility.encode( ( &quot;login&quot; + &quot;:password&quot; ).getBytes() );

</pre></div>
<p>Get a Search Service Client :</p>
<div class="source"><pre class="prettyprint">SearchService service =
    JAXRSClientFactory.create( getBaseUrl() + &quot;/&quot; + getRestServicesPath() + &quot;/archivaServices/&quot;,
                               SearchService.class,
                               Collections.singletonList( new JacksonJaxbJsonProvider() ) );
// to add authentification
if ( authzHeader != null )
{
    WebClient.client( service ).header( &quot;Authorization&quot;, authzHeader );
}
// Set the Referer header to your archiva server url
WebClient.client(service).header(&quot;Referer&quot;,&quot;http://localhost:&quot;+getServerPort());
// to configure read timeout
WebClient.getConfig( service ).getHttpConduit().getClient().setReceiveTimeout( 100000000 );
// if you want to use json as exchange format xml is supported too
WebClient.client( service ).accept( MediaType.APPLICATION_JSON_TYPE );
WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
return service;
</pre></div>
<p>Quick Search</p>
<div class="source"><pre class="prettyprint">List&lt;Artifact&gt; artifacts = searchService.quickSearch( &quot;commons-logging&quot; );
// return all artifacts with groupId OR artifactId OR version OR packaging OR className
// NOTE : only artifacts with classifier empty are returned
</pre></div>
<p>Search Artifacts Version : to search all availables version with a groupId and artifactId and packaging (if empty jar is used)</p>
<div class="source"><pre class="prettyprint">        SearchService searchService = getSearchService( authorizationHeader );

        List&lt;Artifact&gt; artifacts = searchService.getArtifactVersions( &quot;commons-logging&quot;, &quot;commons-logging&quot;, &quot;jar&quot; );

</pre></div>
<p>Search Service with a classifier :</p>
<div class="source"><pre class="prettyprint">        SearchRequest searchRequest = new SearchRequest();
        searchRequest.setGroupId( &quot;commons-logging&quot; );
        searchRequest.setArtifactId( &quot;commons-logging&quot; );
        searchRequest.setClassifier( &quot;sources&quot; );

        List&lt;Artifact&gt; artifacts = searchService.searchArtifacts( searchRequest );
</pre></div>
<p>Search Service with a classifier :</p>
<div class="source"><pre class="prettyprint">        SearchRequest searchRequest = new SearchRequest();
        searchRequest.setGroupId( &quot;commons-logging&quot; );
        searchRequest.setArtifactId( &quot;commons-logging&quot; );
        searchRequest.setClassifier( &quot;sources&quot; );

        List&lt;Artifact&gt; artifacts = searchService.searchArtifacts( searchRequest );
</pre></div>
<p>Copy Artifact from a repository to an other one :</p>
<p>For some reasons you want to use a test repository before moving your artifacts to a repository used by final users. To achieve this, you can use a service which can copy an artifact from a repository to an other one</p>
<div class="source"><pre class="prettyprint">// configure the artifact you want to copy
// if package ommited default will be jar
ArtifactTransferRequest artifactTransferRequest = new ArtifactTransferRequest();
artifactTransferRequest.setGroupId( &quot;org.apache.karaf.features&quot; );
artifactTransferRequest.setArtifactId( &quot;org.apache.karaf.features.core&quot; );
artifactTransferRequest.setVersion( &quot;2.2.2&quot; );
artifactTransferRequest.setRepositoryId( SOURCE_REPO_ID );
artifactTransferRequest.setTargetRepositoryId( TARGET_REPO_ID );
// retrieve the service
RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader );
// copy the artifact
Boolean res = repositoriesService.copyArtifact( artifactTransferRequest );
</pre></div>
<p>To know all the possible options, you can refer to the javadoc of SearchRequest class.</p></div>
<div class="section">
<h3><a name="Browse_Service"></a>Browse Service</h3>
<p>Get a Browse Service Client :</p>
<div class="source"><pre class="prettyprint">        BrowseService service =
            JAXRSClientFactory.create( getBaseUrl() + &quot;/&quot; + getRestServicesPath() + &quot;/archivaServices/&quot;,
                                       BrowseService.class,
                                       Collections.singletonList( new JacksonJaxbJsonProvider() ) );
        // to add authentification
        if ( authzHeader != null )
        {
            WebClient.client( service ).header( &quot;Authorization&quot;, authzHeader );
        }
        // Set the Referer header to your archiva server url
        WebClient.client(service).header(&quot;Referer&quot;,&quot;http://localhost:&quot;+getServerPort());

        WebClient.getConfig( service ).getHttpConduit().getClient().setReceiveTimeout( 100000000 );
        if ( useXml )
        {
            WebClient.client( service ).accept( MediaType.APPLICATION_XML_TYPE );
            WebClient.client( service ).type( MediaType.APPLICATION_XML_TYPE );
        }
        else
        {
            WebClient.client( service ).accept( MediaType.APPLICATION_JSON_TYPE );
            WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
        }
        return service;
</pre></div>
<p>Get artifacts based on project version metadata, generic metadata added previously in Archiva :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        browseService.addMetadata( &quot;commons-cli&quot;, &quot;commons-cli&quot;, &quot;1.0&quot;, &quot;wine&quot;, &quot;bordeaux&quot;, TEST_REPO_ID );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.getArtifactsByProjectVersionMetadata( &quot;wine&quot;, &quot;bordeaux&quot;, TEST_REPO_ID );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 3 );
</pre></div>
<p>Get artifacts based on the artifact properties :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        List&lt;Artifact&gt; artifactDownloadInfos = browseService.getArtifactsByMetadata( &quot;type&quot;, &quot;pom&quot;, TEST_REPO_ID );

        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 11 );
</pre></div>
<p>Get artifacts based on the project properties from POM :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.getArtifactsByProperty( &quot;org.name&quot;, &quot;The Apache Software Foundation&quot;, TEST_REPO_ID );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
</pre></div>
<p>Searching by properties and metadata :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        List&lt;Artifact&gt; artifactDownloadInfos =
            browseService.searchArtifacts( &quot;org.name&quot;, &quot;The Apache Software Foundation&quot;, TEST_REPO_ID, true );

        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
</pre></div>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.searchArtifacts( &quot;The Apache Software Foundation&quot;, TEST_REPO_ID, true );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
        } );
</pre></div>
<p>Get Search</p>
<div class="source"><pre class="prettyprint">List&lt;Artifact&gt; artifacts = searchService.quickSearch( &quot;commons-logging&quot; );
// return all artifacts with groupId OR artifactId OR version OR packaging OR className
// NOTE : only artifacts with classifier empty are returned
</pre></div>
<p>Dependencies to add in order to use those REST Services</p>
<div class="source"><pre class="prettyprint">      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-jaxrs-json-provider&lt;/artifactId&gt;
        &lt;version&gt;${jacksonVersion}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-jaxrs-xml-provider&lt;/artifactId&gt;
        &lt;version&gt;${jacksonVersion}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
        &lt;version&gt;${jacksonVersion}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-frontend-jaxrs&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-rs-client&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-rs-extension-providers&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.archiva&lt;/groupId&gt;
        &lt;artifactId&gt;archiva-rest-api&lt;/artifactId&gt;
        &lt;version&gt;${project.version}&lt;/version&gt;
      &lt;/dependency&gt;
</pre></div>
<p>Current versions use in Apache Archiva:</p>
<ul>
<li><tt>${project.version}</tt>: 3.0.0-SNAPSHOT</li>
<li><tt>${cxfVersion}</tt>: $<a name="cxf.version">cxf.version</a></li>
<li><tt>${jacksonVersion}</tt>: 2.3.0</li></ul></div>
<div class="section">
<h3><a name="Security_Framework_Services:"></a>Security Framework Services:</h3>
<p>You can use Redback Rest Services to control user creation/modification and add/remove roles.</p>
<p>See <a class="externalLink" href="http://archiva.apache.org/redback/integration/rest.html">http://archiva.apache.org/redback/integration/rest.html</a></p></div></div>
        </div>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
<div class="row">
      <div class="span6 offset1">Apache Archiva, Archiva, Apache, the Apache feather logo, and the Apache Archiva project logos are trademarks of The Apache Software Foundation.</div>
      </div>
      <div class="row">
        &nbsp;
      </div>
      <div class="row">
      <div class="span6 offset2">
      <p>
        <a href="https://archiva.apache.org/docs/3.0.0-SNAPSHOT/privacy-policy.html">Privacy Policy</a>
        </p>
      </div>
      </div>
        </div>
                          <div id="ohloh" class="pull-right">
      <script type="text/javascript" src="https://www.ohloh.net/p/6670/widgets/project_thin_badge.js"></script>
    </div>
        </div>
    </footer>
    </body>
</html>