У меня есть служба GET JAX-RS, реализованная в Джерси, и я предполагаю, что я хочу, чтобы она возвращала двоичные данные, как мне это сделать?
Следующая служба - это то, что я написал.Он развернут в WebLogic.
@GET
@Path("Get")
public Response get() {
try {
byte[] bytes = Files.readAllBytes(Paths.get("F://test.gz"));
Response.ResponseBuilder responseBuilder = Response.status(200);
return responseBuilder
.header("Transfer-Encoding", "chunked")
.header("Content-Encoding", "gzip")
.header("Content-Type", "application/json; charset=utf-8")
.entity(bytes).build();
} catch (IOException exception) {
// this part is not executed
throw new InternalServerErrorException(exception);
} finally {
// this part is executed
}
}
Я использовал для тестирования такой клиент, как SoapUI, и после долгого ожидания я получил сообщение «java.net.SocketException: Socket is closed» в SoapUI, но я могусм. заголовки ответа, возвращаемые в SoapUI, включая код состояния 200. Данные очень малы (менее 1 КБ), и в сервисе нет исключений.
РЕДАКТИРОВАТЬ
Просто чтобы уточнить, что источник двоичных данных фактически получен через соединение HttpURLConnection от другого сервера X. То есть указанная выше веб-служба должна быть транзитной (прокси-службой).Он должен просто вызвать другой сервис на сервере X с HTTP, а затем вернуть тело ответа (текстовое или двоичное) и все заголовки ответа обратно клиенту.Я обнаружил, что сервер X возвращает данные в двоичном виде, имеет размер 421 байт (именно то, что у меня есть в файле test.gz) и имеет следующие заголовки
Transfer-Encoding = chunked
null = HTTP/1.1 200 OK
Cache-Control = max-age=3600, public
Content-Encoding = gzip
Vary = Accept-Encoding
Date = Thu, 11 Jul 2019 03:59:04 GMT
Content-Type = application/json; charset=utf-8
Я должен просто вернутьдвоичные данные и эти заголовки возвращаются к клиенту.
Я только что обнаружил, что если я не верну "Transfer-Encoding" клиенту, моя проблема исчезнет.Это означает, что я не могу просто вернуть все заголовки обратно клиенту, но быть избирательным.