I created a simple SDN4 + REST API:
One endpoint, called a player, that contains a set of properties.
Each player has the property Set<Player> friends .
GET, POST, PUT, DELETE and PATCH work like charm on / player / {id}
The problem is: / player / {id} / friends.
I don’t know how to add a friend to the player, this is what I have tried so far:
curl http://localhost:8080/api/player/1/friends : { }
curl -i -X PATCH -H "Content-Type:application/json" -d '{"id":1, "name":"Player2", "password":"", "email":" player2@game.com ", "elo":1200}' http://localhost:8080/api/player/1/friends :
HTTP/1.1 204 No Content Server: Apache-Coyote/1.1 Date: Wed, 04 Nov 2015 13:03:17 GMT
curl http://localhost:8080/api/player/1/friends { }
Also tried with PUT, same result.
I also tried with POST, but I get a "method not allowed".
Here is my repository:
@RepositoryRestResource(collectionResourceRel="player", path="player") public interface PlayerRepository extends PagingAndSortingRepository<Player, Long> { Player findByid(@Param("0") long id); }
And my model:
@NodeEntity public class Player { @GraphId Long id; String name; String email; @Transient String password; int elo; @RelatedTo(type="FRIEND_WITH", direction = Direction.BOTH) Set<Player> friends; }
It seems to me that this is a simple stupid mistake, but I do not know how to fix it.
EDIT:
I tried this: $ implementation of addToSet to update array on PATCH request
And here is the result:
curl -i -X PATCH -H "Content-Type:application/json-patch+json" -d '{"op": "add", "path": "/player/2", "value":["test"]}' http://localhost:8080/api/player/1/friends HTTP/1.1 415 Unsupported Media Type Server: Apache-Coyote/1.1 Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Thu, 05 Nov 2015 11:40:31 GMT { "timestamp" : "2015-11-05T11:40:31.579+0000", "status" : 415, "error" : "Unsupported Media Type", "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException", "message" : "Content type 'application/json-patch+json' not supported", "path" : "/api/player/1/friends" }
Here is my pom.xml, just in case:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.afkgames</groupId> <artifactId>api-rest-sdn</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.7.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-neo4j</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> </dependencies> <properties> <java.version>1.8</java.version> <start-class>api.Bootstrap</start-class> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> <repository> <id>neo4j</id> <name>Neo4j</name> <url>http://m2.neo4j.org/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>