2013-06-16 6 views
7

Как получить объект ответа после отправки Restangular POST?Получение ответа от restangular POST

firstAccount.post("Buildings", myBuilding).then(function() { 
    console.log("Object saved OK"); 
}, function() { 
    console.log("There was an error saving"); 
}); 

Я пытаюсь получить новый идентификатор объекта.

Спасибо.

ответ

17

Я являюсь создателем Restangular. Флим прав :).

В обещание, то вы получите объект, возвращаемый с сервера :)

firstAccount.post("Buildings", myBuilding).then(function(addedBuilding) { 
    console.log("id", addedBuilding.id); 
}, function() { 
    console.log("There was an error saving"); 
}); 

Спасибо!

+1

вы уверены, что это фактический ответ? У меня есть конечная точка api, которая возвращает разные данные, чем отправленные. на promisse я получаю те же данные, что и отправленные на 'post', в том числе рестанговые методы и все. –

+0

Эй. Метод restangular действительно добавляется ко всем ответам сервера. Это часть того, что делает его замечательным. Все ваши объекты, которые вы получаете, улучшены для использования с Restangular. Если ваш пост фактически ничего не возвращает с сервера, я фактически возвращаю тот же объект, который вы разместили, чтобы вы что-то получили. Поэтому, если вы получаете точно такие же данные, которые вы публикуете, убедитесь, что вы возвращаете данные с сервера OK. – mgonto

+0

Я заметил это, потому что api возвращает данные в другом формате, чем тот, который он получает. Пример: он получает '{'category': 'asd'}' и возвращает '{category: {id: 1, name: 'asd'}'. Он работал над ngResource, но когда я перешел на рестанг, приложение было нарушено, потому что ответ пришел как '{'category': 'asd'}'. –

2

Я не работал с Restangular напрямую, но ваш POST, вероятно, должен вернуть объект JSON с идентификатором. Затем ваша функция успеха должна принять его как параметр.

firstAccount.post("Buildings", myBuilding).then(function(resp) { 
    console.log(resp.id); // if the JSON obj has the id as part of the response 
}); 
0

Отремонтированный POST будет ожидать того же объекта в ответе, что и тот, который был отправлен.

Это ясно видно с помощью машинописных определений. Предположим, у нас есть метод, который будет получать объект типа ITypeA, и он будет POST его в URL-адресе, например http://whatever/api/objects. Предположим, что REST api возвращает 201, а также json с объектом ответа, который может быть одним и тем же OR DEFFERENT. В нашем случае предположим, что возвращаемый тип будет ITypeB. Тогда наш restangular не сможет использовать стандартный POST ITypeA и ожидать ответа от ITypeB, поэтому следующий код будет неправильным, так как ожидается, что restangular получит ответ типа ITypeA (то же, что и тот, который был отправлен).

public postAnObject(objectToPost: models.ITypeA): ng.IPromise<models.ITypeB> { 
    return this.restangular.all("objects") 
      .post<models.ITypeA>(objectToPost) 
      .then((responseObject: models.ITypeB) => { 
       return responseObject; 
      }, (restangularError: any) => { 
       throw "Error adding object. Status: " + restangularError.status; 
      }); 
} 

Это может быть решена с помощью customPOST, поэтому приведенный выше код будет правильно так:

public postAnObject(objectToPost: models.ITypeA): ng.IPromise<models.ITypeB> { 
    return this.restangular.all("objects") 
      .customPOST(objectToPost) 
      .then((restangularizedObjectTypeB: restangular.IElement) => { 
       return restangularizedObjectTypeB.plain(); 
      }, (restangularError: any) => { 
       throw "Error adding object. Status: " + restangularError.status; 
      }); 
} 

Есть несколько вещей, чтобы заметить, в итоге:

  1. Restangular can получить объект ответа в успешном обратном вызове (then часть)
  2. Если использование метода .post(objectA) restangular будет ожидать, если таковые имеются, успешного обратного вызова с ответом того же типа, что и объект A.
  3. Если вы хотите опубликовать Objecta но получить ответ objectB (различные виды), а затем использовать метод .customPOST(objectA)
  4. ВАЖНОЕ: ответ на самом деле является «restangularized» объект, который оборачивает «реальный» объект ответа. Это означает, что ответ содержит некоторые рестатулярные методы. Если вы просто хотите, чтобы объект ответа вызова метода .plain() на ответ, как показано на втором примере, где ответ на самом деле не ITypeB объект, а restangular.IElement
Смежные вопросы