gpt4 book ai didi

http - OSGi 中的 ReSTLet HTTP 问题

转载 作者:可可西里 更新时间:2023-11-01 16:39:22 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com