使用 HttpClient 在 war 个文件之间进行通信

Communication between war files using HttpClient

我有两个 war 文件,它们都位于同一台服务器上。 我想在 war2 中使用一些 API war1 礼物。 我被告知要使用 Apache 的 HttpClient,但我不确定如何使用,我想推动正确的方向。

假设 war1 是 api.common-1.53.46.20150305-1042.war 并且我想在包 com.bo.api.common.utilities 下的 class DateFormatter 中调用一个方法 getFormatedDate()

如果您有使用 Restlet 的解决方案,它也足够了。至于现在我正处于项目的开始阶段。

我不会将 Web 服务归类为初学者的概念,因此您可能需要做一些研究,然后才能投入其中并尝试对其进行编码。但是,这是朝着正确方向的推动,就像您要求的那样:http://docs.oracle.com/javaee/6/tutorial/doc/bnayn.html

你不能直接调用方法,但你需要使用 HTTP 从 war 导出一些东西,然后从另一个调用它。

不知道你第一个用的是什么技术war(直接servlet,上面有Restlet之类的框架,SpringMVC,JAX-RS框架,...)但是你需要通过专用 URI 上的 HTTP 方法公开您的方法。

然后可以使用下面的代码从第二个开始调用它war:

ClientResource cr = new ClientResource("http://<same-domain>/war2-rootpath/dateformatter");
Representation repr = cr.put(new StringRepresentation(...));
StringRepresentation sRepr = new StringRepresentation(repr);
String returnedText = sRepr.getText();

我的代码有点笼统,因为你的问题有点含糊;-)

已编辑

我认为您可以使用方法 POST 来创建像 /dates 这样的路径。后者将接受包含数据的有效载荷(时间值),并将 return 格式化日期作为字符串。对应的服务器资源应该是这样的:

public class DateFormatterServerResource extends ServerResource {
    @Post
    public String formatDate(long time) {
        return DateFormatter.getFormatedDate(new Date(time));
    }
}

此服务器资源将附加到您的应用程序的路由器,如下所述:

Router router = (...)
router.attach("/dates", DateFormatterServerResource.class);

希望对您有所帮助。 蒂埃里

我使用 Restlet.

解决了我的问题

我包装了 class 我想公开为 Restlet 资源(这样他就充当了服务器)。

另一方面,我使用 ClientResource 检索(在我的例子中是 Get)我需要的数据。

服务器端:

@Get
public JSONObject getIp(JsonRepresentation j) throws JSONException {
    JSONObject request = j.getJsonObject();
    . . .
}

客户端:

ClientResource cr = new ClientResource("http://localhost:8111/");
Representation repr = cr.get();
. . .