2016-04-28 4 views
0

Можете ли вы объяснить мне, почему метод DELETE (store.remove() в Edit.js) вызывает 400 Bad request. Другой метод работает хорошо. В заголовке запроса URL-адрес кажется «http://localhost:8080/Diary/rest/notes/22?_dc=1461837327580».Rest DELETE Неверный запрос

Я знаю, что проблема связана с полезной нагрузкой метода DELETE, store.remove() включает идентификатор в качестве полезной нагрузки. Как я могу отключить, что и отправить УДАЛИТЬ метод без тела, потому что ID уже в URL

Отдых Услуги

@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: Магазин

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

Вы можете разместить свой магазин и прокси-конфигурации? – lagnat

ответ

0

Если TestStore - это магазин, который вы используете, я бы предположил, что в вашей проблеме здесь:

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

Я не признаю @DELETE аннотацию, так что я не уверен на 100%, но если ваш контроллер ожидает DELETE, и вы отправляете GET, что может объяснить ошибку 400.

+0

Нет, я изменил DELETE на GET из-за этой проблемы. С GET это работает, но если будет DELETE, это не так. – shagi

+0

Возможно, ошибка с writeAllFields. Вы пытались удалить это, чтобы убедиться, что исправлена ​​проблема удаления? – lagnat

2

У вас не может быть HttpMethod.DELETE с телом.

Это явно не указано в RFC, но некоторые прокси-серверы отклонят тело, если у вас есть один в метод удаления. Spring понижает стандарт и отклонит ваш запрос с Плохой запрос.

Удалите тело, а также ответ, чтобы исправить вашу проблему.

Проверить это для получения дополнительной информации: Is an entity body allowed for an HTTP DELETE request?

Смежные вопросы