Отправить null как значение в ngResource AngularJS

Я использую ngResource AngularJS 1.2.1 и пытаюсь отправить null в качестве значения параметров в запросе PUT. К сожалению, когда он установлен, Angular проигнорирует этот параметр и не отправит его.

Вот пример кода:

var User = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});

Вместо этого Angular проигнорирует content и не отправит ни ключ, ни нулевое значение.

Как я могу заставить Angular отправлять null?


person Hengjie    schedule 11.03.2014    source источник
comment
Почему вы пытаетесь отправить ноль? Все значения параметров отправляются в виде строк, поэтому Angular все равно не сможет их отправить.   -  person Lèse majesté    schedule 04.08.2014
comment
Я отправлял null, потому что мой API имеет конечную точку upsert, поэтому отправка content:null должна вместо этого уничтожить его. Были разные причины компромиссов, которые означали, что upsert предоставляет более чистый API, в отличие от запроса DESTROY.   -  person Hengjie    schedule 11.08.2014


Ответы (2)


Как указал Лезе, тип javascript null не является допустимым значением для параметра URL.

Значение null в JavaScript не совпадает со строкой 'null'. Поэтому, если вы хотите, чтобы ваш URL-адрес выглядел как /comments/123?content=null, просто укажите строку 'null'. Параметры URL не являются JSON, и значение null в javascript не означает то же самое, что и content=null, потому что в последнем случае null будет интерпретироваться любым данным сервером как строковое значение.

Служба Angular $http отфильтровывает нулевые и неопределенные значения в объект params перед созданием с ними URL, потому что не существует стандартизированного способа отправки undefined в качестве «значения» на сервер. Это просто не имеет смысла. Однако, если вы хотите отправить строку типа 'undefined' или 'null', это нормально, но для ее интерпретации требуется реализация на стороне сервера.

Если вы делаете запрос PUT, почему некоторые из ваших данных сериализуются в формате JSON внутри ресурса, а некоторые отправляются через параметр URL? Возможно, код примера просто плохо представлен, но в этом примере вы отправляете запрос PUT с телом ответа {"id": 123} и URL-адресом /comments/123. Разве это не лишнее? Почему вы не отправляете свойство content и данные в строке JSON на сервер? Тогда у него действительно будет искомое значение null, потому что строки JSON могут представлять значение типа null. Кроме того, если вы удаляете/уничтожаете запись, почему вы не используете запрос DELETE, а вместо этого используете псевдоним метода уничтожения с запросом PUT?

Так почему бы не что-то вроде этого? Не знаю, при чем тут User...

var Comment = $resource('/comments/:id', {id: @id}, {
  destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();
person jbielick    schedule 10.08.2014

Комментарии, которые были сделаны после моего вопроса, означают, что null не следует отправлять, поскольку он не может быть правильно инкапсулирован в параметрах HTTP. Однако его можно инкапсулировать в JSON. Зачем кому-то отправлять нулевое значение? Потому что отправка null в конечную точку upsert[1] означает уничтожение. К сожалению, невозможно определить значение по умолчанию для content как null в вызове .destroy().

Ответ, с которым я согласился, был:

var Comment = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT' }
});
var comment = Comment.destroy({id:123, content: null});

Это точно так же, как ответ @jbielick, и он отлично справляется с объяснением причины, по которой он не работает как параметр по умолчанию, но работает, если он был предоставлен как часть входного объекта для JSONify.

  1. Upsert — это слияние слов «вставить» и «обновить».
person Hengjie    schedule 11.08.2014