如何以整洁的方式使用Restangular执行特定的无父请求?

时间:2016-03-31 22:01:46

标签: angularjs rest restangular

假设我在/users有一个API端点,在/cars有另一个端点。当然,对其中任何一个的GET请求都将获得所有用户或汽车。现在,GET /users/74/cars应该返回属于用户74的所有汽车。

但是我的应用程序有很多与汽车相关的模型,而不仅仅是用户,因此存在更多的端点,如/shops/34/cars/mechanics/12/cars。为简单起见,我希望所有PUT/PATCH个请求都发送到主/cars端点。

在执行保存时,Restangular将默认对加载项目的端点执行PUT请求。但该端点不存在。

它还提供了一个很好的Restangular.setParentless(['cars'])方法,它会丢弃网址的第一部分。但是,我不想在全球范围内这样做,而是专门针对特定元素。

最新的实际上是全局的,但是将其限制为特定方法,例如:Restangular.setParentless(['cars'], ['PUT'])

周围有类似的东西吗?还是我过度复杂了?

到目前为止,我尝试了一些我不喜欢的东西:

delete car.parentResource;

1 个答案:

答案 0 :(得分:2)

我会推荐https://bugster.forgerock.org/jira/si/jira.issueviews:issue-html/OPENAM-7947/OPENAM-7947.html。自引用链接是一个链接,用于存储项目中应该用于<May 10, 2016 10:21:05 PM IST> <Error> <Deployer> <BEA-149205> <Failed to initia lize the application "my-app-Snapshot" due to error web logic.application.ModuleException: weblogic.management.DeploymentException: [HTT P:101401]The url-pattern WSATCoordinator in web application my-app-Snapshot.war is mapped to multiple Servlets. weblogic.application.ModuleException: weblogic.management.DeploymentException: [ HTTP:101401]The url-pattern WSATCoordinator in web application my-app-Snapshot.war is mapped to multiple Servlets. at weblogic.application.internal.ExtensibleModuleWrapper.prepare(Extensi bleModuleWrapper.java:114) at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(Modu leListenerInvoker.java:100) at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleSta teDriver.java:196) at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleSta teDriver.java:191) at weblogic.application.utils.StateMachineDriver$ParallelChange.run(Stat eMachineDriver.java:83) Truncated. see log file for complete stacktrace Caused By: weblogic.management.DeploymentException: [HTTP:101401]The url-pattern WSATCoordinator in web application my-app-Snapshot.war is mapped to multiple Servlets. at weblogic.servlet.internal.WebAppServletContext.logAndThrowDeploymentE xception(WebAppServletContext.java:1299) at weblogic.servlet.internal.WebAppServletContext.registerServletMapping (WebAppServletContext.java:1620) at weblogic.servlet.internal.WebAppServletContext.registerServletMapping s(WebAppServletContext.java:1497) / GET / PUT等的路径,而不是用于拉取项目的URL。

示例,更新一个用户ID 74的车辆的里程数:

首先,配置Restangular以在每个对象上查找名为“self”的自我链接属性。

DELETE

接下来,打电话来接车。我假设您已经修改了API,以便在每个对象上返回一个名为“self”的属性,该对象具有指向其正确API端点的URL。

RestangularProvider.setRestangularFields({
  selfLink: 'self'
});

我们想为其中一个添加一些里程,然后保存。整个Restangular代码看起来像:

GET /users/74/cars

[
  {
    "id": 12,
    "model": "Camaro",
    "make": "Chevrolet",
    "year": 1969,
    "color": "red",
    "odometer": 67294,
    "license": "ABC12345",
    "self": "/cars/12"
  },
  {
    "id": 14,
    "model": "Gallardo",
    "make": "Lamborghini",
    "year": 2015,
    "color": "black",
    "odometer": 521,
    "license": "XYZ34567",
    "self": "/cars/14"
  }
]

Restangular.one('users', 74).all('cars').getList().then(function(cars){ cars[1].odometer = 613; cars[1].put(); }); 将转到PUT而不是/cars/14。这对于像您这样的应用程序非常有用,它们将模型作为图形而不是严格的分层树。