从JAX-RS响应中检索字符串

时间:2017-03-29 13:01:28

标签: java request jax-rs response

简而言之,我简化了问题很多。我正在调用此代码,并收到状态为200(OK)的响应:

Receiver.java

Response response = componentInstanceService.getResource(componentResourceType);

但是,我不知道如何从此方法中检索正文中包含的字符串:

Sender.java:

  @Override
    public Response getResource(ComponentResourceType resourceType) {
        String path = getPath();
        return Response.ok(this.getClass().getResourceAsStream(path)).build();
    }

请注意,只要Response没问题,类之间的通信就可以正常工作了,但是,如何检索String包含的Response

这是我想粗略地做的事情:

接收方:

String result = componentInstanceService.getResource(componentResourceType);

2 个答案:

答案 0 :(得分:1)

如果你想从身体中读取字符串,只需使用

String result = componentInstanceService.getResource(componentResourceType).readEntity(String.class);

答案 1 :(得分:1)

documentation for Response非常清楚:

  

static Response.ResponseBuilder ok(java.lang.Object entity)

     

创建一个包含表示的新ResponseBuilder。

  

abstract java.lang.Object getEntity()

     

返回响应实体。

换句话说,传递给Response.ok的对象就是实体。您可以使用Response的getEntity()方法检索它。

显然,你需要施展它:

Response response = componentInstanceService.getResource(componentResourceType);
InputStream dataSource = (InputStream) response.getEntity();

然后您可以将文本作为文本阅读。你还没有提到你的文本文件的字符集,所以我假设它是UTF-8:

String result;
try (Scanner scanner = new Scanner(dataSource, StandardCharsets.UTF_8)) {
    result = scanner.useDelimiter("\\z").next();
}

<强>更新

我怀疑这可能发生。您将返回一个原始InputStream,它没有关于它是什么类型的数据的信息。

更改Sender.java以返回DataSource:

@Override
public DataSource getResource(ComponentResourceType resourceType) {
    String path = getPath();
    return new URLDataSource(this.getClass().getResource(path));
}

这样,JAX-RS服务不仅会返回HTTP 200 OK,还会返回与文件直觉类型对应的Content-Type标头。

然后您应该能够使用以下方法调用该方法:

DataSource dataSource = componentInstanceService.getResource(componentResourceType);

String result;
try (Scanner scanner = new Scanner(dataSource.getInputStream(), StandardCharsets.UTF_8)) {
    result = scanner.useDelimiter("\\z").next();
}

实际上有一种更健壮的方式来读取数据源。您可以将其包装在DataHandler中:

DataSource dataSource = componentInstanceService.getResource(componentResourceType);
DataHandler handler = new DataHandler(dataSource);

DataFlavor flavor = DataFlavor.selectBestTextFlavor(
    handler.getTransferDataFlavors());

if (flavor == null) {
    // This should never happen with text files.
    throw new IllegalArgumentException(
        "Data has no flavors capable of supplying text.");
}

String result;
try (Reader reader = flavor.getReaderForText(handler)) {
    StringBuilder s = new StringBuilder();
    int c;
    while ((c = reader.read()) >= 0) {
        s.append((char) c);
    }
    result = s.toString();
} catch (UnsupportedFlavorException e) {
    // Since we started with a flavor provided by the DataHandler,
    // we should never get here.
    throw new RuntimeException(e);
}