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

Retrieving String from 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 没问题,但是,我怎样才能检索到 ResponseString包含?

这就是我想大致做的事情:

接收方:

String result = componentInstanceService.getResource(componentResourceType);

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

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

documentation for Response 非常清楚:

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

Create a new ResponseBuilder that contains a representation.

并且:

abstract java.lang.Object getEntity()

Return the response entity.

也就是说,你传给Response.ok的object就是实体。您可以使用 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();
}

更新:

我怀疑这可能会发生。您正在 return 原始 InputStream,它没有关于它是什么类型的数据的信息。

将 Sender.java 更改为 return 数据源:

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

这样,JAX-RS服务不仅会returnHTTP 200 OK,还会return一个Content-Typeheader对应的直觉您的文件类型。

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

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);
}