2016-04-28 11 views
0

Kannst du mir erklären, warum DELETE-Methode (store.remove() in Edit.js) 400 ungültige Anfrage löst. Andere Methode funktioniert gut. In Header-Anfrage URL scheint in Ordnung zu sein "http://localhost:8080/Diary/rest/notes/22?_dc=1461837327580".Rest DELETE Bad Request

Ich weiß, dass das Problem in Payload der DELETE-Methode ist, store.remove() enthält ID als Nutzlast. Wie kann ich deaktivieren, dass und DELETE-Methode ohne Körper schreiben, da ID bereits in URL ist

Erholung Service-

@Path("/notes") 
public class NoteRestService { 
@Context 
private UriInfo uriInfo; 
@Context 
private HttpServletRequest request; 



private NoteDaoImpl noteDao = new NoteDaoImpl(); 
@GET 
@Produces("application/json") 
public String getNotes(){ 
    String login = request.getSession(true).getAttribute("login").toString(); 
    List<Note> notes = noteDao.getUserNotes(login); 
    return new Gson().toJson(notes); 
} 

@POST 
@Consumes("application/json") 
public Response postNote(Note note){ 
    String login = request.getSession(true).getAttribute("login").toString(); 
    note.setUser(login); 
    noteDao.persist(note); 
    URI noteUri = uriInfo.getAbsolutePathBuilder().path(Long.toString(note.getId())).build(); 
    return Response.created(noteUri).build(); 
} 

@PUT 
@Path("{id}") 
@Consumes("application/json") 
public Response updateNote(@PathParam("id") String id,Note note){ 
    String login = request.getSession(true).getAttribute("login").toString(); 
    Note editNote = noteDao.getNote(Long.parseLong(id)); 
    note.setCreated(editNote.getCreated()); 
    note.setUser(login); 
    noteDao.update(note); 
    return Response.ok().build(); 
} 

@DELETE 
@Path("{id}") 
public Response deleteNote(@PathParam("id") String id){ 
    Note note = noteDao.getNote(Long.valueOf(id)); 
    if (note==null){ 
     throw new NotFoundException(); 
    } 
    noteDao.delete(Long.parseLong(id)); 
    return Response.noContent().build(); 
} 
} 

EditController.js

Ext.define('MVC.controller.Edit', { 
extend: 'Ext.app.Controller', 


init: function() { 
    this.control({ 
     'editForm > button#SaveRecord': { 
      click: this.onSaveButtonClick 
     }, 
     'editForm > button#DeleteButton': { 
      click: this.onDeleteButtonClick 
     } 
    }); 
}, 

onSaveButtonClick: function (btn) { 
    //get reference to the form 
    var detailView = btn.up('editForm'); 

    //get the form inputs 
    var data = detailView.getValues(); 

    //see if the record exists 
    var store = Ext.getStore('TestStore'); 
    console.log(data.id); 
    var record = store.getById(data.id); 

    if (!record) { 
     record = Ext.create('MVC.model.Note', { 
      title: data.title, 
      created: new Date(), 
      updated: new Date(), 
      text: data.text 
     }); 
     Ext.MessageBox.alert('Created', data.title); 

     store.insert(0, record); 
     store.sync(); 
     return; 
    } 

    record.set(data); 

    store.sync(); 
    //manually update the record 
    detailView.updateRecord(); 
}, 

onDeleteButtonClick: function (btn) { 

    //get reference to the form 
    var detailView = btn.up('editForm'); 

    //get the form inputs 
    var data = detailView.getValues(); 

    var store = Ext.getStore('TestStore'); 
    var record = store.getById(data.id); 
    store.remove(record); 
    store.sync(); 
} 
}); 

UPD: Shop

Ext.define('MVC.store.TestStore', { 
extend: 'Ext.data.Store', 

requires: [ 
    'MVC.model.Note' 
], 

storeId: 'TestStore', 
model: 'MVC.model.Note', 
autoLoad: false, 
proxy: { 
    type: 'rest', 
    url: 'rest/notes', 
    actionMethods: { 
     create: 'POST', 
     read: 'GET', 
     update: 'PUT', 
     destroy:' DELETE' 
    }, 
    reader: { 
     type: 'json', 
     rootProperty: 'data' 
    }, 
    writer: { 
     type: 'json', 
     writeAllFields: true 
    } 
} 
}); 
+0

Können Sie Ihr Geschäft und Proxy Config posten? – lagnat

Antwort

0

Wenn TestStore das Geschäft ist, das Sie verwenden, würde ich Th schätzen auf Ihr Problem hier ist:

actionMethods: { 
    create: 'POST', 
    read: 'GET', 
    update: 'PUT', 
    destroy: 'GET' 
}, 

ich die @DELETE Annotation nicht erkennen, so dass ich nicht 100% sicher, aber wenn Ihr Controller erwartet DELETE, und Sie senden GET, das könnte den 400 Fehler erklären.

+0

Nein, ich habe DELETE wegen dieses Problems in GET geändert. Mit GET funktioniert es, aber wenn es DELETE gibt, würde es nicht. – shagi

+0

Vielleicht ein Fehler mit writeAllFields. Haben Sie versucht, das zu entfernen, um zu sehen, ob das das Problem behoben hat? – lagnat

2

Sie können kein HttpMethod.DELETE mit einem Körper haben.

Dies ist nicht explizit in der RFC angegeben, aber einige Proxy-Server werden den Körper zurückweisen, wenn Sie eine in einer delete Methode haben. Spring senkt den Standard und lehnt Ihre Abfrage mit einer Bad Request ab.

Entfernen Sie den Körper sowie die Antwort, um Ihr Problem zu beheben.

prüfen diese für weitere Informationen: Is an entity body allowed for an HTTP DELETE request?