在 SDN4 + REST 中添加与另一个节点的关系
Add relation to another node in SDN4 + REST
我构建了一个简单的 SDN4 + REST API:
一个名为 player 的端点,其中包含一组属性。
每个玩家有一个 Set<Player> friends
属性.
GET、POST、PUT、DELETE 和 PATCH 在 /player/{id}
上运行良好
这里的问题是/player/{id}/friends.
我不知道如何向玩家添加好友,这是我目前尝试过的方法:
- 测试前:
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
{ }
也尝试了 PUT,结果相同。
我也尝试过 POST,但我得到了 "method not allowed"。
这是我的存储库:
@RepositoryRestResource(collectionResourceRel="player", path="player")
public interface PlayerRepository extends PagingAndSortingRepository<Player, Long> {
Player findByid(@Param("0") long id);
}
还有我的模特:
@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;
}
我觉得这是一个简单的愚蠢错误,但我找不到解决方法。
编辑:
我试过这个:$addToSet implementation for array update on PATCH request
结果如下:
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"
}
这是我的 pom.xml,以防万一:
<?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>
到处寻找解决方案后,我找到了。
您可以使用 POST
和 Content-Type : text/uri-list
仅在 spring-starter-parent 1.3.0+ 中添加项目.
这里有一个 cUrl 的例子:
curl -i -X POST -H 'Content-type: text/uri-list' -d 'localhost:8080/api/player/1' http://localhost:8080/api/player/0/friends
这会将玩家 1 添加为玩家 0 的好友。
我构建了一个简单的 SDN4 + REST API:
一个名为 player 的端点,其中包含一组属性。
每个玩家有一个 Set<Player> friends
属性.
GET、POST、PUT、DELETE 和 PATCH 在 /player/{id}
上运行良好这里的问题是/player/{id}/friends.
我不知道如何向玩家添加好友,这是我目前尝试过的方法:
- 测试前:
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
{ }
也尝试了 PUT,结果相同。
我也尝试过 POST,但我得到了 "method not allowed"。
这是我的存储库:
@RepositoryRestResource(collectionResourceRel="player", path="player")
public interface PlayerRepository extends PagingAndSortingRepository<Player, Long> {
Player findByid(@Param("0") long id);
}
还有我的模特:
@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;
}
我觉得这是一个简单的愚蠢错误,但我找不到解决方法。
编辑:
我试过这个:$addToSet implementation for array update on PATCH request
结果如下:
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"
}
这是我的 pom.xml,以防万一:
<?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>
到处寻找解决方案后,我找到了。
您可以使用 POST
和 Content-Type : text/uri-list
仅在 spring-starter-parent 1.3.0+ 中添加项目.
这里有一个 cUrl 的例子:
curl -i -X POST -H 'Content-type: text/uri-list' -d 'localhost:8080/api/player/1' http://localhost:8080/api/player/0/friends
这会将玩家 1 添加为玩家 0 的好友。