#rest #backbone.js
#rest #backbone.js
Вопрос:
Я создаю Backbone.js модели, поддерживаемые устаревшим REST API. Когда я создаю новый ресурс на сервере, вместо того, чтобы возвращать JSON вновь созданного ресурса, он возвращает обычный текст идентификатора вновь созданного ресурса вместе с относительным URL в заголовке местоположения, где ресурс может быть получен.
Например, я ПУБЛИКУЮ:
{ "firstName": "Joe", "lastName": "Blow" }
для http://fakeserver.com/people
и (в случае успеха) тело простого / текстового ответа может быть: «1234». Статус ответа равен 201, а заголовок местоположения будет http://fakeserver.com/people/1234
. Если я ПОЛУЧУ URL из этого местоположения, он будет иметь
{ "id": 1234, "firstName": "Joe", "lastName": "Blow" }
Как бы мне переопределить функцию синхронизации в моей модели, чтобы соответствовать этому соглашению вместо значения по умолчанию Backbone.js соглашения?
Чтобы уточнить, нет Backbone.js версии этого пока нет — я пытаюсь создать новую. Старый способ сделать это, основанный только на jQuery, был:
$.ajax({
type: 'POST',
url: submitURL,
data: $.toJSON(person),
success: function(data, status, request) {
showSuccessMessage();
closeDialog();
},
dataType: 'json',
contentType: 'application/json'
});
Детали showSuccessMessage и closeDialog не важны — просто чтобы продемонстрировать, что в основном мы просто игнорируем содержимое ответа и выбрасываем исходный объект.
Комментарии:
1. Пожалуйста, включите Backbone.js код, который вы используете для
POST
доступа к этому серверу.2. Нет Backbone.js версии этого кода пока нет, но публикация на сервер будет работать без переопределения стандартной функции синхронизации. Это просто другая обработка ответа.
3. Затем, пожалуйста, укажите код, который вы используете для обработки ответа.
4. Хорошо, я обновил вопрос, чтобы, надеюсь, прояснить. Старый код для обработки ответа в основном игнорировал ответ (за исключением того, что он был успешным).
Ответ №1:
Обработайте простой текстовый ответ с помощью синтаксического анализа:http://backbonejs.org/#Model-parse
parse : function(response, options){
console.log(response, options);
var data = this.toJSON(): //current model to hash
data.id = response; <- assuming that response is a simple text plain id
return data;
}
Вы также можете использовать sync для перезаписи чего-либо в вызове ajax (это не поддерживается в хэше опций.
http://backbonejs.org/#Model-sync
Комментарии:
1. Я думал об использовании parse, но это также повлияло бы на выборку, верно?
2. да, вы можете использовать параметры, чтобы узнать, что такое запрос, и изменять только в том случае, если это сохранение. Проверьте в консоли Chrome значение параметров.