- Notifications
You must be signed in to change notification settings - Fork 562
Description
Take the following Plan entity class as a demonstration:
@Data @Entity public class Plan { @Id @GeneratedValue private UUID id; private String name; @ManyToOne private Process process; @OneToMany private Set<PlanItem> items; }Single-association resource
When I try to request:
curl -v -X PUT http://127.0.0.1:8080/plans/{id}/process
or
curl -v -X PUT http://127.0.0.1:8080/plans/{id}/process -H "Content-Type: application/json"
or
curl -v -X PUT http://127.0.0.1:8080/plans/{id}/process -H "Content-Type: text/uri-list"
I got the exact same response:
* Trying 127.0.0.1:8080... * Connected to 127.0.0.1 (127.0.0.1) port 8080 * using HTTP/1.x > PUT /plans/765b7c48-f0e1-402b-9bd1-74448fd1a93d/process HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/8.13.0 > Accept: */* > < HTTP/1.1 500 < Vary: Origin < Vary: Access-Control-Request-Method < Vary: Access-Control-Request-Headers < Content-Type: application/json < Transfer-Encoding: chunked < Date: Sat, 21 Jun 2025 20:22:55 GMT < Connection: close < {"cause":null,"message":"Must send only 1 link to update a property reference that isn't a List or a Map."}* we are done reading and this is set to close, stop send * abort upload * shutting down connection #0 We got a 500 (Internal Server Error) response here, maybe it should have been 400 (Bad Request)?
For the case where "Content-Type" is not present or its value is not "text/uri-list", perhaps a "410 (Unsupported Media Type)" response would be better?
Multiple-association resources
When I PUT, POST, or PATCH a multi-relational resource (http://127.0.0.1:8080/plans/{id}/items) without a request body, whether there is no Content-Type header or Content-Type: application/json or Content-Type: text/uri-list, the response is always 204 (this phenomenon is also extremely deceptive.):
* Trying 127.0.0.1:8080... * Connected to 127.0.0.1 (127.0.0.1) port 8080 * using HTTP/1.x > PUT /plans/765b7c48-f0e1-402b-9bd1-74448fd1a93d/items HTTP/1.1 > Host: 127.0.0.1:8080 > User-Agent: curl/8.13.0 > Accept: */* > < HTTP/1.1 204 < Vary: Origin < Vary: Access-Control-Request-Method < Vary: Access-Control-Request-Headers < Date: Sat, 21 Jun 2025 20:32:44 GMT < * Connection #0 to host 127.0.0.1 left intact Should we also respond with 410 (Unsupported Media Type) when Content-Type does not exist or its value is not "text/uri-list"?
In addition, considering that the semantics of POST is to create new data, should the response be 400 (Bad Request) if the POST request does not carry a request body?