PUT-Methode (RESTful) funktioniert nicht als eine Möglichkeit zur Aktualisierung von Ressourcen
Laut diesem Artikel(http://restcookbook.com/HTTP%20Methods/put-vs-post/), SETZEN funktionieren soll als Methode zum aktualisieren von Ressourcen.
Jedoch üben Erholsam mit JAX_RS 2.0 und 2.0 Jersey, ich glaube nicht, dass es updates einer bestimmten Ressource.
(I. e. Ich studiere Erholsam mit JAX_RS 2.0 und 2.0 Jersey)
Hier ist eine Ressource wie diese.
<customer>
<name>Before</name>
<postcode>111</postcode>
</customer>
Was ich versuche zu tun, ist zu aktualisieren (vielleicht sollte ich sagen, "ersetzen") diese Ressource.
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target("http://xxx/yyy/zzz/end.cust");
Customer cust = new Customer();
cust.setName("After");
cust.setPostcode(222);
target.path("Before").request().put(Entity.xml(cust));
@Id-annotation auf "Name" in der "Customer" - Klasse, sodass der Pfad "Vor" funktionieren soll, wie die ID und die erste Ressource (mit der Bezeichnung "Vorher") sollten ersetzt werden mit der zweiten Ressource (mit der Bezeichnung "Nach").
Jedoch nach der Codierung oben ausgeführt, der "Vor" - Ressource, die noch bleibt, und es ist eine neue "Danach" resrouce.
Es scheint, dass die PUT-Methode gearbeitet, um eine neue Ressource erstellen, anstatt die Aktualisierung etwas.
(d.h. Es sind sowohl "Vor" und "Nach" Ressourcen, und nichts aktualisiert wurde)
Getestet habe ich eine POST-Methode, um eine neue Ressource erstellen, und es entstand eine neue Ressource, als ich erwartet hatte.
Wenn Sie sehen, was ich falsch mache oder was getan werden muss, könnten Sie bitte ein paar Ratschläge geben?
Bearbeiten
Werde ich hinzufügen, die server-Seite code. Die Methode annotiert mit @LEGEN Sie ist wie diese.
@PUT
@Path("{id}")
@Consumes({"application/xml", "application/json"})
public void edit(@PathParam("id") String id, Customer entity) {
super.edit(entity);
}
Dies ist innerhalb einer Klasse aufgerufen CustomerFacadeREST.java automatisch erstellt, nachdem ich erstellte eine "Rest-Dienst aus der Datenbank".
Laut NetBeans' document, super.edit () - Methode ist ursprünglich wie diese.
public void edit(T entity) {
getEntityManager().merge(entity);
}
In der "Customer" - Klasse, @Id wird festgelegt, um die "name" - Wert in dieser Weise.
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 80)
@Column(name = "Name")
private String name;
//Other fields, such as Postcode...
public Customer() {
}
//Other constructors and methods...
}
- Wo ist Ihre Anfrage Verarbeitung-code?
- Fügen Sie Ihrem server-side code. Es scheint, dass es nicht zulässt, Sie ändern die
<name/>
tag. - >Smutje, ich fürchte, ich bin nicht sicher, was Sie genau damit gemeint ist, request-Verarbeitung code. Hat es etwas zu tun mit request()?
- >carlspring, ich habe einige Teile der server-Seite code. Ich hoffe, dass Sie hilfreich sein wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Idee, die hinter "HTTP-Verben" wie PUT, GET, POST, DELETE sind nur eine Frage der Protokoll-Semantik. Nur die Durchführung einer HTTP-PUT-Vorgang nicht tun, etwas Magisches. Es ist nur die richtige Semantik wir als Entwickler sollten verstehen, während der Entwicklung, als diese Semantik allen bekannt (das ist, warum existieren Protokolle). Wenn niemand folgte dieser Semantik, dann wäre die Welt irgendwo zwischen der Großen Depression und der Apokalypse.
Dass gesagt wird, diese Verben (Semantik) sind eine Art von Garantie (oder vielleicht auch die Qualitätssicherung ist ein besseres Wort) an den client, der die Anforderung durchführt, die mit einem bestimmten verb haben einige wissen-Semantik um es. Ein wesentlicher Faktor ist die Idee, idempotenz. Idempotenz ist die Idee, dass, egal wie viele Male ich einen Antrag stellen, das Ergebnis wird das selbe (oder die gleiche Wirkung haben).
Bestimmte HTTP-Verben sind, sagte idempotent, wie PUT, DELETE, GET. Egal wie oft machen die genau die gleiche Anfrage, die Allgemeine Idee ist, dass das Ergebnis/Effekt sollte der gleiche sein. POST auf der anderen Seite wird gesagt, um nicht werden idempotent, als der exakt gleiche POST-Anforderung können unterschiedliche Ergebnisse erzeugen, beispielsweise eine Bestellung aufzugeben, zu Unrecht, erneut, oder erstellen Sie eine neue Kunden-doppelt.
Wenn wir wollen, um die Welt zu einem besseren Ort, und tragen unseren Teil bei der Rettung der Welt von einer kompletten Kernschmelze, sollten wir lernen, diese Semantik und gute Bürger sein, indem Sie Ihnen zu Folgen. Es gibt eine Menge mehr zu lernen, über die verb-Semantik, als nur idempotenz, aber verstehen, dass viel, ist ein guter Anfang. Ich würde vorschlagen, vielleicht picking up ein gutes Buch in RUHE zu lernen, einige gute Praktiken. Oder wenn Sie wollen, Sie wollen ein Kind, nehmen Sie sich Zeit, die Bibel zu Lesen (eigentlich die Fielding Dissertation).
Alle, dass gesagt wird, es ist unsere job als Entwickler code zu erstellen der Folgen dieser Semantik. Der Grund, Ihre Methode ist das erstellen einer neuen Ressource, ist wahrscheinlich, weil Sie sind erstellen Sie eine neue Ressource mit dem code. Vielleicht so etwas wie dieses würde scheinen besser geeignet:
Also sind wir nur aktualisieren Sie die Kunden, die bereits in unserer Datenbank. Normalerweise mit einer PUT-Anfrage zu aktualisieren, die insbesondere Kunden Ressourcen-URI bekannt sein sollte. So sagen die client stellt eine Anfrage an
http://blah.com/api/customers/1234
unser service wird den Kunden mit der id1234
. Wenn es nicht gefunden werden kann, kehren wir ein404
status-code, da die Ressource nicht existiert. Wenn es vorhanden ist, dann aktualisieren wir den Kunden mit dem Kunden zur Verfügung gestellten Daten in die Anfrage. Wenn Sie wollten, um einen neuen Kunden erstellen, wo die URI ist nicht bekannt, dann POSTEN wäre korrekt, und Sie würde senden Sie eine Kunden-Vertretunghttp://blah.com/api/customers
.Halten auch nur ein FYI: in vielen Fällen, in einem Fall wie diesem, was passiert ist, dass die client-Anfragen (GET) eine Ressource, sagen Sie einem Kunden, und updates, die von Kunden Darstellung, dann schicken Sie es zurück, wie PUT-Anfrage mit dem Kunden aktualisiert. Auf dem sever werden soll, dass die Informationen zu aktualisieren, die insbesondere die Daten seiner Kunden, wie Sie sehen können aus dem Beispiel oben.
UPDATE
Pro Ihre Bearbeiten. Sie sind völlig fehlt der Punkt, wie das funktionieren soll.
Was falsch mit diesem ist, dass mit dem neuen
Customer
bestimmen Sie die Kennung"After"
, die sich von der Kennung in der Anforderung Weg, Sie sind mit"Before"
. Also die path-variable{id}
ist "Vor". Mit diesem request-URI Sie sagen, dass Sie möchten, um Zugriff auf die Kunden-id "Vor". Wie in meinem code, es ist Ihre Pflicht zu prüfen, ob ein Kunde mit der id "Vor" in der Datenbank vorhanden. Wenn nicht, sollten Sie Sie wieder zurück404 Not Found
. Diename
(id), die Sie für die neueCustomer
sollte die id dürfte in der Datenbank. Also, wenn Sie aktualisieren möchten den Kunden mit der id in der Datenbank "Nach". dann sollten Sie "Nach" in den Pfad statt "Vor". Wir sollten nicht versuchen, und ändern Sie die id.Wie ich schon sagte, wenn wir möchten, aktualisieren Sie eine Ressource, die wir normalerweise, BEKOMMEN die Ressource, Aktualisierung einiger Felder (aber nicht die id), und senden Sie es zurück. Eine Sequenz könnte so Aussehen
Wir verwenden die gleiche id, wie uns zur Verfügung gestellt wurden, in den Weg, denn das ist, wie die Ressource identifiziert, die in der server.
{id}
existieren in der DB, wenn nicht, ja wieder zurück schicken 404, wenn es vorhanden ist, dann diemerge
es aktualisieren solltenhttp://stackoverflow.com/questions/27314049
.27314049
ist wahrscheinlich die Datenbank-id für diese Frage. Namen sind Häufig, und es gibt viele Duplikate, deshalb name Datenbank-ids sind nicht gut. In ansteigender Zahl könnte besser sein.