#ajax #http #post #ember.js #put
#ajax #http #Публикация #ember.js #поместить
Вопрос:
Я работаю над Ember.js приложение. У меня есть функция обновления, часть ObjectController.
Функция должна сохранять мою обновленную модель, однако при вызове save();
она отправляет запрос POST, а не запрос PUT. (Протестировано в Chrome.)
Почему это должно произойти? Как я могу убедиться, что запрос PUT отправляется на обновления?
Вот мой код:
customer = this.get('model');
customer.set('name', 'New name');
customer.save();
Для дополнительной справки, когда я регистрирую «dirtyType» с console.log( customer.get('dirtyType') );
надписью «обновлено».
Любая помощь очень ценится!
Обновить
Я скорректировал приведенный выше пример кода, чтобы сделать его более понятным, я НЕ создаю новую модель и не хочу использовать PUT. У меня есть существующая модель, которую мне нужно обновить.
Комментарии:
1. Хорошо, немного больше информации, когда я получаю модель «isNew», это правда. Чтобы обойти это, я установил для «isNew» значение false, и я получаю запрос PUT, который я ожидал…
Ответ №1:
Я не уверен, правильно ли ваше обходное решение в отношении PUT vs POST.
TL; DR PUT должен определять ресурс (по запросу-URI), но мы не делаем этого во время создания, поэтому мы не должны использовать POST. Переопределите создание / сохранение, если вам это нужно для вашего сервера, вместо взлома isNew
свойства, которое может вернуться, чтобы укусить вас.
Поместить
9.6 ПОМЕСТИТЬ
Метод PUT запрашивает, чтобы вложенный объект был сохранен в предоставленном запросе-URI. Если запрос-URI ссылается на уже существующий ресурс, вложенный объект СЛЕДУЕТ рассматривать как модифицированную версию того, который находится на исходном сервере. Если запрос-URI не указывает на существующий ресурс, и этот URI может быть определен как новый ресурс запрашивающим агентом пользователя, исходный сервер может создать ресурс с этим URI. Если создается новый ресурс, исходный сервер ДОЛЖЕН сообщить об этом агенту пользователя через 201 (Созданный) ответ. Если существующий ресурс изменен, должны быть отправлены коды ответа 200 (OK) или 204 (без содержимого), чтобы указать успешное завершение запроса. Если ресурс не удалось создать или изменить с помощью запроса-URI, ДОЛЖЕН быть выдан соответствующий ответ об ошибке, отражающий характер проблемы. Получатель объекта НЕ ДОЛЖЕН игнорировать какие-либо заголовки Content- * (например, Content-Range), которые он не понимает или не реализует, и в таких случаях ДОЛЖЕН возвращать 501 (не реализованный) ответ.
Если запрос проходит через кэш, и URI запроса идентифицирует один или несколько объектов, находящихся в данный момент в кэше, эти записи СЛЕДУЕТ рассматривать как устаревшие. Ответы на этот метод не кэшируются.
Фундаментальное различие между запросами POST и PUT отражается в различном значении запроса-URI. URI в запросе POST идентифицирует ресурс, который будет обрабатывать вложенный объект. Этот ресурс может быть процессом, принимающим данные, шлюзом для какого-либо другого протокола или отдельным объектом, который принимает аннотации. Напротив, URI в запросе PUT идентифицирует объект, вложенный в запрос — агент пользователя знает, какой URI предназначен, и сервер НЕ ДОЛЖЕН пытаться применить запрос к какому-либо другому ресурсу. Если сервер желает, чтобы запрос был применен к другому URI,
Пользовательский адаптер
App.ApplicationAdapter = DS.RESTAdapter.extend({
createRecord: function(store, type, record) {
var data = {};
var serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record, { includeId: true });
//return this.ajax(this.buildURL(type.typeKey), "POST", { data: data });
return this.ajax(this.buildURL(type.typeKey), "PUT", { data: data });
},
updateRecord: function(store, type, record) {
var data = {};
var serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record);
var id = get(record, 'id');
// you could do the same here, but it's even more incorrect
return this.ajax(this.buildURL(type.typeKey, id), "PUT", { data: data });
},
});
Комментарии:
1. Спасибо, что нашли время для уточнения, я полагаю, что прочитал это правильно: в приложении я
POST
обращаюсь к API для создания модели, затем позже я обновляю модель, и когда я сохраняю, я ожидаюPUT
, что будет сделан запрос. Однако этого не происходит.
Ответ №2:
Спасибо вам за всю вашу помощь, ребята, однако я нашел проблему, и это смехотворно глупо.
API, который я использовал, имел новый флаг «is_new», который был добавлен в модель и перезаписывал свойство «isNew».
Заставляя Ember (и меня) сильно запутаться.
Я изменил API, и все хорошо в мире!
Ответ №3:
Если модель была создана с помощью createRecord и, следовательно, имеет isNew == true
и вызывается save()
ожидаемое поведение POST
. Как только запись была сохранена, и она была изменена, и, следовательно isDirty == true
, но isNew == false
тогда save()
будет a PUT
.
Это описано в руководстве по моделям.
Комментарии:
1. Спасибо, Кевин. Запись уже сохранена. Чтобы было ясно, у меня есть список клиентов, я создаю нового клиента и сохраняю. Я знаю, что сохранение сохраняется, потому что я вижу новую запись в базе данных. Затем я перехожу на страницу отдельного клиента, вношу изменения и затем сохраняю. И в этот момент я получаю СООБЩЕНИЕ, а не PUT…
2. Продолжая ваши мысли, @Kevin Bullaughey, нужно ли мне вручную отмечать isNew как false, когда выполняется обещание сохранения createRecord, или это должно происходить автоматически?
3. isNew и IsDirty являются только готовыми свойствами, поэтому вы не можете изменить их вручную. Они должны автоматически обновляться данными ember. Вы уверены, что каким-то образом не создаете новую запись? Или, может быть, вы отправляете данные на свой серверный сервер, но ember считает, что вызов завершается неудачно, и, следовательно, модель не вошла в сохраненное состояние? Что вы получаете, когда смотрите
customer.get('currentState.stateName')
? Если оно было сохранено, оно должно бытьroot.loaded.saved
, но если вы получаетеroot.loaded.created.uncommitted
, значит, вы его еще не сохранили.