blob: 7186ba09f64274309c026bc89517b3c155bdedee [file] [log] [blame]
<!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>