Нестандартный REST API в Backbone js

#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 значение параметров.