1. Ich möchte eine neue Ressource mit POST unter / users {“name” erstellen: “Mr. Woods “,„ Alter “: 29}
  2. Ich habe keinen Ausweis in der Anfrage.

  3. Der Server würde eine neue Ressource mit einer automatisch generierten ID erstellen (sogar dieselben Daten existieren mit einer anderen ID, wie es vorgesehen ist), z. B. 1234

  4. Der neue Ressourcenspeicherort / users / 1234 muss in der Antwort zurückgegeben werden

  5. Soll ich jetzt einfach die neue ID als Rückgabewert in der Antwort oder die neue ID in der Eingabeanforderung zurückgeben und die gesamte Entität zurückgeben? { "Id": 1234, "Name": "Mr. Wald", "Alter": 29 }}

  6. Wenn eine Anfrage POST / Benutzer trifft, aber bereits eine ID in der Eingabe angegeben ist, müssen wir überprüfen, ob diese Null ist, bevor wir eine neue erstellen? Was wäre der HTTP-Antwortcode in diesem Fall, wenn eine ID in der Eingabe vorhanden ist?

0
IndoKnight 23 Juni 2018 im 14:19

3 Antworten

Beste Antwort

Soll ich jetzt einfach die neue ID als Rückgabewert in der Antwort oder die neue ID in der Eingabeanforderung zurückgeben und die gesamte Entität zurückgeben? {"Id": 1234, "name": "Mr. Woods “,„ Alter “: 29}

Eine erfolgreiche Rest POST -Anforderung muss nicht unbedingt über einen Antworttext verfügen. Insgesamt handelt es sich dabei um genau dieselben Daten, die in der Anforderung + der erstellten ID angegeben sind.
Eine 201 Created Antwort, die in location header den URI der erstellten Ressource enthält, scheint in Ordnung zu sein.

Dies bedeutet nicht, dass es verboten ist, einen Text in der POST-Antwort festzulegen, sondern dass Sie ihn nur festlegen sollten, wenn er einen Mehrwert für den Client bietet.
Angenommen, die Ressourcenerstellung ändert möglicherweise die vom Client bereitgestellten Daten (Bereinigung, Berechnungen usw. für ...). Es könnte sinnvoll sein, die Ressource in der Textantwort festzulegen.

Wenn eine Anfrage POST / Benutzer trifft, aber bereits eine ID in der Eingabe angegeben ist, müssen wir überprüfen, ob diese Null ist, bevor wir eine neue erstellen? Was wäre der HTTP-Antwortcode in diesem Fall, wenn eine ID in der Eingabe vorhanden ist?

Dies hängt davon ab, wie sich Ihre Rest-Services verhalten sollen:

  • Entweder entscheiden Sie, dass die Aktualisierung mit POST zulässig ist: In diesem Fall erstellen Sie die Ressource, wenn die ID null lautet, und wenn sie nicht null ist, aktualisieren Sie die Ressource, und wenn dies alles der Fall ist Gut, Sie könnten 202 Accepted zurückgeben.
  • Oder Sie entscheiden, dass die Aktualisierung mit POST nicht zulässig ist. In diesem anderen Fall geben Sie eine Fehlerantwort wie 400 Bad Request zurück, wenn die ID nicht null lautet.
1
davidxxx 23 Juni 2018 im 11:37

Ich würde Spring Hateoas verwenden (https://spring.io/projects/spring-hateoas). und ich würde ein Objekt wie dieses erstellen:

public class User extends ResourceSupport {
    private Long id;
    private int age;
    private String name;
    //Setter and getter and eventually hashCode and equals
}

Dann würde ich in einem Controller eine Methode wie diese verwenden:

@RequestMapping(value="/users", method={RequestMethod.POST}, produces="application/json")
public ResponseEntity<User> managePerson(@RequestBody User p)
{
  if(p.getId() != null)
  {
    //Update; in this case a 204 http status is enough and no content is required
   Return ResponseEntity.status(HttpStatus.NO_CONTENT).body(null);
  }
  else
  {
   //Save and return the saved objecty with the returned ID and set the new location
   p.add(new Link("/users/"+p.getId()));
   Return ResponseEntity.status(HttpStatus.OK).body(p);
  }

}
1
Karl Richter 23 Juni 2018 im 16:13

Ich habe keinen Ausweis in der Anfrage.

Du brauchst KEINEN. Sie können dazu einfach das Db-SDK verwenden.

Der neue Ressourcenspeicherort / users / 1234 muss in der Antwort zurückgegeben werden

Es wäre besser, das hypermediengesteuerte System HATEOS zu machen

Soll ich jetzt einfach die neue ID als Rückgabewert in der Antwort oder die neue ID in der Eingabeanforderung zurückgeben und die gesamte Entität zurückgeben? {"Id": 1234, "name": "Mr. Woods “,„ Alter “: 29}

Wie ich bereits sagte, ist es gut, die vollständigen Hypermedia-Informationen zurückzugeben, damit die Kunden sie ohne weitere Änderungen weiterleiten können, um erholsame Anfragen zu stellen

{
    "id": 1234,
    "name": "Mr.Woods",
    "age": 29,
    "address": "/1234/address",
    "some-param": "/path-to-the-resource"
}

Wenn eine Anfrage POST / Benutzer trifft, aber bereits eine ID in der Eingabe angegeben ist, müssen wir überprüfen, ob diese Null ist, bevor wir eine neue erstellen?

Idealerweise sollten Sie es validieren, wenn Sie die HTTP -Spezifikationen befolgen. Post sollte immer zur Erstellung von Ressourcen führen. Es geht jedoch nur darum, die Spezifikation zu befolgen. Nichts hält Sie davon ab, wenn Sie Ihren POST idempotent machen möchten

0
Yati Sawhney 23 Juni 2018 im 11:34