0

我创建了一个 Jersey 客户端程序来使用返回 XML 的 REST Web 服务。

Client client = Client.create();
WebResource webResource = client.resource("http://xyz:abc/myRestservice/getval");

我使用 webResource get 方法将返回值存储在字符串变量中:

String s = webResource.get(String.class);

我没有错误。但变量“s”显示 null 作为输出:

System.out.println("- "+s);

输出:

- 
Process exited with exit code 0.

当我在本地测试相同的 Web 服务时(使用没有客户端程序的 JDeveloper IDE),它返回值。


更新:

我发现变量“s”由于 Web 服务程序中的异常(如下所述)而显示为空。

Web 服务程序使用不透明 (OracleTypes.OPAQUE) 变量来存储从 ORACLE 数据库中的存储函数检索到的 XMLTYPE 值。然后使用强制转换将 opaque 变量分配给新的 XMLType。这在 JDeveloper IDE 内部 weblogic 服务器中进行测试时以某种方式起作用。但是,当我在远程 weblogic 服务器中部署此 Web 服务并尝试使用客户端程序使用时,它不起作用。我得到一个例外 - “oracle.sql.OPAQUE 不能转换为 oracle.xdb.XMLType”。

我猜很可能是由于远程weblogic服务器中缺少一些jar,但不确定是哪个jar。

4

1 回答 1

1

你快到了。您真正应该做的是获取 ClientResponse.class 而不是 String.class。

这是一个示例:

ClientResponse response = webResource.get(ClientResponse.class);
String responseString = response.getEntity(String.class);

一旦你开始使用这个 jersey rest 客户端,你就会知道每个 REST api 合同的更多信息,你还必须将“requestType”和“responseAccept”设置为 webResource 的一部分。没有它,您最终可能还会遇到其他一些奇怪的错误。

这是另一个示例:

ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
String responseStringXML = response.getEntity(String.class);

在哪里:

请求类型(REST API 在正文中期望的数据格式)是:“application/json”,响应类型(REST API 返回的数据格式)是:“application/xml”

请注意,我使用POST(.post 方法) 而不是 get 因为在正常GET请求中,不需要正文(因此不需要请求类型)。该POST示例仅供参考。对于GET,您仍然需要一个响应类型,类似于:

ClientResponse response = webResource.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
String responseStringXML = response.getEntity(String.class);

我希望这会有所帮助!

于 2014-06-19T02:06:21.127 回答