我已经解决了这个问题,正如原始海报所希望的那样。所有其他答案实际上都是“无法完成”或“如果您愿意使用选择器弄脏干净的 RESTful API,这是一种方法”
如果你想保持你设想的干净的 API,下面是方法。这也适用于没有扩展的 API,例如 /myservice/mythings/123123 ,其中 123123 是一些动态 ID
创建两个文件:
资源提供者
这样做的目的只是侦听 /data/events 处的所有请求,然后在该虚拟路径上生成一个“资源”,该路径实际上并不存在于 JCR 中。
@Component
@Service(value=ResourceProvider.class)
@Properties({
@Property(name = ResourceProvider.ROOTS, value = "data/events"),
@Property(name = ResourceProvider.OWNS_ROOTS, value = "true")
})
public class ImageResourceProvider implements ResourceProvider {
@Override
public Resource getResource(ResourceResolver resourceResolver, String path) {
AbstractResource abstractResource;
abstractResource = new AbstractResource() {
@Override
public String getResourceType() {
return TypeServlet.RESOURCE_TYPE;
}
@Override
public String getResourceSuperType() {
return null;
}
@Override
public String getPath() {
return path;
}
@Override
public ResourceResolver getResourceResolver() {
return resourceResolver;
}
@Override
public ResourceMetadata getResourceMetadata() {
return new ResourceMetadata();
}
};
return abstractResource;
}
@Override
public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest httpServletRequest, String path) {
return getResource(resourceResolver , path);
}
@Override
public Iterator<Resource> listChildren(Resource resource) {
return null;
}
}
小服务程序
现在您只需编写一个 servlet 来处理来自该路径的任何资源 - 但这是通过处理具有由在该路径上侦听的 ResourceProvider 生成的资源类型的任何资源来完成的。
@SlingServlet(
resourceTypes = TypeServlet.RESOURCE_TYPE,
methods = {"GET" , "POST"})
public class TypeServlet extends SlingAllMethodsServlet {
static final String RESOURCE_TYPE = "mycompany/components/service/myservice";
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
final String [] pathParts = request.getResource().getPath().split("/");
final String id = pathParts[pathParts.length-1];
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
out.print("<html><body>Hello, received this id: " + id + "</body></html>");
} finally {
out.close();
}
}
}