2016-07-31 29 views
3

Ich muss meine Java-Server haben eine PUT-Anfrage erhalten Sie einen neuen Benutzer von einer ID und einem json Körper zu schaffen, muss der URI wie sein:RESTful Put-ID und Körper

/usermanagement/user/$id { "name":john, "type":admin } 

Da ich Ich habe eine einfache Java-Klasse erstellt und kann die JSON später mit Jackson in ein POJO konvertieren. Hier ist mein Problem: Wie gebe ich die PUT-Anfrage an, um sowohl die ID als auch den JSON-Body als Parameter zu akzeptieren? Bisher habe ich bekam:

@PUT 
    @Path("{id}") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public String createUser(@PathParam("id") int id){ 
     User user = new User(); 
     User.setId(id); 

     return SUCCESS_MSG; 
    } 

Und das funktioniert, aber ich habe kein Glück gehabt Hinzufügen des JSON Körper und mit der Funktion, die sie analysieren. Ich habe versucht:

public String createUser(@PathParam("id") int id, String body){ 
    return body; 
} 

Es soll den gleichen Eingang JSON zurück, wenn in Postman testen, aber es gibt immer eine „Ressource nicht verfügbar“ Fehler.

Ich denke, da ist etwas offensichtlich, dass ich hier vermisse?

+0

Ich denke, Sie müssen einen undecorated Parameter hinzufügen, um Ihren Körper zu erhalten. 'public String createUser (@PathParam (" id ") int id, String body)' – Tibrogargan

+0

Das ist das erste, was ich ausprobiert habe, es gibt mir immer einen Fehler "Ressource nicht verfügbar" beim Ausführen der Abfrage. – Flopn

+0

Hört sich eher nach einem Bibliotheksfehler als nach Ihrem Code an, aber ich schätze - Entschuldigung – Tibrogargan

Antwort

1

Gemäß den REST-API-Konventionen wird eine POST-Methode für ein URI like/usermanagement/users benötigt. PUT-Methode wird zum Aktualisieren einer vorhandenen Ressource verwendet. Sie können durch diesen wundervollen Artikel gehen, um pragmatische RESTful API zu entwerfen. http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api.

Wenn Sie versuchen, einen neuen Benutzer zu erstellen, warum geben Sie ihm eine ID? Sie müssen die Daten wie Benutzername, Nachname, E-Mail, POST ... POST und lassen Sie das Back-End eine ID (wie eine automatisch inkrementierte ID oder einige UUUID) für diese neue Ressource generieren.

Zum Beispiel in meiner app, verwende ich einen json Körper für eine POST-Anfrage wie folgt:

{ 
    "loginId": "ravi.sharma", 
    "firstName": "Ravi", 
    "lastName": "Sharma", 
    "email":  "[email protected]", 
    "contactNo": "919100000001", 
    "..." : ".." 
    } 

Außerdem Ihre Antwort zurückgeben sollte HTTP-201, nach dem erfolgreichen Erstellung, und es soll eine Position enthalten Header, der auf die neu erstellte Ressource zeigt.

+0

Danke für die Antwort, aber die Spezifikation implizit gesagt, PUT für die Erstellung zu verwenden. Außerdem muss es einen vordefinierten JSON zurückgeben, den ich als statische Variablen fest codiert habe. – Flopn

+0

@Flopn Wenn Sie PUT verwenden, um neue Ressourcen zu erstellen, erlauben Sie Clients implizit, den URI-Bereich zu besitzen. Das kann im Laufe der Zeit problematisch werden, insbesondere wenn Sie Ihre URI-Struktur irgendwie modifizieren möchten, weshalb POST die beste Operation zum Erstellen neuer Ressourcen ist. Sind Sie sicher, dass Sie PUT verwenden möchten, anstatt die Spezifikation zu hinterfragen? – sisyphus

0

Verwenden Sie anstelle von String body eine Klasse mit den Namen der Membervariablen und geben Sie Folgendes ein:

public class User { 
    private String name; 
    private String type; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 
} 

(Dies funktioniert im Frühjahr Boot-Web out-of-box einhüllen von Spring MVC, müssen Sie möglicherweise Jackson Abhängigkeit hinzuzufügen.): Auf dem Controller hinzufügen @RequestBody Annotation, dann Jackson kümmern wird von der Un-Marshaling von JSON String zu Benutzerobjekt.

public String createUser(@PathParam("id") int id, @RequestBody User user){