http - OSGi 中的 ReSTLet HTTP 问题

标签 http proxy network-programming osgi restlet

我是 ReSTLet 框架(2.08 版)的忠实用户。这就是为什么我目前正尝试在 OSGi 环境中使用 ReSTLet 来完成我论文的实践部分。最后,我创建了一个服务器包(它由我的 Felix OSGi 环境中的 Activator 启动)并显示一条消息作为对像 http://localhost:8888/ 这样的简单调用的响应.

但是我没有成功地从我的 ReSTLet 接收到另一个资源。想象一下,我需要来自 http://localhost:808 0/tripleStore/triple s/5 的数据来计算 http://localhost:8888/的结果测试。 (代码片段如下...)

public void startServer() throws Exception {
   component = new Component();
   Server server = new Server ( Protocol.HTTP, 8888);
   component.getServers​().add(server);
   Client client = new Client (Protocol.HTTP);
   component.getClients​().add(client);

   Restlet restlet = new Restlet() {
      @Override
      public void handle(Request request, Response response) {
         response.setEntity("Container Resource is active!", MediaType.TEXT_PLAIN);
      }
   };

   Restlet restletTest = new Restlet() {
      @Override
      public void handle(Request request, Response response) {
         RdfClientResource cli = new RdfClientResource("http://localhost:808​0/tripleStore/triples/5");
         cli.setFollowingRedi​rects(false);
         Representation repri = cli.get();
         response.setEntity(repri);
      }
   };

   component.getDefault​Host().attach("/cont​ainer",new Sink());
   component.getDefault​Host().attach("/test​",restletTest);
   component.getDefault​Host().attach(restle​t);
   component.getClients​().add(Protocol.HTTP​);
   component.start();
}

目前我收到一个“错误的请求”——当我打电话时出错 http://localhost:808 0/tripleStore/triple s/5 在我的 reSTLet 中,当我调用 http://127.0.0.1:808 时出现“禁止”错误0/tripleStore/triple s/5 来 self 的 ReSTLet。

进一步的研究表明,导致此错误的原因非常简单。 reSTLet 尝试直接从网络代理获取结果,网络代理不知道任何 localhost 并禁止调用 127.0.0.1

另一个关键点是,错误总是可以复制的,除非在一次尝试中。在这种情况下,一切正常。这就是我假设与 OSGi 启动顺序有关的原因。 (这不是固定的,取决于 Sonatype Aether 框架。)

您是否已经意识到这样的错误?你能给我建议任何避免手动尝试所有 OSGi 启动命令的错误修正吗?当我尝试在 OSGi 之外执行这些操作时,一切正常。

提前致谢! 马库斯

最佳答案

你的问题让我想起了我遇到的一个问题。您必须牢记的是,客户端连接器是针对 ReSTLet 引擎自动注册的。这里的问题是捆绑加载中的顺序。

我的问题是关于 HTTPS 连接器的。在尝试添加客户端连接器时,您必须确保提供连接器的包已经加载。否则我会在跟踪中看到类似的东西:

Internal Connector Error (1002) - No available client connector supports the required
protocol: 'HTTPS'. Please add the JAR of a matching connector to your classpath.

也许在添加您的客户端连接器之前,您可以检查加载的包,并在执行您的 REST 请求之前,检查已注册的客户端连接器?

这是查看已注册客户端连接器的代码:

List<ConnectorHelper<Client>> clients = Engine.getInstance().getRegisteredClients();
System.out.println("Connectors - "+clients.size());
for (ConnectorHelper<Client> connectorHelper : clients) {
    System.out.println("connector = "+connectorHelper.getClass());
}

您可以使用 OSGi 包监听器来查看是否加载了必要的包。这是一个代码示例:

// Checking the bundle loading in the future
bundleContext.addBundleListener(new BundleListener() {
    public void bundleChanged(BundleEvent event) {
        if (event.getBundle().getSymbolicName().equals("org.restlet.ext.ssl")
                       & event.getBundle().getState()==BundleEvent.RESOLVED) {
            registerClientConnector();
        }
    }
});

// Checking if the bundle is already present
Bundle[] bundles = bundleContext.getBundles();
for (Bundle bundle : bundles) {
    if (bundle.getSymbolicName().equals("org.restlet.ext.ssl")
              && bundle.getState()==BundleEvent.RESOLVED) {
        registerClientConnector();
    }
}

registerClientConnector 方法只是做类似的事情:component.getClients().add(Protocol.HTTPS);。

希望对你有帮助。不要犹豫,给我一个最小的项目来重现这个问题,这样我就可以提供更准确的帮助。 蒂埃里

关于http - OSGi 中的 ReSTLet HTTP 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6916341/

相关文章:

c - accept() 一直返回 0

java - 从 HttpUrlConnection 对象获取 header

javascript - 跨域脚本javascript请求

java - 如何获取 Java 代理的调用处理程序?

python - 如何让我的简单扭曲代理工作?

networking - 找到校验和

c++ - 无法从 gethostname 访问 IP 地址的内存

HTTP 选项 - 不可缓存?

缺少身份验证的 HTTP 状态代码

node.js - Node.js 中如何处理 'read ETIMEDOUT'?