RESTEasy предоставляет ContentType динамически - PullRequest
0 голосов
/ 06 августа 2020

У меня есть клиент RESTEasy (3.6.2.Final) с прокси-интерфейсом, в котором я хочу вызвать WS для загрузки файла. Вызов работает нормально, если я определяю исправление Content-Type, но не работает, если я хочу установить его самостоятельно.

Интерфейс:

@POST
@Path("api/files/upload/")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes()
FileUploadResponse uploadFile(byte[] file);

При создании экземпляра прокси я предоставляю Basi c Аутентификация:

ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(UriBuilder.fromPath("http://..."));
target.register(new BasicAuthentication("username", "password"));
ApiInterface api = target.proxy(ApiInterface.class);

Как этот вызов работает, но Content-Type в заголовке является общим c * / *

Если я добавлю HeaderParam, как это , вызов не выполняется с HTTP 400 (неверный запрос):

@POST
@Path("api/files/upload/")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes()
FileUploadResponse uploadFile(byte[] file, @HeaderParam("Content-Type") String contentType);

Я проверил HTTP-вызов, и Content-Type появляется дважды: один раз как * / *, а другой как «application / pdf» ( тот, который я предоставляю при вызове uploadFile).

Я думал, что могу удалить @Consumes (), так как сам устанавливаю заголовок, но затем я получаю другую ошибку:

java.lang.RuntimeException: RESTEASY004590: You must define a @Consumes type on your client method or interface, or supply a default

Content-Type будет отличаться при каждом моем вызове в зависимости от отправляемого документа. Разве в RESTEasy нет способа определить его как параметр?

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете установить Consumes как подстановочный тип содержимого:

@POST
@Path("api/files/upload/")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes(MediaType.MEDIA_TYPE_WILDCARD)
FileUploadResponse uploadFile(byte[] file);

Это позволит методу принимать любой тип содержимого.

Если важно, какой тип содержимого вы получаем, а затем в своем методе вы можете проверить предоставленный тип:

@POST
@Path("api/files/upload/")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes(MediaType.MEDIA_TYPE_WILDCARD)
FileUploadResponse uploadFile(byte[] file, @Context HttpServletRequest request);

и в методе реализации:

String contentType = request.getHeader("Content-Type");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...