从 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
没问题,但是,我怎样才能检索到 Response
的 String
包含?
这就是我想大致做的事情:
接收方:
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);
}
简而言之,我把问题简化了很多。我正在调用此代码,收到状态为 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
没问题,但是,我怎样才能检索到 Response
的 String
包含?
这就是我想大致做的事情:
接收方:
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);
}