使用 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();
. . .
我有两个 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();
. . .