grafl grafl - 3 months ago 18
reST (reStructuredText) Question

Creating Sonatype Nexus repository using REST API causes HTTP/1.1 400 Bad Request

In my attempt to create a new Sonatype Nexus hosted repository, using the REST API, I get an "HTTP/1.1 400 Bad Request". I am using a Sonatype Nexus™ 2.10.0-02, running locally.

According to the REST API documentation, available at

http://localhost:8081/nexus/nexus-restlet1x-plugin/default/docs/path__repositories.html


to create a new repository a POST request must look like this:

<?xml version="1.0" encoding="UTF-8"?>
<repository>
<data>
<format>...</format>
<providerRole>...</providerRole>
<exposed>...</exposed>
<id>...</id>
<name>...</name>
<contentResourceURI>...</contentResourceURI>
<repoType>...</repoType>
<provider>...</provider>
</data>
</repository>


So, my XML payload looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<repository>
<data>
<format>maven2</format>
<providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
<exposed>true</exposed>
<id>my-releases</id>
<name>MyReleases</name>
<contentResourceURI>http://localhost:8081/nexus/content/repositories/my-releases</contentResourceURI>
<repoType>hosted</repoType>
<provider>maven2</provider>
</data>
</repository>


and up to here (I hope) is OK.

I use cURL to POST this XML content:

curl -i -H "Accept: application/xml" -H "Content-Type: application/xml" -f -X POST -v -d "@$(pwd)/insert_oss_repository.xml" -u admin:admin123 http://localhost:8081/service/local/repositories


The complete log of this command is this:

* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8081 (#0)
* Server auth using Basic with user 'admin'
> POST /nexus/service/local/repositories HTTP/1.1
> Authorization: Basic YWRtaW46YWRtaW4xMjM=
> User-Agent: curl/7.35.0
> Host: localhost:8081
> Accept: */*
> Content-Type:application/xml
> Content-Length: 327
>
* upload completely sent off: 327 out of 327 bytes
< HTTP/1.1 400 Bad Request
< Date: Mon, 20 Oct 2014 19:19:21 GMT
* Server Nexus/2.10.0-02 is not blacklisted
< Server: Nexus/2.10.0-02
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Set-Cookie: rememberMe=deleteMe; Path=/nexus; Max-Age=0; Expires=Sun, 19-Oct-2014 19:19:21 GMT
< Content-Type: application/xml; charset=UTF-8
< Date: Mon, 20 Oct 2014 19:19:21 GMT
* Server Noelios-Restlet-Engine/1.1.6-SONATYPE-5348-V8 is not blacklisted
< Server: Noelios-Restlet-Engine/1.1.6-SONATYPE-5348-V8
< Content-Length: 183
<
<nexus-error>
<errors>
<error>
<id>*</id>
<msg>No enum const class org.sonatype.nexus.proxy.maven.RepositoryPolicy.null</msg>
</error>
</errors>
* Connection #0 to host localhost left intact
</nexus-error>


First of all, I would read your comment regarding the XML payload of my POST request. Second, if they took the time to create a sort of documentation, why don't they provide also a working example? Third, if they made this REST API available why don't they respond with a human readable answer?

Answer

It looks like there may be a bug in the documentation, you also need to provide the "repoPolicy" element. Here's an example payload:

<repository>
  <data>
    <id>my-releases-xml</id>
    <name>MyReleasesXml</name>
    <exposed>true</exposed>
    <repoType>hosted</repoType>
    <repoPolicy>RELEASE</repoPolicy>
    <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
    <provider>maven2</provider>
    <format>maven2</format>
  </data>
</repository>

In general the best approach to use with Nexus and REST is to use the JSON payloads, these are easily discoverable because the UI calls through the REST layer and sends JSON. See here for more information:

http://blog.sonatype.com/2012/07/learning-the-nexus-rest-api-read-the-docs-or-fire-up-a-browser/

Comments