Restangular POST返回空parentResource,remove请求URL异常求助
remove()路径错误 我在使用Restangular时遇到了一个问题:通过Restangular获取api/vessels列表并取第一个vessel,调用该vessel的post('events', event)方法提交请求,服务器返回填充了id的event对象,但该event的parentResource为空。当调用event.remove()时,请求URL为DELETE api/events/2703,而非预期的DELETE api/vessels/125/events/2703,请问我哪里操作错误?
代码示例:
// GET: api/vessels var vessels = Restangular.all('vessels').getList(); this.vessel = vessels[0]; // POST: api/vessels/125/events this.vessel .post('events', event) .then(event => { // the server returns the same object but with id filled this.vessel.events.push(event); });
这个问题我之前开发时也碰到过,核心原因是服务器返回的event对象只是普通JSON,没有被Restangular关联到父资源(vessel)。
当你调用this.vessel.post('events', event)时,Restangular会发送正确的POST请求到api/vessels/125/events,但服务器返回的响应是纯JSON对象——它没有Restangular资源特有的元数据(比如parentResource、route这些属性),所以这个event只是个普通JS对象,不是Restangular识别的嵌套资源。当你调用它的remove()方法时,Restangular只能用它的id生成最基础的URL,而不知道要带上父资源的路径。
你可以用两种方法解决这个问题:
方法1:手动将返回对象转换为关联父资源的Restangular对象
使用restangularizeElement方法,把服务器返回的原始JSON对象转换成绑定到vessel的Restangular资源:
this.vessel.post('events', event).then(rawEvent => { // 将原始响应对象转换为关联到当前vessel的Restangular资源 const restangularizedEvent = this.vessel.restangularizeElement(rawEvent); this.vessel.events.push(restangularizedEvent); });
这样处理后,restangularizedEvent就会带有parentResource属性,调用remove()时就会生成正确的嵌套URL:DELETE api/vessels/125/events/2703。
方法2:让Restangular自动处理返回对象
在post方法中传入第四个参数,设置restangularize: true,让Restangular自动把响应转换成关联父资源的Restangular对象:
this.vessel.post('events', event, {}, { restangularize: true }).then(event => { this.vessel.events.push(event); });
这里第三个参数是请求配置(可以留空对象),第四个参数是Restangular的选项,开启restangularize后,返回的event就是已经关联到vessel的Restangular资源了。
另外要注意:如果你的Restangular全局配置中已经设置了restangularizeAllResponses: true,那方法2可以省略第四个参数,但通常不建议全局开启,避免不必要的性能开销。
内容的提问来源于stack exchange,提问作者Eduardo Rosostolato

