【问题标题】:What is the best way to implement kind of getNext on results using REST (restlet)使用 REST (restlet) 在结果上实现 getNext 的最佳方法是什么
【发布时间】:2011-12-11 08:03:41
【问题描述】:

我正在编写一个返回结果的网络服务。这个结果是一些一直在服务器上创建的数据。因此,当客户端请求资源时,我还想给他一个用于下一个查询的 url,他可以执行以获取在服务器上创建的新数据。 例如,客户端可以从以下 url 开始:

http://ip:port/server/{id}/resource

下次他应该使用类似的东西:

http://ip:port/server/{id}/resource/1234

其中 1234 是指向服务器的指针,用于了解客户端已经收到的结果。 所以问题是,我在哪里将 url 返回到下一组结果?它应该在标题中还是在正文中? 我阅读了一些关于使用 url 参数与查询的参考,如果我理解 chaching 我最好使用 uri 而不是查询。 最后一件事,我需要传递请求正文的信息,因此 Web 服务需要 PUT 而不是 GET。 Restlet 示例将不胜感激。

最后一件事,我必须在 url 中有 {id},但没有这样的 uri

 http://ip:port/server

那么用户知道那里的 id 的正确方法是什么? (根据用户 ID 返回结果)。由完全不同的资源分配的 id。

【问题讨论】:

    标签: java http rest restlet put


    【解决方案1】:

    您可以考虑使用条件 GET 的替代方法。在这种方法中,服务器使用 ETag 和/或 Last-Modified 响应标头响应 GET 请求,以指示上次修改资源的时间。在上面的示例中,这将是“1234”。然后,客户端在后续 GET 中将该值提供给与之前相同的 URI,并在 If-None-Match 或 If-Modified-Since 标头中提供该值。

    我有一个使用 Restlet 实现的类似服务,它不断接收更新,同样,客户希望定期获取比他们以前收到的信息更新的信息。我使用 ETag。

    在我的 ServerResource 派生类中,我有这样的代码:

    import org.restlet.data.Tag;
    import org.restlet.representation.Representation;
    import org.restlet.representation.Variant;
    
    public class FooCollectionServerResource extends ServerResource implements FooCollectionResource {
    
        private Tag mResponseTag;
    
        @Override public FooCollection getFooCollection() {
            List<Tag> tags = getRequest().getConditions().getNoneMatch();
            Tag eTag = null;
            if (!tags.isEmpty())
                eTag = tags.get(0);
    
            // might be an empty collection, if there are no new/modified Foos since eTag
            FooCollection result = getFoosSince(eTag); 
    
            mResponseTag = new Tag("1234"); // hardcoded here, but you get the idea
            return result;
        }
    
    
        @Override
        public Representation toRepresentation(final Object source, final Variant target) {
            Representation result = super.toRepresentation(source, target);
            result.setTag(mResponseTag);
            return result;
        }
    }
    

    这里的一个技巧是您不能直接在 getFoo() 方法中设置 ETag 标头值;您必须将它藏在一个字段中并在 toRepresentation() 覆盖中使用它。这是因为在 Restlet 中创建响应表示的时间。

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多